protected virtual void Start()
        {
            this.BeginStart(ref _started);

            _skeleton = _handVisual.Hand.Handedness == Handedness.Left
                ? OVRSkeletonData.LeftSkeleton
                : OVRSkeletonData.RightSkeleton;
            _capsulesGO = new GameObject("Capsules");
            _capsulesGO.transform.SetParent(transform, false);
            _capsulesGO.transform.localPosition = Vector3.zero;
            _capsulesGO.transform.localRotation = Quaternion.identity;

            _capsules = new List <BoneCapsule>(new BoneCapsule[_skeleton.NumBoneCapsules]);
            Capsules  = _capsules.AsReadOnly();

            for (int i = 0; i < _capsules.Count; ++i)
            {
                Transform   boneTransform = _handVisual.Joints[_skeleton.BoneCapsules[i].BoneIndex];
                BoneCapsule capsule       = new BoneCapsule();
                _capsules[i] = capsule;

                capsule.BoneIndex = _skeleton.BoneCapsules[i].BoneIndex;

                capsule.CapsuleRigidbody = new GameObject((boneTransform.name).ToString() + "_CapsuleRigidbody")
                                           .AddComponent <Rigidbody>();
                capsule.CapsuleRigidbody.mass                   = 1.0f;
                capsule.CapsuleRigidbody.isKinematic            = true;
                capsule.CapsuleRigidbody.useGravity             = false;
                capsule.CapsuleRigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;

                GameObject rbGO = capsule.CapsuleRigidbody.gameObject;
                rbGO.transform.SetParent(_capsulesGO.transform, false);
                rbGO.transform.position = boneTransform.position;
                rbGO.transform.rotation = boneTransform.rotation;
                rbGO.SetActive(false);

                capsule.CapsuleCollider = new GameObject((boneTransform.name).ToString() + "_CapsuleCollider")
                                          .AddComponent <CapsuleCollider>();
                capsule.CapsuleCollider.isTrigger = false;

                var p0    = _skeleton.BoneCapsules[i].StartPoint.FromFlippedXVector3f();
                var p1    = _skeleton.BoneCapsules[i].EndPoint.FromFlippedXVector3f();
                var delta = p1 - p0;
                var mag   = delta.magnitude;
                var rot   = Quaternion.FromToRotation(Vector3.right, delta);
                capsule.CapsuleCollider.radius    = _skeleton.BoneCapsules[i].Radius;
                capsule.CapsuleCollider.height    = mag + _skeleton.BoneCapsules[i].Radius * 2.0f;
                capsule.CapsuleCollider.direction = 0;
                capsule.CapsuleCollider.center    = Vector3.right * mag * 0.5f;

                GameObject ccGO = capsule.CapsuleCollider.gameObject;
                ccGO.transform.SetParent(rbGO.transform, false);
                ccGO.transform.localPosition = p0;
                ccGO.transform.localRotation = rot;
            }
            this.EndStart(ref _started);
        }
Beispiel #2
0
        private void Start()
        {
            handAnimator.runtimeAnimatorController = animatorController;
            handAnimator.enabled = true;

            ApplySpecificControllerOffset(ovrTouchOffset, controllerHand.Wrist);

            // get our skeleton2
            FieldInfo[] privateFields = typeof(OVRSkeleton).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
            skeletonField = privateFields.First <FieldInfo>(item => item.Name == "_skeleton");
            rawSkeleton   = (OVRPlugin.Skeleton2)skeletonField.GetValue(skeleton);
        }
