From e1abb02cb8189670cee9b1578d295c1035da99ae Mon Sep 17 00:00:00 2001 From: PROMETHIA-27 <42193387+PROMETHIA-27@users.noreply.github.com> Date: Thu, 19 Jun 2025 03:27:59 -0400 Subject: [PATCH] Fix character controller jitter (#43) * fix jitter while moving character controller * added transform interpolation to character controller --- src/camera.rs | 6 +++-- src/control/controller_common.rs | 46 +++++++++++++++++--------------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/camera.rs b/src/camera.rs index 9862928..1983dab 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -48,8 +48,10 @@ pub fn plugin(app: &mut App) { app.init_resource::(); app.add_systems(OnEnter(GameState::Playing), startup); app.add_systems( - PreUpdate, - (update, update_ui, update_look_around, rotate_view).run_if(in_state(GameState::Playing)), + RunFixedMainLoop, + (update, update_ui, update_look_around, rotate_view) + .after(RunFixedMainLoopSystem::AfterFixedMainLoop) + .run_if(in_state(GameState::Playing)), ); } diff --git a/src/control/controller_common.rs b/src/control/controller_common.rs index 84b9c8f..def5210 100644 --- a/src/control/controller_common.rs +++ b/src/control/controller_common.rs @@ -125,6 +125,30 @@ pub struct CharacterControllerBundle { movement_factor: MovementSpeedFactor, collision_events: CollisionEventsEnabled, movement_config: MovementConfig, + interpolation: TransformInterpolation, +} + +impl CharacterControllerBundle { + pub fn new(collider: Collider, controls: HeadControls) -> Self { + // Create shape caster as a slightly smaller version of collider + let mut caster_shape = collider.clone(); + caster_shape.set_scale(Vector::ONE * 0.98, 10); + + let config = match controls { + HeadControls::Plane => FLYING_MOVEMENT_CONFIG, + HeadControls::Walk => RUNNING_MOVEMENT_CONFIG, + }; + + Self { + character_controller: Character { up: Dir3::Y }, + collider, + move_input: MoveInput::default(), + movement_factor: MovementSpeedFactor(1.0), + collision_events: CollisionEventsEnabled, + movement_config: config, + interpolation: TransformInterpolation, + } + } } #[derive(Bundle)] @@ -183,25 +207,3 @@ const FLYING_MOVEMENT_CONFIG: MovementConfig = MovementConfig { deceleration_factor: 0.0, }, }; - -impl CharacterControllerBundle { - pub fn new(collider: Collider, controls: HeadControls) -> Self { - // Create shape caster as a slightly smaller version of collider - let mut caster_shape = collider.clone(); - caster_shape.set_scale(Vector::ONE * 0.98, 10); - - let config = match controls { - HeadControls::Plane => FLYING_MOVEMENT_CONFIG, - HeadControls::Walk => RUNNING_MOVEMENT_CONFIG, - }; - - Self { - character_controller: Character { up: Dir3::Y }, - collider, - move_input: MoveInput::default(), - movement_factor: MovementSpeedFactor(1.0), - collision_events: CollisionEventsEnabled, - movement_config: config, - } - } -}