move quat rotation to fn
This commit is contained in:
parent
e9fed1940e
commit
8cd901dadc
1 changed files with 13 additions and 6 deletions
|
@ -22,6 +22,17 @@ fn yaw_to_angle(yaw: f32) -> f32 {
|
|||
yaw.powi(3) * FRAC_PI_4
|
||||
}
|
||||
|
||||
fn rotate_point(pt: &Vec3, rot: &Quat) -> Vec3 {
|
||||
// thanks to https://danceswithcode.net/engineeringnotes/quaternions/quaternions.html
|
||||
let [x, y, z] = pt.to_array();
|
||||
let qpt = Quat::from_xyzw(x, y, z, 0.0);
|
||||
// p' = rot^-1 * qpt * rot
|
||||
let rot_qpt = rot.inverse() * qpt * *rot;
|
||||
|
||||
// why does this need to be inverted???
|
||||
-Vec3::from_array([rot_qpt.x, rot_qpt.y, rot_qpt.z])
|
||||
}
|
||||
|
||||
/// The gravity vector points from the cyberbike to the center of the planet.
|
||||
pub(super) fn gravity(
|
||||
mut query: Query<(&Transform, &mut ExternalForce), With<CyberBikeBody>>,
|
||||
|
@ -68,13 +79,9 @@ pub(super) fn falling_cat(
|
|||
) {
|
||||
let (xform, mut forces, mut control_vars) = bike_query.single_mut();
|
||||
let world_up = xform.translation.normalize();
|
||||
let [x, y, z] = world_up.to_array();
|
||||
// turn our "world up" point into a Quat
|
||||
let qup = Quat::from_xyzw(x, y, z, 0.0);
|
||||
// p' = rot^-1 * qup * rot
|
||||
let rot = Quat::from_axis_angle(xform.back(), lean.lean);
|
||||
let rot_qup = rot.inverse() * qup * rot;
|
||||
let target_up = -Vec3::from_array([rot_qup.x, rot_qup.y, rot_qup.z]).normalize();
|
||||
let target_up = rotate_point(&world_up, &rot).normalize();
|
||||
|
||||
let bike_right = xform.right();
|
||||
|
||||
let world_right = xform.forward().cross(world_up).normalize();
|
||||
|
|
Loading…
Reference in a new issue