Beispiel #1
0
        protected override void CopyPoseImp()
        {
            Quaternion tmpRot = _source.transform.rotation;

            _source.transform.rotation = _dest.transform.rotation;

            CopyPose(QuickHumanBodyBones.Hips);
            CopyPose(QuickHumanBodyBones.Spine);
            CopyPoseChainLimb(QuickHumanBodyBones.Head);

            CopyPose(QuickHumanBodyBones.LeftUpperArm);
            CopyPose(QuickHumanBodyBones.LeftLowerArm);
            CopyPoseChainLimb(QuickHumanBodyBones.LeftHand);

            CopyPose(QuickHumanBodyBones.RightUpperArm);
            CopyPose(QuickHumanBodyBones.RightLowerArm);
            CopyPoseChainLimb(QuickHumanBodyBones.RightHand);

            CopyPose(QuickHumanBodyBones.LeftUpperLeg);
            CopyPose(QuickHumanBodyBones.LeftLowerLeg);
            CopyPoseChainLimb(QuickHumanBodyBones.LeftFoot);

            CopyPose(QuickHumanBodyBones.RightUpperLeg);
            CopyPose(QuickHumanBodyBones.RightLowerLeg);
            CopyPoseChainLimb(QuickHumanBodyBones.RightFoot);

            for (QuickHumanBodyBones fingerBoneID = QuickHumanBodyBones.LeftThumbProximal; fingerBoneID <= QuickHumanBodyBones.RightLittleDistal; fingerBoneID++)
            {
                CopyPose(fingerBoneID);
            }

            _source.transform.rotation = tmpRot;
        }
Beispiel #2
0
        public static Transform GetBoneTransform(this Animator animator, QuickHumanBodyBones boneID)
        {
            Transform result = null;

            if (boneID == QuickHumanBodyBones.LeftEye)
            {
                result = animator.GetEye(true);
            }
            else if (boneID == QuickHumanBodyBones.RightEye)
            {
                result = animator.GetEye(false);
            }
            else
            {
                if ((int)boneID < (int)HumanBodyBones.LastBone)
                {
                    result = animator.GetBoneTransform((HumanBodyBones)boneID);
                }
                else
                {
                    //At this point, boneID is a bone finger tip
                    Transform tBoneDistal = animator.GetBoneTransform(GetParentBone(boneID));
                    if (tBoneDistal)
                    {
                        result = tBoneDistal.GetChild(0);
                    }
                }
            }

            return(result);
        }
Beispiel #3
0
        public virtual void SetRole(QuickHumanBodyBones role)
        {
            _role = role;

            LoadVRModel();

            _trackedObject.Reset();
        }
Beispiel #4
0
        public static QuickHumanFingers GetFingerFromBone(QuickHumanBodyBones bone)
        {
            if (_fingerFromBone.Count == 0)
            {
                _bonesFromFingerLeft  = InitHumanFingers(true);
                _bonesFromFingerRight = InitHumanFingers(false);
            }

            return(_fingerFromBone[bone]);
        }
Beispiel #5
0
        public static bool IsBoneFingerRight(QuickHumanBodyBones boneID)
        {
            int i = (int)boneID;

            return
                (
                (i >= (int)QuickHumanBodyBones.RightThumbProximal && i <= (int)QuickHumanBodyBones.RightLittleDistal) ||
                (i >= (int)QuickHumanBodyBones.RightThumbTip && i <= (int)QuickHumanBodyBones.RightLittleTip)
                );
        }
Beispiel #6
0
        protected virtual void CopyPoseChainLimb(QuickHumanBodyBones boneID)
        {
            Transform tRotSrc = _source.GetRotationReference(boneID);
            Transform tRotDst = _dest.GetRotationReference(boneID);

            Transform tBoneDst = _dest.GetBoneTransform(boneID);

            tBoneDst.Rotate(Vector3.Cross(tRotDst.forward, tRotSrc.forward), Vector3.Angle(tRotDst.forward, tRotSrc.forward), Space.World);
            tBoneDst.Rotate(Vector3.Cross(tRotDst.up, tRotSrc.up), Vector3.Angle(tRotDst.up, tRotSrc.up), Space.World);
        }
