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; }
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); }
public virtual void SetRole(QuickHumanBodyBones role) { _role = role; LoadVRModel(); _trackedObject.Reset(); }
public static QuickHumanFingers GetFingerFromBone(QuickHumanBodyBones bone) { if (_fingerFromBone.Count == 0) { _bonesFromFingerLeft = InitHumanFingers(true); _bonesFromFingerRight = InitHumanFingers(false); } return(_fingerFromBone[bone]); }
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) ); }
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); }
public static QuickHumanBodyBones GetNextBoneInChain(QuickHumanBodyBones boneID) { if (_nextBoneInChain == null) { InitNextBones(); } bool b = _nextBoneInChain.TryGetValue(boneID, out QuickHumanBodyBones result); return(b? result : QuickHumanBodyBones.LastBone); }
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])); }
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; } }
public static QuickHumanBodyBones GetParentBone(QuickHumanBodyBones boneID) { if ((int)boneID < (int)HumanBodyBones.LastBone) { return((QuickHumanBodyBones)GetParentBone((int)boneID)); } if (_parentBone == null) { InitParentBones(); } return(_parentBone[boneID]); }
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); }
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)); } } } }
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); } }
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); }
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); }
public static int GetMuscleFromBone(QuickHumanBodyBones boneID, int dofID) { return((int)boneID < (int)HumanBodyBones.LastBone ? GetMuscleFromBone((HumanBodyBones)boneID, dofID) : -1); }
public static Transform GetRotationReference(this Animator animator, QuickHumanBodyBones boneID) { return(animator.GetBoneTransform(boneID).Find("__RotationReference__")); }
public virtual QuickVRNode GetVRNode(QuickHumanBodyBones role) { return(_vrNodes[role]); }