Beispiel #3
0
        void DoSkeletalTracking()
        {
            rawSkeleton = (OVRPlugin.Skeleton2)skeletonField.GetValue(skeleton);

            // do any pre-flight checks here
            // confidence maybe?
            if (true)
            {
                controllerHand.Confidence = skeleton.IsDataHighConfidence ? 1 : 0;
                handAnimator.enabled      = false;

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

                Vector3    wristPos             = wristBone.Transform.position;
                Quaternion wristboneOrientation = controllerHand.GetLocalBasis();
                controllerHand.Wrist.rotation = GlobalRotationFromBasis(wristBone.Transform, fingerBasis) * 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];
                OVRBone   indexDistalTip    = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_IndexTip];
                Transform indexProximal     = controllerHand.IndexMetacarpal.GetChild(0);
                Transform indexMedial       = indexProximal.GetChild(0);
                Transform indexDistal       = indexMedial.GetChild(0);
                Transform indexTip          = indexDistal.GetChild(0);

                controllerHand.FingerWidth[(int)Leap.Finger.FingerType.TYPE_INDEX] = rawSkeleton.BoneCapsules[(int)OVRSkeleton.BoneId.Hand_Index1].Radius * 0.5f;
                MatchBone(indexProximalBone.Transform, indexProximal, fingerBasis, wristboneOrientation);
                MatchBone(indexMedialBone.Transform, indexMedial, fingerBasis, wristboneOrientation);
                MatchBone(indexDistalBone.Transform, indexDistal, fingerBasis, wristboneOrientation);
                Vector3 indexTipLocal = indexDistal.InverseTransformPoint(indexDistalTip.Transform.position);

                // 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];
                OVRBone   middleDistalTip    = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_MiddleTip];
                Transform middleProximal     = controllerHand.MiddleMetacarpal.GetChild(0);
                Transform middleMedial       = middleProximal.GetChild(0);
                Transform middleDistal       = middleMedial.GetChild(0);
                Transform middleTip          = middleDistal.GetChild(0);

                controllerHand.FingerWidth[(int)Leap.Finger.FingerType.TYPE_MIDDLE] = rawSkeleton.BoneCapsules[(int)OVRSkeleton.BoneId.Hand_Middle1].Radius * 0.5f;
                MatchBone(middleProximalBone.Transform, middleProximal, fingerBasis, wristboneOrientation);
                MatchBone(middleMedialBone.Transform, middleMedial, fingerBasis, wristboneOrientation);
                MatchBone(middleDistalBone.Transform, middleDistal, fingerBasis, wristboneOrientation);
                Vector3 middleTipLocal = middleDistal.InverseTransformPoint(middleDistalTip.Transform.position);

                // 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];
                OVRBone   ringDistalTip    = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_RingTip];
                Transform ringProximal     = controllerHand.RingMetacarpal.GetChild(0);
                Transform ringMedial       = ringProximal.GetChild(0);
                Transform ringDistal       = ringMedial.GetChild(0);
                Transform ringTip          = ringDistal.GetChild(0);

                controllerHand.FingerWidth[(int)Leap.Finger.FingerType.TYPE_RING] = rawSkeleton.BoneCapsules[(int)OVRSkeleton.BoneId.Hand_Ring1].Radius * 0.5f;
                MatchBone(ringProximalBone.Transform, ringProximal, fingerBasis, wristboneOrientation);
                MatchBone(ringMedialBone.Transform, ringMedial, fingerBasis, wristboneOrientation);
                MatchBone(ringDistalBone.Transform, ringDistal, fingerBasis, wristboneOrientation);
                Vector3 ringTipLocal = ringDistal.InverseTransformPoint(ringDistalTip.Transform.position);

                // 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_Pinky3];
                OVRBone   pinkyDistalTip      = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_PinkyTip];
                Transform pinkyMetacarpal     = controllerHand.PinkyMetacarpal;
                Transform pinkyPromial        = pinkyMetacarpal.GetChild(0);
                Transform pinkyMedial         = pinkyPromial.GetChild(0);
                Transform pinkyDistal         = pinkyMedial.GetChild(0);
                Transform pinkyTip            = pinkyDistal.GetChild(0);

                controllerHand.FingerWidth[(int)Leap.Finger.FingerType.TYPE_PINKY] = rawSkeleton.BoneCapsules[(int)OVRSkeleton.BoneId.Hand_Pinky1].Radius * 0.5f;
                MatchBone(pinkyMetacarpalBone.Transform, pinkyMetacarpal, fingerBasis, wristboneOrientation);
                MatchBone(pinkyProximalBone.Transform, pinkyPromial, fingerBasis, wristboneOrientation);
                MatchBone(pinkyMedialBone.Transform, pinkyMedial, fingerBasis, wristboneOrientation);
                MatchBone(pinkyDistalBone.Transform, pinkyDistal, fingerBasis, wristboneOrientation);
                Vector3 pinkyLocal = pinkyDistal.InverseTransformPoint(pinkyDistalTip.Transform.position);

                // 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];
                OVRBone   thumbDistalTip      = skeleton.Bones[(int)OVRSkeleton.BoneId.Hand_ThumbTip];
                Transform thumbMetacarpal     = controllerHand.ThumbMetacarpal;             // naming gets weird here, sorry.
                Transform thumbProximal       = thumbMetacarpal.GetChild(0);
                Transform thumbDistal         = thumbProximal.GetChild(0);
                Transform thumbTip            = thumbDistal.GetChild(0);

                controllerHand.FingerWidth[(int)Leap.Finger.FingerType.TYPE_THUMB] = rawSkeleton.BoneCapsules[(int)OVRSkeleton.BoneId.Hand_Thumb0].Radius * 0.5f;
                MatchBone(thumbMetacarpalBone.Transform, thumbMetacarpal, fingerBasis, wristboneOrientation);
                MatchBone(thumbProximalBone.Transform, thumbProximal, fingerBasis, wristboneOrientation);
                MatchBone(thumbDistalBone.Transform, thumbDistal, fingerBasis, wristboneOrientation);
                Vector3 thumbLocal = thumbDistal.InverseTransformPoint(thumbDistalTip.Transform.position);

                // Apply our tip shortening
                Vector3 scaleFactor = new Vector3(
                    (fingerForward.x != 0) ? tipScale : 1,
                    (fingerForward.y != 0) ? tipScale : 1,
                    (fingerForward.z != 0) ? tipScale : 1);                     // do this once at startup maybe?
                indexTip.transform.localPosition = Vector3.Scale(indexTipLocal, scaleFactor);
                middleTip.localPosition          = Vector3.Scale(middleTipLocal, scaleFactor);
                ringTip.transform.localPosition  = Vector3.Scale(ringTipLocal, scaleFactor);
                pinkyTip.transform.localPosition = Vector3.Scale(pinkyLocal, scaleFactor);
                thumbTip.localPosition           = Vector3.Scale(thumbLocal, scaleFactor * 1.25f);
            }
        }