From becb4154ee8e59871a267719fe14b2c7eca03f87 Mon Sep 17 00:00:00 2001 From: numzero Date: Thu, 13 Nov 2025 22:57:20 +0300 Subject: [PATCH] hopefully correct camera --- src/camera.rs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/camera.rs b/src/camera.rs index 6540447..b213a06 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -23,14 +23,22 @@ impl OrbitalCamera { } pub fn transform(&self) -> Mat4 { + // for yaw=0, pitch=0: + // X -> -Z + // Y -> -X + // Z -> Y Mat4::from_translation(vec3(0., 0., self.distance)) - * Mat4::from_euler(glam::EulerRot::ZXZ, 0., PI / 2., -PI / 2.) - * Mat4::from_euler( - glam::EulerRot::ZYZ, - 0., - self.position_pitch, - -self.position_yaw, - ) + * Mat4::from_cols_array_2d(&[ + [0., 0., -1., 0.], + [-1., 0., 0., 0.], + [0., 1., 0., 0.], + [0., 0., 0., 1.], + ]) * Mat4::from_euler( + glam::EulerRot::ZYZ, + 0., + self.position_pitch, + -self.position_yaw, + ) } } @@ -68,7 +76,7 @@ mod tests { #[test] fn test_orbital_camera_forward() { const EPSILON: f32 = 1e-5; - for pitch in [0., 30., 45., 89., 90.] { + for pitch in [0., 30., 45., 89., -30., -45., -89.] { for yaw in [0., 30., 45., 89., 90.] { let camera = camera_deg(yaw, pitch); let pos = camera.position(); @@ -91,6 +99,12 @@ mod tests { abs_diff_eq!(mapped, vec3(0., 0., 1.), epsilon = EPSILON), "origin not mapped to (0, 0, 1): yaw={yaw:?}°, pitch={pitch:?}°, pos={pos:?}, mapped={mapped:?}" ); + + let mapped = tfm.transform_vector3(vec3(0., 0., 1.)); + assert!( + mapped.y > 0., + "up is not up: yaw={yaw:?}°, pitch={pitch:?}°, pos={pos:?}, mapped={mapped:?}" + ); } } }