Skip to content

Commit

Permalink
Reworked geometric algebra. Accesses Basis via get_column.
Browse files Browse the repository at this point in the history
  • Loading branch information
The-Cyber-Captain committed Oct 12, 2024
1 parent f1f71de commit 13660e2
Showing 1 changed file with 15 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -314,17 +314,22 @@ void OpenXRFbBodyTrackingExtensionWrapper::_on_process() {
// with how models are designed, rather than the Meta positions of
// the tips of the clavicles.
if (locations.isActive) {
// Construct a root under the hips pointing forwards
// IE, +z aligns with hips & user's real-world forward.
// (Remaining, however, on the XRorigin / Global XZ plane; root's basis rotated around Y to fit)

// Get the hips transform
Transform3D hips = xr_body_tracker->get_joint_transform(XRBodyTracker::JOINT_HIPS);

// Construct the root under the hips pointing forwards
Vector3 root_y = Vector3(0.0, 1.0, 0.0);
Vector3 root_z = -hips.basis[Vector3::AXIS_X].cross(root_y);
Vector3 root_x = root_y.cross(root_z);
Vector3 hips_left = hips.basis.get_column(Vector3::AXIS_X);
// flatten hips' left (x basis) on to real-world / global ground plane. Normalize.
Vector3 root_x = (hips_left.slide(Vector3(0.0, 1.0, 0.0))).normalized();
Vector3 root_z = root_x.cross(root_y);
// flatten hips' origin on to ground plane.
Vector3 root_o = hips.origin.slide(Vector3(0.0, 1.0, 0.0));
// set the actual root transform
Transform3D root = Transform3D(root_x, root_y, root_z, root_o).orthonormalized();
xr_body_tracker->set_joint_transform(XRBodyTracker::JOINT_ROOT, root);
xr_body_tracker->set_pose("default", root, Vector3(), Vector3(), XRPose::XR_TRACKING_CONFIDENCE_HIGH);

// Distance in meters to push the shoulder joints back from the
// clavicle-position to be in-line with the upper arm joints as
Expand All @@ -333,7 +338,7 @@ void OpenXRFbBodyTrackingExtensionWrapper::_on_process() {

// Deduce the shoulder offset from the upper chest transform
Transform3D upper_chest = xr_body_tracker->get_joint_transform(XRBodyTracker::JOINT_UPPER_CHEST);
Vector3 shoulder_offset = upper_chest.basis[2] * shoulder_z_offset;
Vector3 shoulder_offset = upper_chest.basis.get_column(Vector3::AXIS_Z) * shoulder_z_offset;

// Correct the left shoulder
Transform3D left_shoulder = xr_body_tracker->get_joint_transform(XRBodyTracker::JOINT_LEFT_SHOULDER);
Expand All @@ -344,6 +349,10 @@ void OpenXRFbBodyTrackingExtensionWrapper::_on_process() {
Transform3D right_shoulder = xr_body_tracker->get_joint_transform(XRBodyTracker::JOINT_RIGHT_SHOULDER);
right_shoulder.origin += shoulder_offset;
xr_body_tracker->set_joint_transform(XRBodyTracker::JOINT_RIGHT_SHOULDER, right_shoulder);

// Set tracker pose, velocities, confidence.
// Good to go.
xr_body_tracker->set_pose("default", root, Vector3(), Vector3(), XRPose::XR_TRACKING_CONFIDENCE_HIGH);
}

// Register the XRBodyTracker if necessary
Expand Down

0 comments on commit 13660e2

Please sign in to comment.