first pass at snap rotation
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin};
|
use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin};
|
||||||
use bevy::prelude::Gizmos;
|
use bevy::prelude::Gizmos;
|
||||||
@@ -66,6 +67,10 @@ fn setup(
|
|||||||
transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
|
transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
|
||||||
..default()
|
..default()
|
||||||
},));
|
},));
|
||||||
|
|
||||||
|
commands.insert_resource(RotationTimer {
|
||||||
|
timer: Timer::from_seconds(1.0, TimerMode::Once),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum LocomotionType {
|
pub enum LocomotionType {
|
||||||
@@ -78,6 +83,11 @@ pub enum RotationType {
|
|||||||
Snap,
|
Snap,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
struct RotationTimer {
|
||||||
|
timer: Timer,
|
||||||
|
}
|
||||||
|
|
||||||
fn proto_locomotion(
|
fn proto_locomotion(
|
||||||
time: Res<Time>,
|
time: Res<Time>,
|
||||||
mut tracking_root_query: Query<(&mut Transform, With<TrackingRoot>)>,
|
mut tracking_root_query: Query<(&mut Transform, With<TrackingRoot>)>,
|
||||||
@@ -88,6 +98,7 @@ fn proto_locomotion(
|
|||||||
session: Res<XrSession>,
|
session: Res<XrSession>,
|
||||||
views: ResMut<XrViews>,
|
views: ResMut<XrViews>,
|
||||||
mut gizmos: Gizmos,
|
mut gizmos: Gizmos,
|
||||||
|
mut rotation_timer: Option<ResMut<RotationTimer>>,
|
||||||
) {
|
) {
|
||||||
//lock frame
|
//lock frame
|
||||||
let frame_state = *frame_state.lock().unwrap();
|
let frame_state = *frame_state.lock().unwrap();
|
||||||
@@ -134,16 +145,16 @@ fn proto_locomotion(
|
|||||||
position.0.translation += locomotion_vec * speed * time.delta_seconds();
|
position.0.translation += locomotion_vec * speed * time.delta_seconds();
|
||||||
|
|
||||||
//now time for rotation
|
//now time for rotation
|
||||||
let snap_angle = 45.0;
|
let snap_angle = 45.0 * (PI / 180.0);
|
||||||
let smooth_rotation_speed = 0.5 * PI;
|
let smooth_rotation_speed = 0.5 * PI;
|
||||||
let rotation_setting = RotationType::Smooth;
|
let rotation_setting = RotationType::Snap;
|
||||||
match rotation_setting {
|
match rotation_setting {
|
||||||
RotationType::Smooth => {
|
RotationType::Smooth => {
|
||||||
//once again with the math
|
//once again with the math
|
||||||
let control_stick = controller.thumbstick(Hand::Right);
|
let control_stick = controller.thumbstick(Hand::Right);
|
||||||
let rot_input = -control_stick.x; //why is this negative i dont know
|
let rot_input = control_stick.x; //why is this negative i dont know
|
||||||
if rot_input.abs() <= 0.2 {
|
if rot_input.abs() <= 0.2 {
|
||||||
//return;
|
return;
|
||||||
}
|
}
|
||||||
let smoth_rot = Quat::from_rotation_y(
|
let smoth_rot = Quat::from_rotation_y(
|
||||||
rot_input * smooth_rotation_speed * time.delta_seconds(),
|
rot_input * smooth_rotation_speed * time.delta_seconds(),
|
||||||
@@ -166,7 +177,45 @@ fn proto_locomotion(
|
|||||||
}
|
}
|
||||||
RotationType::Snap => {
|
RotationType::Snap => {
|
||||||
//yup even more math i cant remember
|
//yup even more math i cant remember
|
||||||
todo!();
|
|
||||||
|
//get timer
|
||||||
|
match rotation_timer {
|
||||||
|
Some(mut timer) => {
|
||||||
|
//tick the timer
|
||||||
|
timer.timer.tick(time.delta());
|
||||||
|
if timer.timer.finished() {
|
||||||
|
//now we can snap turn?
|
||||||
|
//once again with the math
|
||||||
|
let control_stick = controller.thumbstick(Hand::Right);
|
||||||
|
let rot_input = -control_stick.x;
|
||||||
|
if rot_input.abs() <= 0.5 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let dir: f32 = match rot_input > 0.0 {
|
||||||
|
true => 1.0,
|
||||||
|
false => -1.0,
|
||||||
|
};
|
||||||
|
let smoth_rot = Quat::from_rotation_y(snap_angle * dir);
|
||||||
|
//apply rotation
|
||||||
|
let v = views.lock().unwrap();
|
||||||
|
let views = v.get(0);
|
||||||
|
match views {
|
||||||
|
Some(view) => {
|
||||||
|
let mut hmd_translation = view.pose.position.to_vec3();
|
||||||
|
hmd_translation.y = 0.0;
|
||||||
|
let local = position.0.translation;
|
||||||
|
let global =
|
||||||
|
position.0.rotation.mul_vec3(hmd_translation) + local;
|
||||||
|
gizmos.circle(global, Vec3::Y, 0.1, Color::GREEN);
|
||||||
|
position.0.rotate_around(global, smoth_rot);
|
||||||
|
}
|
||||||
|
None => return,
|
||||||
|
}
|
||||||
|
timer.timer.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => info!("didnt init the rotation timer"),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user