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); }
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); }
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); } }