protected virtual void UpdateFingerSeparation(QuickHumanFingers f, QuickFingerPose fPose, FingerBones fBones) { Vector3 rotAxis = fBones.GetRotAxisSeparate(); float t = (fPose._separation + 1) / 2.0f; float maxAngle = GetMaxAngleSeparation(f); float rotAngle = Mathf.Lerp(-maxAngle, maxAngle, t); fBones[0].Rotate(rotAxis, rotAngle, Space.Self); }
protected virtual void UpdateFingerClose(QuickHumanFingers f, QuickFingerPose fPose, FingerBones fBones) { Vector3 rotAxis = fBones.GetRotAxisClose(); GetAngleLimitsClose(f, out float minAngle, out float maxAngle); for (int i = 0; i < 3; i++) { float rotAngle = Mathf.Lerp(minAngle, maxAngle, fPose.GetCloseFactor(i)); fBones[i].Rotate(rotAxis, rotAngle, Space.Self); } }
protected virtual void UpdateFingers() { for (int i = 0; i < 5; i++) { QuickHumanFingers f = _humanFingers[i]; FingerBones fBones = _fingerBoneTransforms[f]; QuickFingerPose fPose = new QuickFingerPose(); //Close factor for (int j = 0; j < 3; j++) { if (i == 0 && _blendThumbUp > 0) { fPose.SetCloseFactor(j, Mathf.Lerp(_handPoseNeutral[i].GetCloseFactor(j), _handPoseThumbUp[i].GetCloseFactor(j), _blendThumbUp)); } else if (i == 1 && _blendPoint > 0) { fPose.SetCloseFactor(j, Mathf.Lerp(_handPoseNeutral[i].GetCloseFactor(j), 0, _blendPoint)); } else { fPose.SetCloseFactor(j, Mathf.Lerp(_handPoseNeutral[i].GetCloseFactor(j), _handPoseClosed[i].GetCloseFactor(j), _closeFactor)); } } //Separation factor if (i == 0 && _blendThumbUp > 0) { fPose._separation = Mathf.Lerp(_handPoseNeutral[i]._separation, _handPoseThumbUp[i]._separation, _blendThumbUp); } else { fPose._separation = Mathf.Lerp(_handPoseNeutral[i]._separation, _handPoseClosed[i]._separation, _closeFactor); } if (fBones.CheckTransforms()) { ResetFingerRotation(fBones); UpdateFingerClose(f, fPose, fBones); UpdateFingerSeparation(f, fPose, fBones); } } }