openxr: laser pointer smoothing
This commit is contained in:
@@ -316,13 +316,21 @@ impl OpenXrHand {
|
|||||||
.location_flags
|
.location_flags
|
||||||
.contains(xr::SpaceLocationFlags::ORIENTATION_VALID)
|
.contains(xr::SpaceLocationFlags::ORIENTATION_VALID)
|
||||||
{
|
{
|
||||||
let (quat, pos) = unsafe {
|
let (cur_quat, cur_pos) = (Quat::from_affine3(&pointer.pose), pointer.pose.translation);
|
||||||
|
|
||||||
|
let (new_quat, new_pos) = unsafe {
|
||||||
(
|
(
|
||||||
transmute::<Quaternionf, Quat>(location.pose.orientation),
|
transmute::<Quaternionf, Quat>(location.pose.orientation),
|
||||||
transmute::<Vector3f, Vec3>(location.pose.position),
|
transmute::<Vector3f, Vec3>(location.pose.position),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
pointer.pose = Affine3A::from_rotation_translation(quat, pos);
|
pointer.raw_pose = Affine3A::from_rotation_translation(new_quat, new_pos);
|
||||||
|
pointer.pose = Affine3A::from_rotation_translation(
|
||||||
|
cur_quat.lerp(new_quat, session.config.pointer_lerp_factor),
|
||||||
|
cur_pos
|
||||||
|
.lerp(new_pos.into(), session.config.pointer_lerp_factor)
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pointer.now.click = self
|
pointer.now.click = self
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ impl PlayspaceMover {
|
|||||||
state: &AppState,
|
state: &AppState,
|
||||||
monado: &mut Monado,
|
monado: &mut Monado,
|
||||||
) {
|
) {
|
||||||
for (_i, pointer) in state.input_state.pointers.iter().enumerate() {
|
for pointer in state.input_state.pointers.iter() {
|
||||||
if pointer.now.space_reset {
|
if pointer.now.space_reset {
|
||||||
if !pointer.before.space_reset {
|
if !pointer.before.space_reset {
|
||||||
log::info!("Space reset");
|
log::info!("Space reset");
|
||||||
@@ -74,7 +74,7 @@ impl PlayspaceMover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let new_hand =
|
let new_hand =
|
||||||
Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].pose));
|
Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].raw_pose));
|
||||||
|
|
||||||
let dq = new_hand * data.hand_pose.conjugate();
|
let dq = new_hand * data.hand_pose.conjugate();
|
||||||
let rel_y = f32::atan2(
|
let rel_y = f32::atan2(
|
||||||
@@ -131,7 +131,7 @@ impl PlayspaceMover {
|
|||||||
|
|
||||||
let new_hand = data
|
let new_hand = data
|
||||||
.pose
|
.pose
|
||||||
.transform_point3a(state.input_state.pointers[data.hand].pose.translation);
|
.transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation);
|
||||||
let relative_pos =
|
let relative_pos =
|
||||||
(new_hand - data.hand_pose) * state.session.config.space_drag_multiplier;
|
(new_hand - data.hand_pose) * state.session.config.space_drag_multiplier;
|
||||||
|
|
||||||
@@ -159,7 +159,7 @@ impl PlayspaceMover {
|
|||||||
if pointer.now.space_drag {
|
if pointer.now.space_drag {
|
||||||
let hand_pos = self
|
let hand_pos = self
|
||||||
.last_transform
|
.last_transform
|
||||||
.transform_point3a(pointer.pose.translation);
|
.transform_point3a(pointer.raw_pose.translation);
|
||||||
self.drag = Some(MoverData {
|
self.drag = Some(MoverData {
|
||||||
pose: self.last_transform,
|
pose: self.last_transform,
|
||||||
hand: i,
|
hand: i,
|
||||||
@@ -196,8 +196,8 @@ impl PlayspaceMover {
|
|||||||
self.rotate = None;
|
self.rotate = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let y1 = input.pointers[0].pose.translation.y;
|
let y1 = input.pointers[0].raw_pose.translation.y;
|
||||||
let y2 = input.pointers[1].pose.translation.y;
|
let y2 = input.pointers[1].raw_pose.translation.y;
|
||||||
let delta = y1.min(y2) - 0.03;
|
let delta = y1.min(y2) - 0.03;
|
||||||
self.last_transform.translation.y += delta;
|
self.last_transform.translation.y += delta;
|
||||||
self.apply_offset(self.last_transform, monado);
|
self.apply_offset(self.last_transform, monado);
|
||||||
|
|||||||
@@ -121,6 +121,10 @@ pub fn def_point7() -> f32 {
|
|||||||
0.7
|
0.7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn def_point3() -> f32 {
|
||||||
|
0.3
|
||||||
|
}
|
||||||
|
|
||||||
fn def_osc_port() -> u16 {
|
fn def_osc_port() -> u16 {
|
||||||
9000
|
9000
|
||||||
}
|
}
|
||||||
@@ -263,6 +267,9 @@ pub struct GeneralConfig {
|
|||||||
|
|
||||||
#[serde(default = "def_false")]
|
#[serde(default = "def_false")]
|
||||||
pub screen_render_down: bool,
|
pub screen_render_down: bool,
|
||||||
|
|
||||||
|
#[serde(default = "def_point3")]
|
||||||
|
pub pointer_lerp_factor: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GeneralConfig {
|
impl GeneralConfig {
|
||||||
|
|||||||
Reference in New Issue
Block a user