diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2023-10-04 15:43:18 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-10-04 15:43:18 +0200 |
commit | d7bca20359e551b837777ade9cd4eadaf64d5daf (patch) | |
tree | 4160bb82b93eb00378d08b0d80382eda32d58671 /modules/openxr/scene/openxr_hand.cpp | |
parent | 1e544505be34c794d83052ea48ed70702cdec831 (diff) | |
parent | c60ef33175b8e92a7eee56e0766d0edd5d6c7a6d (diff) | |
download | redot-engine-d7bca20359e551b837777ade9cd4eadaf64d5daf.tar.gz |
Merge pull request #82722 from BastiaanOlij/openxr_fix_hand_tracking_issues
OpenXR: Fix small hand tracking issues
Diffstat (limited to 'modules/openxr/scene/openxr_hand.cpp')
-rw-r--r-- | modules/openxr/scene/openxr_hand.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/modules/openxr/scene/openxr_hand.cpp b/modules/openxr/scene/openxr_hand.cpp index bedc8874d6..c48fac8055 100644 --- a/modules/openxr/scene/openxr_hand.cpp +++ b/modules/openxr/scene/openxr_hand.cpp @@ -113,7 +113,7 @@ void OpenXRHand::_set_motion_range() { break; } - hand_tracking_ext->set_motion_range(hand, xr_motion_range); + hand_tracking_ext->set_motion_range(OpenXRHandTrackingExtension::HandTrackedHands(hand), xr_motion_range); } Skeleton3D *OpenXRHand::get_skeleton() { @@ -204,7 +204,7 @@ void OpenXRHand::_update_skeleton() { Quaternion inv_quaternions[XR_HAND_JOINT_COUNT_EXT]; Vector3 positions[XR_HAND_JOINT_COUNT_EXT]; - const OpenXRHandTrackingExtension::HandTracker *hand_tracker = hand_tracking_ext->get_hand_tracker(hand); + const OpenXRHandTrackingExtension::HandTracker *hand_tracker = hand_tracking_ext->get_hand_tracker(OpenXRHandTrackingExtension::HandTrackedHands(hand)); const float ws = XRServer::get_singleton()->get_world_scale(); if (hand_tracker->is_initialized && hand_tracker->locations.isActive) { @@ -243,26 +243,27 @@ void OpenXRHand::_update_skeleton() { // Get our target quaternion Quaternion q = quaternions[i]; + // Get our target position + Vector3 p = positions[i]; + // get local translation, parent should already be processed if (parent == -1) { // use our palm location here, that is what we are tracking q = inv_quaternions[XR_HAND_JOINT_PALM_EXT] * q; + p = inv_quaternions[XR_HAND_JOINT_PALM_EXT].xform(p - positions[XR_HAND_JOINT_PALM_EXT]); } else { int found = false; for (int b = 0; b < XR_HAND_JOINT_COUNT_EXT && !found; b++) { if (bones[b] == parent) { q = inv_quaternions[b] * q; + p = inv_quaternions[b].xform(p - positions[b]); found = true; } } } - // And get the movement from our rest position - // Transform3D rest = skeleton->get_bone_rest(bones[i]); - // q = rest.basis.get_quaternion().inverse() * q; - // and set our pose - // skeleton->set_bone_pose_position(bones[i], v); + skeleton->set_bone_pose_position(bones[i], p); skeleton->set_bone_pose_rotation(bones[i], q); } } |