示例#1
0
        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;
    }
示例#3
0
    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);
                }
            }
        }
    }
示例#4
0
        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;
                }
            }
        }
示例#5
0
        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);
                    }
                }
            }
        }
示例#6
0
        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);
            }
        }
示例#9
0
        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);
        }
示例#10
0
 // 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);
    }
示例#12
0
    // 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");
        }
    }
示例#13
0
 public OVRBone(OVRSkeleton.BoneId id, short parentBoneIndex, Transform trans)
 {
     Id = id;
     ParentBoneIndex = parentBoneIndex;
     Transform       = trans;
 }
示例#14
0
 public virtual Transform GetOVRBoneTransform(OVRSkeleton.BoneId boneID)
 {
     return(GetOVRBoneTransform((int)boneID));
 }
示例#15
0
 private OVRBone GetBoneById(OVRSkeleton.BoneId id)
 {
     return(Skeleton.Bones[(int)id]);
 }