Beispiel #7
0
        public static QuickHumanBodyBones GetNextBoneInChain(QuickHumanBodyBones boneID)
        {
            if (_nextBoneInChain == null)
            {
                InitNextBones();
            }

            bool b = _nextBoneInChain.TryGetValue(boneID, out QuickHumanBodyBones result);

            return(b? result : QuickHumanBodyBones.LastBone);
        }
Beispiel #8
0
 protected virtual bool IsTrackedJoint(QuickHumanBodyBones boneID)
 {
     if (QuickHumanTrait.IsBoneFingerLeft(boneID))
     {
         return(IsTrackedJointHandLeft(QuickHumanTrait.GetFingerFromBone(boneID)));
     }
     else if (QuickHumanTrait.IsBoneFingerRight(boneID))
     {
         return(IsTrackedJointHandRight(QuickHumanTrait.GetFingerFromBone(boneID)));
     }
     return(IsTrackedJointBody(_toTrackedJointBody[boneID]));
 }
Beispiel #9
0
        public override void SetRole(QuickHumanBodyBones role)
        {
            base.SetRole(role);

            _handAnimator = Instantiate(Resources.Load <QuickVRHandAnimator>("Prefabs/" + (role == QuickHumanBodyBones.LeftHand ? "pf_HandLeft" : "pf_HandRight")), transform);
            _handAnimator.transform.localPosition = Vector3.zero;

            foreach (SkinnedMeshRenderer r in _handAnimator.GetComponentsInChildren <SkinnedMeshRenderer>())
            {
                r.sharedMesh = null;
            }
        }
Beispiel #10
0
        public static QuickHumanBodyBones GetParentBone(QuickHumanBodyBones boneID)
        {
            if ((int)boneID < (int)HumanBodyBones.LastBone)
            {
                return((QuickHumanBodyBones)GetParentBone((int)boneID));
            }

            if (_parentBone == null)
            {
                InitParentBones();
            }

            return(_parentBone[boneID]);
        }
Beispiel #11
0
        protected virtual void CopyPose(QuickHumanBodyBones boneID)
        {
            QuickHumanBodyBones nextBoneID   = QuickHumanTrait.GetNextBoneInChain(boneID);
            Transform           tBoneSrc     = _source.GetBoneTransform(boneID);
            Transform           tBoneSrcNext = _source.GetBoneTransform(nextBoneID);
            Transform           tBoneDst     = _dest.GetBoneTransform(boneID);
            Transform           tBoneDstNext = _dest.GetBoneTransform(nextBoneID);

            Vector3 currentDir = tBoneDstNext.position - tBoneDst.position;
            Vector3 targetDir  = tBoneSrcNext.position - tBoneSrc.position;

            Vector3 rotAxis  = Vector3.Cross(currentDir, targetDir);
            float   rotAngle = Vector3.Angle(currentDir, targetDir);

            tBoneDst.Rotate(rotAxis, rotAngle, Space.World);
        }
Beispiel #12
0
 protected virtual void InitBoneFingers()
 {
     _boneFingers = new List <KeyValuePair <Transform, Transform> >();
     foreach (bool b in new bool[] { true, false })
     {
         foreach (QuickHumanFingers f in QuickHumanTrait.GetHumanFingers())
         {
             List <QuickHumanBodyBones> fingerBones = QuickHumanTrait.GetBonesFromFinger(f, b);
             for (int i = 0; i < fingerBones.Count; i++)
             {
                 QuickHumanBodyBones fBoneID = fingerBones[i];
                 _boneFingers.Add(new KeyValuePair <Transform, Transform>(_animator.GetBoneTransform(fBoneID), _vrPlayArea.GetVRNode(fBoneID).GetTrackedObject().transform));
             }
         }
     }
 }
