diff --git a/src/camera.rs b/src/camera.rs index cafb9fc..a91e1a7 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -42,6 +42,8 @@ impl OrbitalCamera { #[cfg(test)] mod tests { + use std::f32::consts::PI; + use approx::{abs_diff_eq, assert_ulps_eq}; use glam::vec3; @@ -106,4 +108,30 @@ mod tests { } } } + + #[test] + fn test_isometric_camera() { + let camera = OrbitalCamera { + position_yaw: PI / 4., + position_pitch: 0.5f32.sqrt().atan(), + distance: 1.0, + }; + + let s13 = (1.0f32 / 3.).sqrt(); + assert_ulps_eq!(camera.position(), Vec3::splat(s13), max_ulps = 3); + + let tfm = camera.transform(); + let o = tfm.transform_point3(vec3(0., 0., 0.)); + let x = tfm.transform_point3(vec3(1., 0., 0.)); + let y = tfm.transform_point3(vec3(0., 1., 0.)); + let z = tfm.transform_point3(vec3(0., 0., 1.)); + let s16 = (1.0f32 / 6.).sqrt(); + let s12 = (1.0f32 / 2.).sqrt(); + let s23 = (2.0f32 / 3.).sqrt(); + let d = 1.0 - s13; + assert_ulps_eq!(o, vec3(0., 0., 1.), max_ulps = 3); + assert_ulps_eq!(z, vec3(0., s23, d), max_ulps = 3); + assert_ulps_eq!(x, vec3(s12, -s16, d), max_ulps = 3); + assert_ulps_eq!(y, vec3(-s12, -s16, d), max_ulps = 3); + } } diff --git a/src/main.rs b/src/main.rs index 7a1bd77..a04ee6b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -70,7 +70,7 @@ impl MainWindow { fn render(&self, output: &wgpu::Texture) { let camera = OrbitalCamera { position_yaw: PI / 4., - position_pitch: PI / 6., + position_pitch: 0.5f32.sqrt().atan(), distance: 3.0, }; let aspect = {