void AddHandSkeletonBones(SkeletonBuilder skeletonBuilder, bool isLeftHand) { OVRSkeleton skeleton = isLeftHand ? _LeftHandOVRSkelton : _RightHandOVRSkelton; Dictionary <HumanBodyBones, OVRSkeleton.BoneId> handBoneIdMap; handBoneIdMap = isLeftHand ? _LeftHandBoneIdMap : _RightHandBoneIdMap; foreach (HumanBodyBones boneKey in handBoneIdMap.Keys) { OVRSkeleton.BoneId ovrBoneId = handBoneIdMap[boneKey]; if ((int)ovrBoneId < skeleton.Bones.Count) { Transform skeletonBone = skeleton.BindPoses[(int)ovrBoneId].Transform; Vector3 localPosition = skeletonBone.localPosition; Quaternion localRotation = skeletonBone.localRotation; // Local pose composition if ((ovrBoneId == OVRSkeleton.BoneId.Hand_Thumb2) || (ovrBoneId == OVRSkeleton.BoneId.Hand_Pinky1)) { short parentBoneIndex = skeleton.Bones[(int)ovrBoneId].ParentBoneIndex; Transform parentBone = skeleton.Bones[parentBoneIndex].Transform; localPosition = parentBone.localPosition + parentBone.localRotation * localPosition; localRotation = parentBone.localRotation * localRotation; } skeletonBuilder.Add(boneKey, _HandBoneParent[boneKey], localPosition, localRotation); } } }
private IEnumerator Start() { while (!HandsManager.Instance || !HandsManager.Instance.IsInitialized()) { yield return(null); } _handManager = HandsManager.Instance; _handSkeleton = GetComponentInParent <OVRSkeleton>(); _hand = GetComponentInParent <OVRHand>(); if (!_handSkeleton || !_hand) { yield break; } switch (fingerToFollow) { case OVRPlugin.HandFinger.Thumb: _boneId = OVRSkeleton.BoneId.Hand_Thumb3; break; case OVRPlugin.HandFinger.Index: _boneId = OVRSkeleton.BoneId.Hand_Index3; break; case OVRPlugin.HandFinger.Middle: _boneId = OVRSkeleton.BoneId.Hand_Middle3; break; case OVRPlugin.HandFinger.Ring: _boneId = OVRSkeleton.BoneId.Hand_Ring3; break; case OVRPlugin.HandFinger.Pinky: _boneId = OVRSkeleton.BoneId.Hand_Pinky3; break; default: _boneId = OVRSkeleton.BoneId.Hand_Index3; break; } // var capsuleTriggers = new List<BoneCapsuleTriggerLogic>(); var boneCapsules = HandsManager.GetCapsulesPerBone(_handSkeleton, _boneId); // foreach (var capsule in boneCapsules) // { // var capsuleTrigger = capsule.CapsuleRigidbody.gameObject.AddComponent<BoneCapsuleTriggerLogic>(); // capsule.CapsuleCollider.isTrigger = true; // capsuleTriggers.Add(capsuleTrigger); // } if (boneCapsules.Count > 0) { _capsuleToTrack = boneCapsules[0]; } _isInitialized = true; }
public override void OnInspectorGUI() { DrawPropertiesExcluding(serializedObject, new string[] { "_customBones" }); serializedObject.ApplyModifiedProperties(); OVRCustomSkeleton skeleton = (OVRCustomSkeleton)target; OVRSkeleton.SkeletonType skeletonType = skeleton.GetSkeletonType(); if (skeletonType == OVRSkeleton.SkeletonType.None) { EditorGUILayout.HelpBox("Please select a SkeletonType.", MessageType.Warning); } else { if (GUILayout.Button("Auto Map Bones")) { skeleton.TryAutoMapBonesByName(); EditorUtility.SetDirty(skeleton); EditorSceneManager.MarkSceneDirty(skeleton.gameObject.scene); } EditorGUILayout.LabelField("Bones", EditorStyles.boldLabel); BoneId start = skeleton.GetCurrentStartBoneId(); BoneId end = skeleton.GetCurrentEndBoneId(); if (start != BoneId.Invalid && end != BoneId.Invalid) { for (int i = (int)start; i < (int)end; ++i) { string boneName = BoneLabelFromBoneId(skeletonType, (BoneId)i); skeleton.CustomBones[i] = (Transform)EditorGUILayout.ObjectField(boneName, skeleton.CustomBones[i], typeof(Transform), true); } } } }
void UpdateHandSkeletonBones(bool isLeftHand) { OVRSkeleton skeleton = isLeftHand ? _LeftHandOVRSkelton : _RightHandOVRSkelton; Dictionary <HumanBodyBones, OVRSkeleton.BoneId> handBoneIdMap; handBoneIdMap = isLeftHand ? _LeftHandBoneIdMap : _RightHandBoneIdMap; foreach (HumanBodyBones boneKey in handBoneIdMap.Keys) { OVRSkeleton.BoneId ovrBoneId = handBoneIdMap[boneKey]; if ((int)ovrBoneId < skeleton.Bones.Count) { Transform skeletonBone = skeleton.Bones[(int)ovrBoneId].Transform; Quaternion localRotation = skeletonBone.localRotation; // Local pose composition if ((ovrBoneId == OVRSkeleton.BoneId.Hand_Thumb2) || (ovrBoneId == OVRSkeleton.BoneId.Hand_Pinky1)) { short parentBoneIndex = skeleton.Bones[(int)ovrBoneId].ParentBoneIndex; Transform parentBone = skeleton.Bones[parentBoneIndex].Transform; localRotation = parentBone.localRotation * localRotation; } _Skeleton[boneKey].localRotation = localRotation; } } }
protected virtual void UpdateVRNodeFingers() { if (IsInitialized()) { if (!_physicsInitialized) { CreatePhysics(); _physicsInitialized = true; } if (!_fingersDataInitialized) { InitFingersData(); _fingersDataInitialized = true; } //Update the nodes of the fingers foreach (QuickHumanFingers f in QuickHumanTrait.GetHumanFingers()) { _handFingerConfidence[(int)f] = IsDataHighConfidence ? Mathf.Min(_handFingerConfidence[(int)f] + 1, NUM_FRAMES_CONFIDENCE) : 0; for (int i = 0; i < NUM_BONES_PER_FINGER; i++) { int boneID = ((int)f) * NUM_BONES_PER_FINGER + i; QuickVRNode nFinger = _vrNodeFingers[boneID]; //_playArea.GetVRNode(fingerBones[i]); if (IsDataHighConfidenceFinger(f)) { //The finger is tracked. OVRSkeleton.BoneId ovrBoneID = _ovrFingerBones[boneID]; Transform ovrBone = GetOVRBoneTransform(ovrBoneID); nFinger.transform.position = ovrBone.position; nFinger.transform.rotation = ovrBone.rotation; //Correct the rotation if (IsLeft()) { nFinger.transform.Rotate(Vector3.right, 180, Space.Self); nFinger.transform.Rotate(Vector3.up, -90, Space.Self); } else { nFinger.transform.Rotate(Vector3.up, 90, Space.Self); } //nFinger.SetTracked(true); } else { //The finger is not tracked. Restore the last valid local rotation. //nFinger.SetTracked(false); } nFinger.SetTracked(true); } } } }
private IEnumerator AttachTriggerLogic() { while (!HandsManager.Instance || !HandsManager.Instance.IsInitialized()) { yield return(null); } OVRSkeleton handSkeleton = IsRightHandedTool ? HandsManager.Instance.RightHandSkeleton : HandsManager.Instance.LeftHandSkeleton; OVRSkeleton.BoneId boneToTestCollisions = OVRSkeleton.BoneId.Hand_Pinky3; switch (_fingerToFollow) { case OVRPlugin.HandFinger.Thumb: boneToTestCollisions = OVRSkeleton.BoneId.Hand_Thumb3; break; case OVRPlugin.HandFinger.Index: boneToTestCollisions = OVRSkeleton.BoneId.Hand_Index3; break; case OVRPlugin.HandFinger.Middle: boneToTestCollisions = OVRSkeleton.BoneId.Hand_Middle3; break; case OVRPlugin.HandFinger.Ring: boneToTestCollisions = OVRSkeleton.BoneId.Hand_Ring3; break; case OVRPlugin.HandFinger.Pinky: boneToTestCollisions = OVRSkeleton.BoneId.Hand_Pinky3; break; default: boneToTestCollisions = OVRSkeleton.BoneId.Hand_Index3; break; } List <BoneCapsuleTriggerLogic> boneCapsuleTriggerLogic = new List <BoneCapsuleTriggerLogic>(); List <OVRBoneCapsule> boneCapsules = HandsManager.GetCapsulesPerBone(handSkeleton, boneToTestCollisions); foreach (var ovrCapsuleInfo in boneCapsules) { var boneCapsuleTrigger = ovrCapsuleInfo.CapsuleRigidbody.gameObject.AddComponent <BoneCapsuleTriggerLogic>(); ovrCapsuleInfo.CapsuleCollider.isTrigger = true; boneCapsuleTrigger.ToolTags = ToolTags; boneCapsuleTriggerLogic.Add(boneCapsuleTrigger); } _boneCapsuleTriggerLogic = boneCapsuleTriggerLogic.ToArray(); // finger tip should have only one capsule if (boneCapsules.Count > 0) { _capsuleToTrack = boneCapsules[0]; } _isInitialized = true; }
internal OVRBone GetOvrBone(OVRSkeleton.BoneId boneId) { foreach (var item in skeleton.Bones) { if (item.Id == boneId) { return(new OVRBone(item.Id, item.ParentBoneIndex, item.Transform)); } } return(default);
private TrackedHandJoint convertBoneIdToTrackedHandJoint(OVRSkeleton.BoneId boneId) { switch (boneId) { case OVRSkeleton.BoneId.Hand_WristRoot: return(TrackedHandJoint.Wrist); case OVRSkeleton.BoneId.Hand_ForearmStub: return(TrackedHandJoint.Palm); case OVRSkeleton.BoneId.Hand_Thumb0: return(TrackedHandJoint.ThumbMetacarpalJoint); case OVRSkeleton.BoneId.Hand_Thumb1: return(TrackedHandJoint.ThumbProximalJoint); case OVRSkeleton.BoneId.Hand_Thumb2: return(TrackedHandJoint.ThumbDistalJoint); case OVRSkeleton.BoneId.Hand_Thumb3: return(TrackedHandJoint.ThumbTip); case OVRSkeleton.BoneId.Hand_Index1: return(TrackedHandJoint.IndexKnuckle); case OVRSkeleton.BoneId.Hand_Index2: return(TrackedHandJoint.IndexMiddleJoint); case OVRSkeleton.BoneId.Hand_Index3: return(TrackedHandJoint.IndexDistalJoint); case OVRSkeleton.BoneId.Hand_Middle1: return(TrackedHandJoint.MiddleKnuckle); case OVRSkeleton.BoneId.Hand_Middle2: return(TrackedHandJoint.MiddleMiddleJoint); case OVRSkeleton.BoneId.Hand_Middle3: return(TrackedHandJoint.MiddleDistalJoint); case OVRSkeleton.BoneId.Hand_Ring1: return(TrackedHandJoint.RingKnuckle); case OVRSkeleton.BoneId.Hand_Ring2: return(TrackedHandJoint.RingMiddleJoint); case OVRSkeleton.BoneId.Hand_Ring3: return(TrackedHandJoint.RingDistalJoint); case OVRSkeleton.BoneId.Hand_Pinky0: return(TrackedHandJoint.PinkyMetacarpal); case OVRSkeleton.BoneId.Hand_Pinky1: return(TrackedHandJoint.PinkyKnuckle); case OVRSkeleton.BoneId.Hand_Pinky2: return(TrackedHandJoint.PinkyMiddleJoint); case OVRSkeleton.BoneId.Hand_Pinky3: return(TrackedHandJoint.PinkyDistalJoint); case OVRSkeleton.BoneId.Hand_ThumbTip: return(TrackedHandJoint.ThumbTip); case OVRSkeleton.BoneId.Hand_IndexTip: return(TrackedHandJoint.IndexTip); case OVRSkeleton.BoneId.Hand_MiddleTip: return(TrackedHandJoint.MiddleTip); case OVRSkeleton.BoneId.Hand_RingTip: return(TrackedHandJoint.RingTip); case OVRSkeleton.BoneId.Hand_PinkyTip: return(TrackedHandJoint.PinkyTip); default: return(TrackedHandJoint.None); } }
public static List <OVRBoneCapsule> GetCapsulesPerBone(OVRSkeleton skeleton, OVRSkeleton.BoneId boneId) { List <OVRBoneCapsule> boneCapsules = new List <OVRBoneCapsule>(); var capsules = skeleton.Capsules; for (int i = 0; i < capsules.Count; ++i) { if (capsules[i].BoneIndex == (short)boneId) { boneCapsules.Add(capsules[i]); } } return(boneCapsules); }
// force aliased enum values to the more appropriate value private static string BoneLabelFromBoneId(BoneId boneId) { if (boneId == BoneId.Hand_Start) { return("Hand_WristRoot"); } else if (boneId == BoneId.Hand_MaxSkinnable) { return("Hand_ThumbTip"); } else { return(boneId.ToString()); } }
internal Transform FindTransform(OVRSkeleton.BoneId e, Hand hand) { var mapEntry = map.Find(x => x.id == e); var ts = hand.GetComponentsInChildren <Transform>(); foreach (var t in ts) { if (mapEntry.IsValid && t.name.Contains(mapEntry.match1) && t.name.Contains(mapEntry.match2)) { return(t); } } return(null); }
// force aliased enum values to the more appropriate value private static string BoneLabelFromBoneId(OVRSkeleton.SkeletonType skeletonType, BoneId boneId) { if (skeletonType == OVRSkeleton.SkeletonType.HandLeft || skeletonType == OVRSkeleton.SkeletonType.HandRight) { switch (boneId) { case OVRSkeleton.BoneId.Hand_WristRoot: return("Hand_WristRoot"); case OVRSkeleton.BoneId.Hand_ForearmStub: return("Hand_ForearmStub"); case OVRSkeleton.BoneId.Hand_Thumb0: return("Hand_Thumb0"); case OVRSkeleton.BoneId.Hand_Thumb1: return("Hand_Thumb1"); case OVRSkeleton.BoneId.Hand_Thumb2: return("Hand_Thumb2"); case OVRSkeleton.BoneId.Hand_Thumb3: return("Hand_Thumb3"); case OVRSkeleton.BoneId.Hand_Index1: return("Hand_Index1"); case OVRSkeleton.BoneId.Hand_Index2: return("Hand_Index2"); case OVRSkeleton.BoneId.Hand_Index3: return("Hand_Index3"); case OVRSkeleton.BoneId.Hand_Middle1: return("Hand_Middle1"); case OVRSkeleton.BoneId.Hand_Middle2: return("Hand_Middle2"); case OVRSkeleton.BoneId.Hand_Middle3: return("Hand_Middle3"); case OVRSkeleton.BoneId.Hand_Ring1: return("Hand_Ring1"); case OVRSkeleton.BoneId.Hand_Ring2: return("Hand_Ring2"); case OVRSkeleton.BoneId.Hand_Ring3: return("Hand_Ring3"); case OVRSkeleton.BoneId.Hand_Pinky0: return("Hand_Pinky0"); case OVRSkeleton.BoneId.Hand_Pinky1: return("Hand_Pinky1"); case OVRSkeleton.BoneId.Hand_Pinky2: return("Hand_Pinky2"); case OVRSkeleton.BoneId.Hand_Pinky3: return("Hand_Pinky3"); case OVRSkeleton.BoneId.Hand_ThumbTip: return("Hand_ThumbTip"); case OVRSkeleton.BoneId.Hand_IndexTip: return("Hand_IndexTip"); case OVRSkeleton.BoneId.Hand_MiddleTip: return("Hand_MiddleTip"); case OVRSkeleton.BoneId.Hand_RingTip: return("Hand_RingTip"); case OVRSkeleton.BoneId.Hand_PinkyTip: return("Hand_PinkyTip"); default: return("Hand_Unknown"); } } else { return("Skeleton_Unknown"); } }
public OVRBone(OVRSkeleton.BoneId id, short parentBoneIndex, Transform trans) { Id = id; ParentBoneIndex = parentBoneIndex; Transform = trans; }
public virtual Transform GetOVRBoneTransform(OVRSkeleton.BoneId boneID) { return(GetOVRBoneTransform((int)boneID)); }
private OVRBone GetBoneById(OVRSkeleton.BoneId id) { return(Skeleton.Bones[(int)id]); }