normalize rotation in update_movement

This commit is contained in:
griffi-gh 2024-02-13 00:00:01 +01:00
parent a468e764c3
commit 47839c03aa

View file

@ -1,52 +1,53 @@
use glam::{Vec3, Mat4, Quat, EulerRot, Vec2}; use glam::{Vec3, Mat4, Quat, EulerRot, Vec2};
use shipyard::{Component, View, ViewMut, IntoIter, UniqueView, Workload, IntoWorkload, track}; use shipyard::{Component, View, ViewMut, IntoIter, UniqueView, Workload, IntoWorkload, track};
use std::f32::consts::PI; use std::f32::consts::PI;
use crate::{transform::Transform, input::Inputs, settings::GameSettings, delta_time::DeltaTime}; use crate::{transform::Transform, input::Inputs, settings::GameSettings, delta_time::DeltaTime};
#[derive(Component)] #[derive(Component)]
pub struct FlyController; pub struct FlyController;
pub fn update_controllers() -> Workload { pub fn update_controllers() -> Workload {
( (
update_look, update_look,
update_movement update_movement
).into_sequential_workload() ).into_sequential_workload()
} }
const MAX_PITCH: f32 = PI/2. - 0.05; const MAX_PITCH: f32 = PI/2. - 0.05;
fn update_look( fn update_look(
controllers: View<FlyController>, controllers: View<FlyController>,
mut transforms: ViewMut<Transform, track::All>, mut transforms: ViewMut<Transform, track::All>,
inputs: UniqueView<Inputs>, inputs: UniqueView<Inputs>,
settings: UniqueView<GameSettings>, settings: UniqueView<GameSettings>,
dt: UniqueView<DeltaTime>, dt: UniqueView<DeltaTime>,
) { ) {
let look = inputs.look * settings.mouse_sensitivity * dt.0.as_secs_f32(); let look = inputs.look * settings.mouse_sensitivity * dt.0.as_secs_f32();
if look == Vec2::ZERO { return } if look == Vec2::ZERO { return }
for (_, mut transform) in (&controllers, &mut transforms).iter() { for (_, mut transform) in (&controllers, &mut transforms).iter() {
let (scale, mut rotation, translation) = transform.0.to_scale_rotation_translation(); let (scale, mut rotation, translation) = transform.0.to_scale_rotation_translation();
let (mut yaw, mut pitch, _roll) = rotation.to_euler(EulerRot::YXZ); let (mut yaw, mut pitch, _roll) = rotation.to_euler(EulerRot::YXZ);
yaw -= look.x; yaw -= look.x;
pitch -= look.y; pitch -= look.y;
pitch = pitch.clamp(-MAX_PITCH, MAX_PITCH); pitch = pitch.clamp(-MAX_PITCH, MAX_PITCH);
rotation = Quat::from_euler(EulerRot::YXZ, yaw, pitch, 0.).normalize(); rotation = Quat::from_euler(EulerRot::YXZ, yaw, pitch, 0.).normalize();
transform.0 = Mat4::from_scale_rotation_translation(scale, rotation, translation); transform.0 = Mat4::from_scale_rotation_translation(scale, rotation, translation);
} }
} }
fn update_movement( fn update_movement(
controllers: View<FlyController>, controllers: View<FlyController>,
mut transforms: ViewMut<Transform, track::All>, mut transforms: ViewMut<Transform, track::All>,
inputs: UniqueView<Inputs>, inputs: UniqueView<Inputs>,
dt: UniqueView<DeltaTime>, dt: UniqueView<DeltaTime>,
) { ) {
if inputs.movement == Vec2::ZERO { return } if inputs.movement == Vec2::ZERO { return }
let movement = inputs.movement * 30. * dt.0.as_secs_f32(); let movement = inputs.movement * 30. * dt.0.as_secs_f32();
for (_, mut transform) in (&controllers, &mut transforms).iter() { for (_, mut transform) in (&controllers, &mut transforms).iter() {
let (scale, rotation, mut translation) = transform.0.to_scale_rotation_translation(); let (scale, rotation, mut translation) = transform.0.to_scale_rotation_translation();
translation += (rotation * Vec3::NEG_Z).normalize() * movement.y; let rotation_norm = rotation.normalize();
translation += (rotation * Vec3::X).normalize() * movement.x; translation += (rotation_norm * Vec3::NEG_Z).normalize() * movement.y;
transform.0 = Mat4::from_scale_rotation_translation(scale, rotation, translation); translation += (rotation_norm * Vec3::X).normalize() * movement.x;
} transform.0 = Mat4::from_scale_rotation_translation(scale, rotation_norm, translation);
} }
}