Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reworked geometric algebra. Accesses Basis via get_column. #219

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

The-Cyber-Captain
Copy link
Contributor

@The-Cyber-Captain The-Cyber-Captain commented Oct 12, 2024

… to 'correct' root and shoulder-tracking bugs respectively.

Root tracker does now point 'forward'. IE +z aligns with hips & user's real-world 'forward' (whilst remaining along, and on, the XRorigin / Global XZ plane). Shoulder trackers also properly pulled back (the previously indicated 7cm) towards upper chest, more aligned with T-pose modelling.

Having now delved a bit deeper into GDE wrappers, variants exposure, etc, I'm going to speculate that basis' unit vectors are, indeed, intended to be accessed via get_column out here - as we're firmly in C++ land still - and that's what initially tripped @m4gr3d up way back when? I've done a quick search of the files in GodotVR repo and couldn't find any others which access 'basis[]' beyond this file which would need addressing.

Primarily fixes #205, & fixes #218, though leaves open discussion still re:

  • the approach of omitting / dropping XR_BODY_JOINT_<#####>SCAPULA_FB data, then correction of XR_BODY_JOINT<#####>_SHOULDER_FB, and techniques employed therein.
  • modifying root at all!

@The-Cyber-Captain
Copy link
Contributor Author

Tested as working here for 4.3-stable and 4.4-dev1 on both Quest2 and Quest3.

Neater code - from a slightly more knowledgeable position and tidied up dev env on my side - than the now discarded #209. Should pass clang* etc too this time around.

*Puts the magic into autoMAGIC that does, as far as my wee storyteller [Film / XR] brain is concerned.

@m4gr3d m4gr3d added the bug Something isn't working label Oct 21, 2024
@m4gr3d m4gr3d requested a review from dsnopek October 21, 2024 13:53
Copy link
Collaborator

@dsnopek dsnopek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

The math changes look correct to me. The basis[i] referring to rows in C++ (versus columns in GDScript) is something that always gets me too. :-) Otherwise, the only other change is constructing the Z-axis of the root basis from the X and Y, as opposed to constructing the X-axis from Y and Z -- this also makes sense to me.

I tested on the Quest 3, and it seemed to be working great!

I only have a couple of notes on the comments and the moving of one line explained below.

Comment on lines 317 to 319
// 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)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment is great! However, I think we could remove all the other comments added in this PR - they don't really add much that isn't already in this comment, or clear from the line of code they are commenting.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @dsnopek . But would you believe it?... Was aiming to update the PR this evening (UK time) after an afternoon working on my project itself... only to discover during that afternoon session that - as I see it - the initial assertion "The Root joint carries no data, so instead place it on the ground under the hips pointing forwards" is erroneous. Or, more accurately, zeroing out the position of root seems inconsistent / illogical when the reference play area is set to LOCAL (aka XR_PLAY_AREA_SITTING).

The new Root orientation (pointing real-world forward, and parallel to real-world ground) is good, but I believe the original position should actually be maintained. This way, when switched to LOCAL, Root doesn't magically teleport up to Head, but maintains its location in tracker-space: being found where the ground would be, between the two feet. [Exactly where all the good stuff, avatar control, and skeleton modifications happen to be in my project!]

A quick-and-dirty hack locally to comment out the 'slide', then rebuild, seems to confirm this indeed works better for all play area modes. Is that also your understanding of how Root should behave, and therefore the functionality I should tidy up and include in my new commit for review?

TL;DR - New Root orientation good. But origin should be copied over from the original Tracker itself?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps. It'd be great if @Malcolmnixon could give his opinion - it's his original code that based the root position on the hips, rather than using the root tracker.

Comment on lines 353 to 355
// Set tracker pose, velocities, confidence.
// Good to go.
xr_body_tracker->set_pose("default", root, Vector3(), Vector3(), XRPose::XR_TRACKING_CONFIDENCE_HIGH);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I don't like this line being moved to the end. I think it was better back up where the code calculates root. Also, like I said above, these comments don't really say anything that isn't clear from this line of code.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy that. I was kinda having to figure everything out from first principles - purely to rectify the broken SHOULDER joints I was experiencing - so things are / were a bit verbose, yes. Agreed.

Copy link
Collaborator

@dsnopek dsnopek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

The code clean up looks mostly good to me! (There's still one new comment - called out below - that I don't think adds anything and could be removed)

But I'm not sure about the change in the root origin calculation. I think it'd be best to hear what @Malcolmnixon thinks about that

Transform3D root = Transform3D(root_x, root_y, root_z, root_o).orthonormalized();
xr_body_tracker->set_joint_transform(XRBodyTracker::JOINT_ROOT, root);
// Set tracker pose, velocities, confidence.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we really need this comment either - it's not really saying anything that the line of code itself says just as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
3 participants