@@ -873,42 +873,19 @@ bool SlimeVRDriver::VRDriver::ExternalHandNearEdgeOfFov(
873873void SlimeVRDriver::VRDriver::UpdateHandCorrectionFromPoses (
874874 bool left_hand, const vr::DriverPose_t &vd_pose,
875875 const vr::DriverPose_t &slimevr_pose) {
876- // VD pose is in room space (from GetRawTrackedDevicePoses). SlimeVR pose is
877- // from protobuf (GetPose()); in tracking space when universe set, else room.
878- // Express both in room, then offset_room = VD - SlimeVR_room.
879- float slimevr_room[3 ];
880- if (current_universe_.has_value ()) {
881- TrackingToRoomPosition (current_universe_.value ().second ,
882- slimevr_pose.vecPosition , slimevr_room);
883- } else {
884- for (int i = 0 ; i < 3 ; i++)
885- slimevr_room[i] = static_cast <float >(slimevr_pose.vecPosition [i]);
886- }
887- float offset_room[3 ];
888- for (int i = 0 ; i < 3 ; i++) {
889- offset_room[i] =
890- static_cast <float >(vd_pose.vecPosition [i]) - slimevr_room[i];
891- if (i == 1 ) offset_room[i] *= config_hand_offset_height_scale_;
892- }
876+ // No conversion: offset = VD - SlimeVR (same space as raw pose swap used).
893877 float alpha = config_hand_offset_ema_alpha_;
894878 if (left_hand) {
895879 if (!hand_offset_left_valid_) {
896880 alpha = 0 .f ;
897881 hand_offset_left_valid_ = true ;
898882 }
899- if (current_universe_.has_value ()) {
900- const auto &trans = current_universe_.value ().second ;
901- double qw = std::cos (trans.yaw / 2.0 );
902- double qy = std::sin (trans.yaw / 2.0 );
903- float delta[3 ];
904- RotateVectorByQuaternion (qw, 0.0 , qy, 0.0 , offset_room, delta);
905- for (int i = 0 ; i < 3 ; i++)
906- hand_offset_left_tracking_[i] =
907- alpha * hand_offset_left_tracking_[i] + (1 .f - alpha) * delta[i];
908- } else {
909- for (int i = 0 ; i < 3 ; i++)
910- hand_offset_left_tracking_[i] =
911- alpha * hand_offset_left_tracking_[i] + (1 .f - alpha) * offset_room[i];
883+ for (int i = 0 ; i < 3 ; i++) {
884+ float delta = static_cast <float >(vd_pose.vecPosition [i]) -
885+ static_cast <float >(slimevr_pose.vecPosition [i]);
886+ if (i == 1 ) delta *= config_hand_offset_height_scale_;
887+ hand_offset_left_tracking_[i] =
888+ alpha * hand_offset_left_tracking_[i] + (1 .f - alpha) * delta;
912889 }
913890 vr::HmdQuaternion_t new_correction =
914891 QuatMultiply (QuatConjugate (slimevr_pose.qRotation ), vd_pose.qRotation );
@@ -919,19 +896,12 @@ void SlimeVRDriver::VRDriver::UpdateHandCorrectionFromPoses(
919896 alpha = 0 .f ;
920897 hand_offset_right_valid_ = true ;
921898 }
922- if (current_universe_.has_value ()) {
923- const auto &trans = current_universe_.value ().second ;
924- double qw = std::cos (trans.yaw / 2.0 );
925- double qy = std::sin (trans.yaw / 2.0 );
926- float delta[3 ];
927- RotateVectorByQuaternion (qw, 0.0 , qy, 0.0 , offset_room, delta);
928- for (int i = 0 ; i < 3 ; i++)
929- hand_offset_right_tracking_[i] =
930- alpha * hand_offset_right_tracking_[i] + (1 .f - alpha) * delta[i];
931- } else {
932- for (int i = 0 ; i < 3 ; i++)
933- hand_offset_right_tracking_[i] =
934- alpha * hand_offset_right_tracking_[i] + (1 .f - alpha) * offset_room[i];
899+ for (int i = 0 ; i < 3 ; i++) {
900+ float delta = static_cast <float >(vd_pose.vecPosition [i]) -
901+ static_cast <float >(slimevr_pose.vecPosition [i]);
902+ if (i == 1 ) delta *= config_hand_offset_height_scale_;
903+ hand_offset_right_tracking_[i] =
904+ alpha * hand_offset_right_tracking_[i] + (1 .f - alpha) * delta;
935905 }
936906 vr::HmdQuaternion_t new_correction =
937907 QuatMultiply (QuatConjugate (slimevr_pose.qRotation ), vd_pose.qRotation );
0 commit comments