improve the wrist tracking code when using motion controllers

This commit is contained in:
Mamadou Babaei
2024-08-16 18:00:53 +02:00
parent a238887ac2
commit c132a967f3
@@ -1495,25 +1495,27 @@ bool FSGXRTracker::FImpl::UpdateXRHandTrackingData(
XR_ENSURE(XRLocateHandJointsEXT(OutHandState.HandTracker, &LocateInfo, &OutHandState.Locations));
OutHandState.bReceivedJointPoses = OutHandState.Locations.isActive == XR_TRUE;
if (!!OutHandState.bReceivedJointPoses)
if (!OutHandState.bReceivedJointPoses)
{
static_assert(
XR_HAND_JOINT_PALM_EXT == 0 && XR_HAND_JOINT_LITTLE_TIP_EXT == XR_HAND_JOINT_COUNT_EXT - 1,
"XrHandJointEXT enum is not as assumed for the following loop!");
for (int j = 0; j < XR_HAND_JOINT_COUNT_EXT; ++j)
{
const XrHandJointLocationEXT& JointLocation{OutHandState.JointLocations[j]};
const XrPosef& Pose{JointLocation.pose};
FTransform Transform{ToFTransform(Pose, WorldToMetersScale)};
OutHandState.KeypointTransforms[j] = MoveTemp(Transform);
OutHandState.Radii[j] = JointLocation.radius * WorldToMetersScale;
// velocities would go here
}
return true;
return false;
}
static_assert(
XR_HAND_JOINT_PALM_EXT == 0 && XR_HAND_JOINT_LITTLE_TIP_EXT == XR_HAND_JOINT_COUNT_EXT - 1,
"XrHandJointEXT enum is not as assumed for the following loop!");
for (int j = 0; j < XR_HAND_JOINT_COUNT_EXT; ++j)
{
const XrHandJointLocationEXT& JointLocation{OutHandState.JointLocations[j]};
const XrPosef& Pose{JointLocation.pose};
FTransform Transform{ToFTransform(Pose, WorldToMetersScale)};
OutHandState.KeypointTransforms[j] = MoveTemp(Transform);
OutHandState.Radii[j] = JointLocation.radius * WorldToMetersScale;
// velocities would go here
}
return true;
return false;
}
@@ -1529,17 +1531,18 @@ bool FSGXRTracker::FImpl::GetOpenXRHandTrackingWristTransform(
FXRMotionControllerData MotionControllerData;
XRTrackingSystem->GetMotionControllerData(World, DeviceHand, MotionControllerData);
if (MotionControllerData.bValid)
if (!MotionControllerData.bValid)
{
static constexpr int32_t WristJointIndex = static_cast<int32>(EHandKeypoint::Wrist);
OutTransform = FTransform{
MotionControllerData.HandKeyRotations[WristJointIndex],
MotionControllerData.HandKeyPositions[WristJointIndex]
};
return true;
return false;
}
return false;
static constexpr int32_t WristJointIndex = static_cast<int32>(EHandKeypoint::Wrist);
OutTransform = FTransform{
MotionControllerData.HandKeyRotations[WristJointIndex],
MotionControllerData.HandKeyPositions[WristJointIndex]
};
return true;
}
bool FSGXRTracker::FImpl::GetOpenXRWristTransform(
@@ -1556,44 +1559,44 @@ bool FSGXRTracker::FImpl::GetOpenXRWristTransform(
FRotator TrackerRotation;
const bool bGotTransform = MotionController->GetControllerOrientationAndPosition(
CurrentPlayerControllerIndex, MotionSource, TrackerRotation, TrackerLocation, WorldToMetersScale);
if (bGotTransform)
if (!bGotTransform)
{
const bool bIsRight = DeviceHand == EControllerHand::Right;
const ESGPositionalTrackingHardware TrackingHardware = GetPositionalTrackingHardware();
if (TrackingHardware == ESGPositionalTrackingHardware::Custom)
{
FSGWristTrackingSettings Settings{GetWristTrackingSettings()};
if (bIsRight)
{
TrackerLocation += Settings.TrackingHardwareLocationOffsetRightHand;
TrackerRotation += Settings.TrackingHardwareRotationOffsetRightHand;
}
else
{
TrackerLocation += Settings.TrackingHardwareLocationOffsetLeftHand;
TrackerRotation += Settings.TrackingHardwareRotationOffsetLeftHand;
}
}
FVector WristLocation;
FRotator WristRotation;
const USGHapticGlove* Glove{GetGlove(bIsRight)};
if (!IsValid(Glove))
{
return false;
}
Glove->GetWristLocation(TrackerLocation, TrackerRotation, TrackingHardware,
WristLocation, WristRotation);
OutTransform = FTransform{MoveTemp(WristRotation), WristLocation};
return true;
return false;
}
return false;
const FSGWristTrackingSettings& Settings{GetWristTrackingSettings()};
const bool bIsRight = DeviceHand == Settings.RightHandMotionSource;
const ESGPositionalTrackingHardware TrackingHardware = GetPositionalTrackingHardware();
if (TrackingHardware == ESGPositionalTrackingHardware::Custom)
{
if (bIsRight)
{
TrackerLocation += Settings.TrackingHardwareLocationOffsetRightHand;
TrackerRotation += Settings.TrackingHardwareRotationOffsetRightHand;
}
else
{
TrackerLocation += Settings.TrackingHardwareLocationOffsetLeftHand;
TrackerRotation += Settings.TrackingHardwareRotationOffsetLeftHand;
}
}
const USGHapticGlove* Glove{GetGlove(bIsRight)};
if (!IsValid(Glove))
{
return false;
}
FVector WristLocation;
FRotator WristRotation;
Glove->GetWristLocation(TrackerLocation, TrackerRotation, TrackingHardware,
WristLocation, WristRotation);
OutTransform = FTransform{MoveTemp(WristRotation), MoveTemp(WristLocation)};
return true;
}
bool FSGXRTracker::FImpl::GetWristTransform(