OffsetPose.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace RootMotion.FinalIK {
  4. /// <summary>
  5. /// Definition of FBBIK Offset pose.
  6. /// </summary>
  7. public class OffsetPose: MonoBehaviour {
  8. /// <summary>
  9. /// State of an effector in this pose
  10. /// </summary>
  11. [System.Serializable]
  12. public class EffectorLink {
  13. public FullBodyBipedEffector effector; // The effector type (this is just an enum)
  14. public Vector3 offset; // Offset of the effector in this pose
  15. public Vector3 pin; // Pin position relative to the solver root Transform
  16. public Vector3 pinWeight; // Pin weight vector
  17. // Apply positionOffset to the effector
  18. public void Apply(IKSolverFullBodyBiped solver, float weight, Quaternion rotation) {
  19. // Offset
  20. solver.GetEffector(effector).positionOffset += rotation * offset * weight;
  21. // Calculating pinned position
  22. Vector3 pinPosition = solver.GetRoot().position + rotation * pin;
  23. Vector3 pinPositionOffset = pinPosition - solver.GetEffector(effector).bone.position;
  24. Vector3 pinWeightVector = pinWeight * Mathf.Abs(weight);
  25. // Lerping to pinned position
  26. solver.GetEffector(effector).positionOffset = new Vector3(
  27. Mathf.Lerp(solver.GetEffector(effector).positionOffset.x, pinPositionOffset.x, pinWeightVector.x),
  28. Mathf.Lerp(solver.GetEffector(effector).positionOffset.y, pinPositionOffset.y, pinWeightVector.y),
  29. Mathf.Lerp(solver.GetEffector(effector).positionOffset.z, pinPositionOffset.z, pinWeightVector.z)
  30. );
  31. }
  32. }
  33. public EffectorLink[] effectorLinks = new EffectorLink[0];
  34. // Apply positionOffsets of all the EffectorLinks
  35. public void Apply(IKSolverFullBodyBiped solver, float weight) {
  36. for (int i = 0; i < effectorLinks.Length; i++) effectorLinks[i].Apply(solver, weight, solver.GetRoot().rotation);
  37. }
  38. public void Apply(IKSolverFullBodyBiped solver, float weight, Quaternion rotation) {
  39. for (int i = 0; i < effectorLinks.Length; i++) effectorLinks[i].Apply(solver, weight, rotation);
  40. }
  41. }
  42. }