Beispiel #13
0
        private static void CreateRotationReference(this Animator animator, QuickHumanBodyBones boneID)
        {
            Transform t = animator.GetBoneTransform(boneID).CreateChild("__RotationReference__");

            if (boneID == QuickHumanBodyBones.Head || boneID == QuickHumanBodyBones.LeftFoot || boneID == QuickHumanBodyBones.RightFoot)
            {
                t.LookAt(t.position + animator.transform.forward, animator.transform.up);
            }
            else if (boneID == QuickHumanBodyBones.LeftHand)
            {
                t.LookAt(t.position - animator.transform.right, animator.transform.up);
            }
            else if (boneID == QuickHumanBodyBones.RightHand)
            {
                t.LookAt(t.position + animator.transform.right, animator.transform.up);
            }
        }
Beispiel #14
0
        private static Dictionary <QuickHumanFingers, List <QuickHumanBodyBones> > InitHumanFingers(bool isLeft)
        {
            Dictionary <QuickHumanFingers, List <QuickHumanBodyBones> > result = new Dictionary <QuickHumanFingers, List <QuickHumanBodyBones> >();
            string prefix = isLeft ? "Left" : "Right";

            string[] phalanges = { "Proximal", "Intermediate", "Distal", "Tip" };
            foreach (QuickHumanFingers f in GetHumanFingers())
            {
                result[f] = new List <QuickHumanBodyBones>();
                foreach (string p in phalanges)
                {
                    QuickHumanBodyBones fingerBone = QuickUtils.ParseEnum <QuickHumanBodyBones>(prefix + f.ToString() + p);
                    result[f].Add(fingerBone);
                    _fingerFromBone[fingerBone] = f;
                }
            }

            return(result);
        }
Beispiel #15
0
        protected virtual QuickVRNode CreateVRNode(QuickHumanBodyBones role)
        {
            Transform   tNode = transform.CreateChild("VRNode" + role.ToString());
            QuickVRNode n     = null;

            if (role == QuickHumanBodyBones.Head)
            {
                n = tNode.GetOrCreateComponent <QuickVRNodeHead>();
            }
            else if (role == QuickHumanBodyBones.LeftHand)
            {
                n = tNode.GetOrCreateComponent <QuickVRNodeHand>();
                ((QuickVRNodeHand)n)._isLeft = true;
            }
            else if (role == QuickHumanBodyBones.RightHand)
            {
                n = tNode.GetOrCreateComponent <QuickVRNodeHand>();
                ((QuickVRNodeHand)n)._isLeft = false;
            }
            else if (role == QuickHumanBodyBones.LeftEye)
            {
                n = tNode.GetOrCreateComponent <QuickVRNodeEye>();
                ((QuickVRNodeEye)n)._isLeft = true;
            }
            else if (role == QuickHumanBodyBones.RightEye)
            {
                n = tNode.GetOrCreateComponent <QuickVRNodeEye>();
                ((QuickVRNodeEye)n)._isLeft = false;
            }
            else
            {
                n = tNode.GetOrCreateComponent <QuickVRNode>();
            }

            n.SetRole(role);

            _vrNodes[role] = n;

            return(n);
        }
Beispiel #16
0
 public static int GetMuscleFromBone(QuickHumanBodyBones boneID, int dofID)
 {
     return((int)boneID < (int)HumanBodyBones.LastBone ? GetMuscleFromBone((HumanBodyBones)boneID, dofID) : -1);
 }
Beispiel #17
0
 public static Transform GetRotationReference(this Animator animator, QuickHumanBodyBones boneID)
 {
     return(animator.GetBoneTransform(boneID).Find("__RotationReference__"));
 }
Beispiel #18
0
 public virtual QuickVRNode GetVRNode(QuickHumanBodyBones role)
 {
     return(_vrNodes[role]);
 }