Fix gravity alignment

This commit is contained in:
2025-06-26 14:48:27 -04:00
parent b693ae88ea
commit e198ac3cd0
2 changed files with 29 additions and 9 deletions

View File

@@ -8,14 +8,17 @@ use crate::{
player::{GravityDirection, JumpSpeed, MoveSpeed, PlayerDrag, PlayerForce, PlayerMotion, PlayerVelocity},
tags::Player,
},
utils::{input::get_mouse_delta, rotation::get_alignment_rotation},
utils::{
input::get_mouse_delta,
rotation::{get_alignment_rotation, get_alignment_rotation_preserve_twist},
},
};
pub struct PlayerPlugin;
impl Plugin for PlayerPlugin {
fn build(&self, app: &mut App) {
app.add_systems(PreUpdate, (keyboard_input).in_set(PlayerInputSystems));
app.add_systems(PreUpdate, (keyboard_input, player_look).in_set(PlayerInputSystems));
app.add_systems(Update, (apply_gravity, apply_forces, apply_motion, apply_drag).chain());
app.add_systems(Update, align_with_gravity);
}
@@ -51,8 +54,8 @@ fn apply_gravity(
vel.0 += grav * scale.0 * 9.47 * time.delta_secs();
} else {
let dot = vel.0.dot(grav);
if dot > 0.0 {
vel.0 = vel.0 - dot * grav;
if dot > EPSILON {
vel.0 -= dot * grav;
}
}
}
@@ -124,9 +127,14 @@ fn keyboard_input(
// controller.translation = Some(move_vec * time.delta_secs());
}
fn player_look(mut player: Single<&mut Transform, With<Player>>, mouse_motion: EventReader<MouseMotion>) {
let delta = get_mouse_delta(mouse_motion);
player.rotate_y(delta.x);
fn player_look(
mut player: Single<&mut Transform, With<Player>>,
mouse_motion: EventReader<MouseMotion>,
time: Res<Time>,
) {
let delta = get_mouse_delta(mouse_motion) * -time.delta_secs();
let up = player.up();
player.rotate_axis(up, delta.x);
}
fn align_with_gravity(
@@ -151,9 +159,8 @@ fn align_with_gravity(
return;
};
let cur_up = transform.up();
let grav_up = grav_dir * -1.0;
let desired_rotation = get_alignment_rotation(cur_up, grav_up);
let desired_rotation = get_alignment_rotation_preserve_twist(transform.rotation, grav_up);
transform.rotation = transform.rotation.lerp(desired_rotation, time.delta_secs());
}