mirror of https://github.com/wayvr-org/wayvr.git
fix openxr recenter
This commit is contained in:
parent
4ed52f0214
commit
e895a61ea0
|
|
@ -1,4 +1,4 @@
|
||||||
use glam::{Affine3A, Quat, Vec3A, vec3a};
|
use glam::{Affine3A, Quat, Vec3, Vec3A, vec3a};
|
||||||
use libmonado::{MndResult, Monado, Pose, ReferenceSpaceType};
|
use libmonado::{MndResult, Monado, Pose, ReferenceSpaceType};
|
||||||
use wgui::log::LogErr;
|
use wgui::log::LogErr;
|
||||||
|
|
||||||
|
|
@ -244,18 +244,33 @@ impl PlayspaceMover {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
pose.position.x += input.hmd.translation.x;
|
let cur_rot: Quat = pose.orientation.into();
|
||||||
pose.position.z += input.hmd.translation.z;
|
let cur_pos: Vec3 = pose.position.into();
|
||||||
|
|
||||||
let forward = input.hmd.transform_vector3a(Vec3A::NEG_Z);
|
let mut stage_offset = Affine3A::from_rotation_translation(cur_rot, cur_pos);
|
||||||
let horizontal_len_sq = forward.x.mul_add(forward.x, forward.z * forward.z);
|
|
||||||
|
|
||||||
// if hmd is so vertical that we can't tell where forward is, don't touch rotation
|
let horiz_hmd_pos = Vec3::new(input.hmd.translation.x, 0.0, input.hmd.translation.z);
|
||||||
if horizontal_len_sq > 1e-8 {
|
|
||||||
let yaw = (-forward.x).atan2(-forward.z);
|
|
||||||
let current_rotation: Quat = pose.orientation.into();
|
|
||||||
|
|
||||||
pose.orientation = (current_rotation * Quat::from_rotation_y(yaw)).into();
|
let fwd = input.hmd.transform_vector3a(Vec3A::NEG_Z);
|
||||||
|
let horiz_len_sq = fwd.x.mul_add(fwd.x, fwd.z * fwd.z);
|
||||||
|
|
||||||
|
let hmd_yaw = if horiz_len_sq > f32::EPSILON {
|
||||||
|
let yaw = (-fwd.x).atan2(-fwd.z);
|
||||||
|
Quat::from_rotation_y(yaw)
|
||||||
|
} else {
|
||||||
|
Quat::IDENTITY
|
||||||
|
};
|
||||||
|
|
||||||
|
let recenter_offset = Affine3A::from_rotation_translation(hmd_yaw, horiz_hmd_pos);
|
||||||
|
|
||||||
|
stage_offset *= recenter_offset;
|
||||||
|
|
||||||
|
let (_, new_rot, new_pos) = stage_offset.to_scale_rotation_translation();
|
||||||
|
|
||||||
|
pose.position = new_pos.into();
|
||||||
|
|
||||||
|
if horiz_len_sq > f32::EPSILON {
|
||||||
|
pose.orientation = new_rot.into();
|
||||||
}
|
}
|
||||||
|
|
||||||
let _ = monado
|
let _ = monado
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue