protected virtual void OnDrawGizmos() { Gizmos.color = Color.green; foreach (var pair in _vrNodes) { QuickVRNode n = pair.Value; if (n.IsTracked()) { DebugExtension.DrawCoordinatesSystem(n.transform.position, n.transform.right, n.transform.up, n.transform.forward, 0.05f); float s = 0.0125f; Vector3 cSize = Vector3.one * s; Gizmos.matrix = n.transform.localToWorldMatrix; Gizmos.DrawCube(Vector3.zero, cSize); QuickTrackedObject tObject = n.GetTrackedObject(); if (tObject.transform.localPosition != Vector3.zero) { Gizmos.DrawSphere(tObject.transform.localPosition, s * 0.5f); Gizmos.DrawLine(Vector3.zero, tObject.transform.localPosition); } Gizmos.matrix = Matrix4x4.identity; } } }
public virtual QuickVRNode GetVRNodeMain() { QuickVRNode nodeHips = GetVRNode(HumanBodyBones.Hips); QuickVRNode nodeHead = GetVRNode(HumanBodyBones.Head); return(nodeHips.IsTracked() ? nodeHips : nodeHead); }
public virtual void UpdateIKTargets() { if (Application.isPlaying) { //1) Update all the IKTargets taking into consideration its ControlType. for (IKBone ikBone = IKBone.Hips; ikBone < IKBone.LastBone; ikBone++) { ControlType cType = GetIKControl(ikBone); HumanBodyBones boneID = ToHumanBodyBones(ikBone); GetIKSolver(ikBone)._enableIK = cType != ControlType.Animation; if (cType == ControlType.Tracking) { QuickVRNode node = _vrPlayArea.GetVRNode(boneID); if (node.IsTracked()) { //Update the QuickVRNode's position UpdateIKTargetPosFromUser(node, boneID); //Update the QuickVRNode's rotation UpdateIKTargetRotFromUser(node, boneID); if (boneID == HumanBodyBones.Head) { QuickIKSolver ikSolverHead = GetIKSolver(IKBone.Head); if (!_applyHeadPosition) { ikSolverHead._weightIKPos = 0; } if (!_applyHeadRotation) { ikSolverHead._weightIKRot = 0; } } else if (boneID == HumanBodyBones.LeftEye || boneID == HumanBodyBones.RightEye) { QuickIKSolverEye ikSolver = (QuickIKSolverEye)_animator.GetComponent <QuickIKManager>().GetIKSolver(boneID); ikSolver._weightBlink = ((QuickVRNodeEye)node).GetBlinkFactor(); } } } } //2) Special case. If the Hips is set to Tracking mode, we need to adjust the IKTarget position of the hips //in a way that the head will match the position of the camera provided by the HMD if (GetIKControl(IKBone.Hips) == ControlType.Tracking) { QuickIKSolver ikSolverHips = GetIKSolver(IKBone.Hips); QuickIKSolver ikSolverHead = GetIKSolver(IKBone.Head); float chainLength = Vector3.Distance(_animator.GetBoneTransform(HumanBodyBones.Hips).position, _animator.GetBoneTransform(HumanBodyBones.Head).position); Vector3 v = (ikSolverHips._targetLimb.position - ikSolverHead._targetLimb.position).normalized; ikSolverHips._targetLimb.position = ikSolverHead._targetLimb.position + v * chainLength; } UpdateVRCursors(); _footprints.gameObject.SetActive(_useFootprints); } }
protected virtual void CoUpdateTrackedNode() { QuickVRNode hipsNode = _vrPlayArea.GetVRNode(HumanBodyBones.Hips); if (hipsNode) { QuickTrackedObject tObject = hipsNode.IsTracked()? hipsNode.GetTrackedObject() : _vrPlayArea.GetVRNode(HumanBodyBones.Head).GetTrackedObject(); if (tObject != _trackedObject) { _trackedObject = tObject; Init(); } } }
public virtual float GetFingerLength(QuickHumanFingers f, bool isLeft) { List <QuickHumanBodyBones> boneFingers = QuickHumanTrait.GetBonesFromFinger(f, isLeft); HumanBodyBones boneID = (HumanBodyBones)boneFingers[0]; if (_fingerLength[boneID] == 0) { QuickVRNode n0 = GetVRNode(boneFingers[0]); QuickVRNode n1 = GetVRNode(boneFingers[1]); QuickVRNode n2 = GetVRNode(boneFingers[2]); if (n0.IsTracked() && n1.IsTracked() && n2.IsTracked()) { _fingerLength[boneID] = Vector3.Distance(n0.transform.position, n1.transform.position) + Vector3.Distance(n1.transform.position, n2.transform.position); } } return(_fingerLength[boneID]); }
public virtual bool IsVRNodesSwaped(QuickVRNode nodeLeft, QuickVRNode nodeRight, bool doSwaping = true) { bool result = false; QuickVRNode hmdNode = GetVRNode(HumanBodyBones.Head); if (hmdNode.IsTracked() && nodeLeft.IsTracked() && nodeRight.IsTracked()) { float dLeft = Vector3.Dot(nodeLeft.transform.position - hmdNode.transform.position, hmdNode.transform.right); float dRight = Vector3.Dot(nodeRight.transform.position - hmdNode.transform.position, hmdNode.transform.right); result = dLeft > dRight; if (result && doSwaping) { SwapQuickVRNode(nodeLeft, nodeRight); } } return(result); }
protected override void UpdateIKFingers() { if (_vrPlayArea) { //if (_boneFingers == null) //{ // InitBoneFingers(); //} //for (int j = 0; j < _boneFingers.Count; j+= 4) //{ // if (_boneFingers[j].Key != null) // { // for (int i = 0; i < 3; i++) // { // if ((i == 0 && (j == 0 || j == 20)) && QuickVRManager._handTrackingMode == QuickVRManager.HandTrackingMode.Controllers) // { // //HACK // //Avoid applying the rotation to the thumb distal fingers as the results look weird. Look for a better method // //of transfering the bone rotations when using the controllers. // continue; // } // ApplyFingerRotation(_boneFingers[j + i], _boneFingers[j + i + 1]); // } // } //} //foreach (bool b in new bool[] { true, false }) //{ // foreach (QuickHumanFingers f in QuickHumanTrait.GetHumanFingers()) // { // List<QuickHumanBodyBones> fingerBones = QuickHumanTrait.GetBonesFromFinger(f, b); // List<Quaternion> initialFingerBonesLocalRotations = new List<Quaternion>(); // for (int i = 0; i < fingerBones.Count - 1; i++) // { // QuickHumanBodyBones fBoneID = fingerBones[i]; // initialFingerBonesLocalRotations.Add(_animator.GetBoneTransform(fBoneID).localRotation); // if (_animator.GetBoneTransform(fBoneID) && _vrPlayArea.GetVRNode(fBoneID).IsTracked()) // { // ApplyFingerRotation(fBoneID, fingerBones[i + 1]); // } // } // //At this point the finger is correctly aligned. Set the targets to match this. // //HumanBodyBones boneID = (HumanBodyBones)fingerBones[2]; // //QuickIKSolver ikSolver = GetIKSolver(boneID); // //Transform tBone = _animator.GetBoneTransform(boneID); // //ikSolver._targetLimb.position = tBone.position; // //ikSolver._targetLimb.GetChild(0).rotation = tBone.rotation; // //ikSolver._targetHint.position = ikSolver._boneMid.position + (ikSolver._boneMid.position - ikSolver._boneUpper.position) + (ikSolver._boneMid.position - ikSolver._boneLimb.position); // ////Restore the rotation of the bone fingers // //ikSolver._boneUpper.localRotation = initialFingerBonesLocalRotations[0]; // //ikSolver._boneMid.localRotation = initialFingerBonesLocalRotations[1]; // //ikSolver._boneLimb.localRotation = initialFingerBonesLocalRotations[2]; // } //} //foreach (bool b in new bool[] { true, false }) //{ // foreach (QuickHumanFingers f in QuickHumanTrait.GetHumanFingers()) // { // List<QuickHumanBodyBones> fingerBones = QuickHumanTrait.GetBonesFromFinger(f, b); // List<Quaternion> initialFingerBonesLocalRotations = new List<Quaternion>(); // for (int i = 0; i < fingerBones.Count - 1; i++) // { // QuickHumanBodyBones fBoneID = fingerBones[i]; // initialFingerBonesLocalRotations.Add(_animator.GetBoneTransform(fBoneID).localRotation); // if (_animator.GetBoneTransform(fBoneID) && _vrPlayArea.GetVRNode(fBoneID).IsTracked()) // { // ApplyFingerRotation(fBoneID, fingerBones[i + 1]); // } // } // //At this point the finger is correctly aligned. Set the targets to match this. // //HumanBodyBones boneID = (HumanBodyBones)fingerBones[2]; // //QuickIKSolver ikSolver = GetIKSolver(boneID); // //Transform tBone = _animator.GetBoneTransform(boneID); // //ikSolver._targetLimb.position = tBone.position; // //ikSolver._targetLimb.GetChild(0).rotation = tBone.rotation; // //ikSolver._targetHint.position = ikSolver._boneMid.position + (ikSolver._boneMid.position - ikSolver._boneUpper.position) + (ikSolver._boneMid.position - ikSolver._boneLimb.position); // ////Restore the rotation of the bone fingers // //ikSolver._boneUpper.localRotation = initialFingerBonesLocalRotations[0]; // //ikSolver._boneMid.localRotation = initialFingerBonesLocalRotations[1]; // //ikSolver._boneLimb.localRotation = initialFingerBonesLocalRotations[2]; // } //} //foreach (bool isLeft in new bool[] { true, false }) //{ // foreach (QuickHumanFingers f in QuickHumanTrait.GetHumanFingers()) // { // float fLength = _vrPlayArea.GetFingerLength(f, isLeft); // if (fLength > 0) // { // List<QuickHumanBodyBones> fingerBones = QuickHumanTrait.GetBonesFromFinger(f, isLeft); // QuickVRNode n0 = _vrPlayArea.GetVRNode(fingerBones[0]); // QuickVRNode n1 = _vrPlayArea.GetVRNode(fingerBones[1]); // QuickVRNode n2 = _vrPlayArea.GetVRNode(fingerBones[2]); // QuickIKSolver ikSolver = GetIKSolver((HumanBodyBones)fingerBones[2]); // if (n0.IsTracked() && n2.IsTracked()) // { // float sf = ikSolver.GetChainLength() / fLength; // Vector3 v = sf * (n2.transform.position - n0.transform.position); // ikSolver._targetLimb.position = ikSolver._boneUpper.position + v; // ikSolver._targetHint.position = ikSolver._boneMid.position + (n1.transform.position - n0.transform.position) + (n1.transform.position - n2.transform.position); // } // } // } //} foreach (bool isLeft in new bool[] { true, false }) { foreach (QuickHumanFingers f in QuickHumanTrait.GetHumanFingers()) { List <QuickHumanBodyBones> fingerBones = QuickHumanTrait.GetBonesFromFinger(f, isLeft); QuickVRNode n0 = _vrPlayArea.GetVRNode(fingerBones[0]); QuickVRNode n1 = _vrPlayArea.GetVRNode(fingerBones[1]); QuickVRNode n2 = _vrPlayArea.GetVRNode(fingerBones[2]); if (n0.IsTracked() && n1.IsTracked() && n2.IsTracked()) { QuickIKSolver ikSolver = GetIKSolver((HumanBodyBones)fingerBones[2]); Vector3 v = (n1.transform.position - n0.transform.position).normalized; Vector3 w = (n2.transform.position - n1.transform.position).normalized; ikSolver._targetLimb.position = ikSolver._boneUpper.position + v * ikSolver.GetUpperLength() + w * ikSolver.GetMidLength(); ikSolver._targetLimb.rotation = n2.transform.rotation; ikSolver._targetHint.position = ikSolver._boneMid.position + n1.transform.up * DEFAULT_TARGET_HINT_FINGER_DISTANCE; ikSolver._targetHint.rotation = n1.transform.rotation; //ikSolver._targetHint.position = ikSolver._boneMid.position + (n1.transform.position - n0.transform.position) + (n1.transform.position - n2.transform.position); } } } } base.UpdateIKFingers(); }