1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- using UnityEngine;
- using System.Collections;
- namespace RootMotion.FinalIK
- {
- public class VRIKRootController : MonoBehaviour
- {
- public Vector3 pelvisTargetRight { get; private set; }
- private Transform pelvisTarget;
- private Transform leftFootTarget;
- private Transform rightFootTarget;
- private VRIK ik;
- void Awake()
- {
- ik = GetComponent<VRIK>();
- ik.solver.OnPreUpdate += OnPreUpdate;
- Calibrate();
- }
- public void Calibrate()
- {
- if (ik == null)
- {
- Debug.LogError("No VRIK found on VRIKRootController's GameObject.", transform);
- return;
- }
- pelvisTarget = ik.solver.spine.pelvisTarget;
- leftFootTarget = ik.solver.leftLeg.target;
- rightFootTarget = ik.solver.rightLeg.target;
- if (pelvisTarget != null) pelvisTargetRight = Quaternion.Inverse(pelvisTarget.rotation) * ik.references.root.right;
- }
- public void Calibrate(VRIKCalibrator.CalibrationData data)
- {
- if (ik == null)
- {
- Debug.LogError("No VRIK found on VRIKRootController's GameObject.", transform);
- return;
- }
- pelvisTarget = ik.solver.spine.pelvisTarget;
- leftFootTarget = ik.solver.leftLeg.target;
- rightFootTarget = ik.solver.rightLeg.target;
- if (pelvisTarget != null)
- {
- pelvisTargetRight = data.pelvisTargetRight;
- }
- }
- void OnPreUpdate()
- {
- if (!enabled) return;
- if (pelvisTarget != null)
- {
- ik.references.root.position = new Vector3(pelvisTarget.position.x, ik.references.root.position.y, pelvisTarget.position.z);
- Vector3 f = Vector3.Cross(pelvisTarget.rotation * pelvisTargetRight, ik.references.root.up);
- f.y = 0f;
- ik.references.root.rotation = Quaternion.LookRotation(f);
- ik.references.pelvis.position = Vector3.Lerp(ik.references.pelvis.position, pelvisTarget.position, ik.solver.spine.pelvisPositionWeight);
- ik.references.pelvis.rotation = Quaternion.Slerp(ik.references.pelvis.rotation, pelvisTarget.rotation, ik.solver.spine.pelvisRotationWeight);
- }
- else if (leftFootTarget != null && rightFootTarget != null)
- {
- ik.references.root.position = Vector3.Lerp(leftFootTarget.position, rightFootTarget.position, 0.5f);
- }
- }
- void OnDestroy()
- {
- if (ik != null) ik.solver.OnPreUpdate -= OnPreUpdate;
- }
- }
- }
|