From 281b8b6b12a545dc60a85a544689c06fc4f9f18d Mon Sep 17 00:00:00 2001 From: Huon Imberger Date: Sat, 29 Apr 2023 11:02:23 +1000 Subject: [PATCH 01/10] Apply rotation constraints always, not just if there's input --- src/lib.rs | 62 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e5cf90d..dacbab1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -395,35 +395,6 @@ fn pan_orbit_camera( pan_orbit.target_alpha -= delta_x; pan_orbit.target_beta += delta_y; - if let Some(upper_alpha) = pan_orbit.alpha_upper_limit { - if pan_orbit.target_alpha > upper_alpha { - pan_orbit.target_alpha = upper_alpha; - } - } - if let Some(lower_alpha) = pan_orbit.alpha_lower_limit { - if pan_orbit.target_alpha < lower_alpha { - pan_orbit.target_alpha = lower_alpha; - } - } - if let Some(upper_beta) = pan_orbit.beta_upper_limit { - if pan_orbit.target_beta > upper_beta { - pan_orbit.target_beta = upper_beta; - } - } - if let Some(lower_beta) = pan_orbit.beta_lower_limit { - if pan_orbit.target_beta < lower_beta { - pan_orbit.target_beta = lower_beta; - } - } - - if !pan_orbit.allow_upside_down { - if pan_orbit.target_beta < -PI / 2.0 { - pan_orbit.target_beta = -PI / 2.0; - } - if pan_orbit.target_beta > PI / 2.0 { - pan_orbit.target_beta = PI / 2.0; - } - } has_moved = true; } } else if pan.length_squared() > 0.0 { @@ -463,7 +434,38 @@ fn pan_orbit_camera( has_moved = true; } - // 3 - Apply orbit rotation based on target alpha/beta + // 3 - Apply rotation constraints + + if let Some(upper_alpha) = pan_orbit.alpha_upper_limit { + if pan_orbit.target_alpha > upper_alpha { + pan_orbit.target_alpha = upper_alpha; + } + } + if let Some(lower_alpha) = pan_orbit.alpha_lower_limit { + if pan_orbit.target_alpha < lower_alpha { + pan_orbit.target_alpha = lower_alpha; + } + } + if let Some(upper_beta) = pan_orbit.beta_upper_limit { + if pan_orbit.target_beta > upper_beta { + pan_orbit.target_beta = upper_beta; + } + } + if let Some(lower_beta) = pan_orbit.beta_lower_limit { + if pan_orbit.target_beta < lower_beta { + pan_orbit.target_beta = lower_beta; + } + } + if !pan_orbit.allow_upside_down { + if pan_orbit.target_beta < -PI / 2.0 { + pan_orbit.target_beta = -PI / 2.0; + } + if pan_orbit.target_beta > PI / 2.0 { + pan_orbit.target_beta = PI / 2.0; + } + } + + // 4 - Apply orbit rotation based on target alpha/beta if has_moved || pan_orbit.target_alpha != pan_orbit.alpha From 49092fee5f6f857daecbb2ee1d88eb7246b242ae Mon Sep 17 00:00:00 2001 From: Huon Imberger Date: Sat, 29 Apr 2023 11:55:09 +1000 Subject: [PATCH 02/10] Add force_update option --- src/lib.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index dacbab1..8c9ba4b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -145,6 +145,11 @@ pub struct PanOrbitCamera { /// Set to `true` if you want the camera to smoothly animate to its initial position. /// Defaults to `false`. pub initialized: bool, + /// Whether to update the camera's transform regardless of whether there are any changes/input. + /// Set this to `true` if you want to modify alpha/beta/radius/focus directly. + /// This will be automatically set back to `false` after one frame. + /// Defaults to `false`. + pub force_update: bool, } impl Default for PanOrbitCamera { @@ -173,6 +178,7 @@ impl Default for PanOrbitCamera { alpha_lower_limit: None, beta_upper_limit: None, beta_lower_limit: None, + force_update: false, } } } @@ -467,10 +473,7 @@ fn pan_orbit_camera( // 4 - Apply orbit rotation based on target alpha/beta - if has_moved - || pan_orbit.target_alpha != pan_orbit.alpha - || pan_orbit.target_beta != pan_orbit.beta - { + if has_moved || pan_orbit.force_update { // Interpolate towards the target value let t = 1.0 - pan_orbit.orbit_smoothness; let mut target_alpha = pan_orbit.alpha.lerp(&pan_orbit.target_alpha, &t); From f57f063c346ba2f3f0315f370ab647a831070705 Mon Sep 17 00:00:00 2001 From: Huon Imberger Date: Sat, 29 Apr 2023 11:55:23 +1000 Subject: [PATCH 03/10] Update animate example to use force_update --- examples/animate.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/animate.rs b/examples/animate.rs index 0282ff3..548742e 100644 --- a/examples/animate.rs +++ b/examples/animate.rs @@ -45,8 +45,8 @@ fn setup( commands.spawn(( Camera3dBundle::default(), PanOrbitCamera { - // Optionally disable smoothing to have full control over the camera's position - // orbit_smoothness: 0.0, + // Disable smoothing, since the animation takes care of that + orbit_smoothness: 0.0, // Might want to disable the controls enabled: false, ..default() @@ -61,5 +61,8 @@ fn animate(time: Res