From cb1c2438378822d2d67820e51b444bdb001f48d9 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sun, 5 Jan 2025 08:18:39 +0100 Subject: [PATCH] [orx-shapes] Fix frame orientation in frames() --- orx-shapes/src/commonMain/kotlin/frames/Frames.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/orx-shapes/src/commonMain/kotlin/frames/Frames.kt b/orx-shapes/src/commonMain/kotlin/frames/Frames.kt index f3d88c55..3e55d4aa 100644 --- a/orx-shapes/src/commonMain/kotlin/frames/Frames.kt +++ b/orx-shapes/src/commonMain/kotlin/frames/Frames.kt @@ -37,7 +37,11 @@ fun frames(positions: List, directions: List = emptyList(), up val forward = (directions.getOrNull(0) ?: (next - current)).normalized val right = (forward cross up).normalized up = ((right cross forward)).normalized - result.add(Matrix44.fromColumnVectors(right.xyz0, up.xyz0, forward.xyz0, current.xyz1)) + val frame = Matrix44.fromColumnVectors(right.xyz0, up.xyz0, -forward.xyz0, current.xyz1) + require(frame.determinant in 0.99..1.01) { + "Initial frame determinant (${frame.determinant}) != 1.0" + } + result.add(frame) } for (i in 1 until positions.size - 1) { @@ -55,9 +59,14 @@ fun frames(positions: List, directions: List = emptyList(), up require(up.length > 0.0) { "`up.length` is zero or NaN in .frames()" } require(right.length > 0.0) { "`right.length` is zero or NaN in .frames()" } + val orientation = Matrix44.fromColumnVectors(right.xyz0, up.xyz0, -forward.xyz0, Vector4.UNIT_W) + require(orientation.determinant in 0.99..1.01) { + "Orientation determinant ${orientation.determinant} != 1.0" + } + val m = buildTransform { translate(current) - multiply(Matrix44.fromColumnVectors(right.xyz0, up.xyz0, forward.xyz0, Vector4.UNIT_W)) + multiply(orientation) } result.add(m)