Exemplo n.º 1
0
        private void Update()
        {
            if (controllerHand.IsActive)
            {
                if (steamVRControllerType == SteamVR_ControllerType.Unknown)
                {
                    GetControllerType();
                }
                if (steamVRControllerType == SteamVR_ControllerType.Knuckles)
                {
                    UpdateAnimatorKnuckles();
                }
                else if (steamVRControllerType == SteamVR_ControllerType.Vive)
                {
                    UpdateAnimatorVive();
                }

                animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;

                // set our wrist positions to match first
                controllerHand.Wrist.transform.position = wrist.transform.position;

                Quaternion wristBoneOrientation = controllerHand.GetLocalBasis();
                controllerHand.Wrist.rotation = GlobalRotationFromBasis(wrist, wristBasis) * wristBoneOrientation;

                for (int fingerIndx = 0; fingerIndx < fingerMetacarpals.Length; fingerIndx++)
                {
                    Transform fingerRoot = null;

                    if (fingerIndx == 0)
                    {
                        fingerRoot = controllerHand.IndexMetacarpal;
                    }
                    else if (fingerIndx == 1)
                    {
                        fingerRoot = controllerHand.MiddleMetacarpal;
                    }
                    else if (fingerIndx == 2)
                    {
                        fingerRoot = controllerHand.RingMetacarpal;
                    }
                    else if (fingerIndx == 3)
                    {
                        fingerRoot = controllerHand.PinkyMetacarpal;
                    }
                    else
                    {
                        fingerRoot = controllerHand.ThumbMetacarpal;
                    }

                    MatchBones(fingerMetacarpals[fingerIndx], fingerRoot, fingerBasis, wristBoneOrientation);
                }
            }
            else
            {
                animator.cullingMode = AnimatorCullingMode.CullCompletely;
            }
        }
Exemplo n.º 2
0
        void DoSkeletalTracking()
        {
            // do any pre-flight checks here
            // confidence maybe?
            if (true)
            {
                handAnimator.enabled = true;
                BoneBasis basis = new BoneBasis()
                {
                    Forward = fingerForward, Up = fingerUp
                };

                // do our wrist pose
                OVRBone wristBone = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_WristRoot];

                Vector3    wristPos             = wristBone.Transform.position;
                Quaternion wristboneOrientation = controllerHand.GetLocalBasis();

                /*controllerHand.Wrist.SetPositionAndRotation(wristBone.Transform.position,
                 *      GlobalRotationFromBasis(wristBone.Transform, basis) * wristboneOrientation);*/
                controllerHand.Wrist.rotation = GlobalRotationFromBasis(wristBone.Transform, basis) * wristboneOrientation;

                // do our fingers. Skip metacarpals, Oculus does not provide them.
                // we could possibly compute the missing bone rotation, if needed.
                // do the index bones
                OVRBone   indexProximalBone = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Index1];
                OVRBone   indexMedialBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Index2];
                OVRBone   indexDistalBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Index3];
                Transform indexProximal     = controllerHand.IndexMetacarpal.GetChild(0);
                Transform indexMedial       = indexProximal.GetChild(0);
                Transform indexDistal       = indexMedial.GetChild(0);

                MatchBone(indexProximalBone.Transform, indexProximal, basis, wristboneOrientation);
                MatchBone(indexMedialBone.Transform, indexMedial, basis, wristboneOrientation);
                MatchBone(indexDistalBone.Transform, indexDistal, basis, wristboneOrientation);

                // do the middle bones
                OVRBone   middleProximalBone = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Middle1];
                OVRBone   middleMedialBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Middle2];
                OVRBone   middleDistalBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Middle3];
                Transform middleProximal     = controllerHand.MiddleMetacarpal.GetChild(0);
                Transform middleMedial       = middleProximal.GetChild(0);
                Transform middleDistal       = middleMedial.GetChild(0);

                MatchBone(middleProximalBone.Transform, middleProximal, basis, wristboneOrientation);
                MatchBone(middleMedialBone.Transform, middleMedial, basis, wristboneOrientation);
                MatchBone(middleDistalBone.Transform, middleDistal, basis, wristboneOrientation);

                // do the ring bones
                OVRBone   ringProximalBone = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Ring1];
                OVRBone   ringMedialBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Ring2];
                OVRBone   ringDistalBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Ring3];
                Transform ringProximal     = controllerHand.RingMetacarpal.GetChild(0);
                Transform ringMedial       = ringProximal.GetChild(0);
                Transform ringDistal       = ringMedial.GetChild(0);

                MatchBone(ringProximalBone.Transform, ringProximal, basis, wristboneOrientation);
                MatchBone(ringMedialBone.Transform, ringMedial, basis, wristboneOrientation);
                MatchBone(ringDistalBone.Transform, ringDistal, basis, wristboneOrientation);

                // do the pinky bones
                OVRBone   pinkyMetacarpalBone = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Pinky0];
                OVRBone   pinkyProximalBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Pinky1];
                OVRBone   pinkyMedialBone     = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Pinky2];
                OVRBone   pinkyDistalBone     = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Pinky2];
                Transform pinkyMetacarpal     = controllerHand.PinkyMetacarpal;
                Transform pinkyPromial        = pinkyMetacarpal.GetChild(0);
                Transform pinkyMedial         = pinkyPromial.GetChild(0);
                Transform pinkyDistal         = pinkyMedial.GetChild(0);

                MatchBone(pinkyMetacarpalBone.Transform, pinkyMetacarpal, basis, wristboneOrientation);
                MatchBone(pinkyProximalBone.Transform, pinkyPromial, basis, wristboneOrientation);
                MatchBone(pinkyMedialBone.Transform, pinkyMedial, basis, wristboneOrientation);
                MatchBone(pinkyDistalBone.Transform, pinkyDistal, basis, wristboneOrientation);

                // do the thumb bones
                OVRBone   thumbRootBone       = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Thumb0];
                OVRBone   thumbMetacarpalBone = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Thumb1];
                OVRBone   thumbProximalBone   = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Thumb2];
                OVRBone   thumbDistalBone     = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_Thumb3];
                Transform thumbMetacarpal     = controllerHand.ThumbMetacarpal;             // naming gets weird here, sorry.
                Transform thumbProximal       = thumbMetacarpal.GetChild(0);
                Transform thumbDistal         = thumbProximal.GetChild(0);

                MatchBone(thumbMetacarpalBone.Transform, thumbMetacarpal, basis, wristboneOrientation);
                MatchBone(thumbProximalBone.Transform, thumbProximal, basis, wristboneOrientation);
                MatchBone(thumbDistalBone.Transform, thumbDistal, basis, wristboneOrientation);
            }
        }