Skip to main content
New Participant
August 13, 2020
Solved

Skeleton physical colliders pose not updated during hand tracking

I run the HandsInteractionTrainScene in Quest with Unity, and find that the skeleton physical colliders are not updated with hand tracking pose. I only turn on the Render Physics Capsules and allow Hand Tracking Support in OVRCameraRig. Does anyone know what's going on?
You can see the footage in the attached zip file.
This topic has been closed for replies.
paperliAnswer
New Participant
August 13, 2020
I found a fix. Change below lines in OVRSkeleton.cs,
if (capsuleGO.activeSelf)
{
capsule.CapsuleRigidbody.MovePosition(bone.position);
capsule.CapsuleRigidbody.MovePosition(bone.rotation);
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.position = bone.position;
capsule.CapsuleRigidbody.rotation = bone.rotation;
}
to this:
if (capsuleGO.activeSelf)
{
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}
Looks like assigning position and rotation to the rigid body doesn’t work at all.
Since the OVRSkeleton is the part of sdk, it will be better if Oculus fixes it in its Oculus Integration package.

7 replies

paperliAuthorAnswer
New Participant
August 13, 2020
I found a fix. Change below lines in OVRSkeleton.cs,
if (capsuleGO.activeSelf)
{
capsule.CapsuleRigidbody.MovePosition(bone.position);
capsule.CapsuleRigidbody.MovePosition(bone.rotation);
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.position = bone.position;
capsule.CapsuleRigidbody.rotation = bone.rotation;
}
to this:
if (capsuleGO.activeSelf)
{
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}
Looks like assigning position and rotation to the rigid body doesn’t work at all.
Since the OVRSkeleton is the part of sdk, it will be better if Oculus fixes it in its Oculus Integration package.
lesh6
New Participant
July 6, 2021

OMG you saved me countless hours of debugging, thank you!!!

August 16, 2020
This fixes a similar problem I was having, thank you!!

In my situation I created a spaceship with a control touchscreen console for navigation.  Those buttons would then add a force to the spaceships rigidbody.  This was causing the capsule colliders on the skeleton to move off of the hand.  I've been trying to fix this for awhile.  Thanks again!!
New Participant
September 7, 2020

paperli said:

I found a fix. Change below lines in OVRSkeleton.cs,
if (capsuleGO.activeSelf)
{
capsule.CapsuleRigidbody.MovePosition(bone.position);
capsule.CapsuleRigidbody.MovePosition(bone.rotation);
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.position = bone.position;
capsule.CapsuleRigidbody.rotation = bone.rotation;
}
to this:
if (capsuleGO.activeSelf)
{
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}
Looks like assigning position and rotation to the rigid body doesn’t work at all.
Since the OVRSkeleton is the part of sdk, it will be better if Oculus fixes it in its Oculus Integration package.


I have a better solution here, please feel free to try

if (capsuleGO.activeSelf)
{
capsuleGO.SetActive(false);         //Raymond Tsang debug @ 2020-02-14 
    capsuleGO.SetActive(true);          //Raymond Tsang debug @ 2020-02-14       
capsule.CapsuleRigidbody.MovePosition(bone.position);
capsule.CapsuleRigidbody.MovePosition(bone.rotation);
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}
  
New Participant
September 7, 2020
I have a better solution, please feel free to try it

if (capsuleGO.activeSelf)
{
capsuleGO.SetActive(false);         //Raymond Tsang debug @ 2020-02-14
    capsuleGO.SetActive(true);          //Raymond Tsang debug @ 2020-02-14
capsule.CapsuleRigidbody.MovePosition(bone.position);
capsule.CapsuleRigidbody.MovePosition(bone.rotation);
}
else
{
capsuleGO.SetActive(true);
capsule.CapsuleRigidbody.gameObject.transform.position = bone.position;
capsule.CapsuleRigidbody.gameObject.transform.rotation = bone.rotation;
}