holopy3/Assets/Plugins/RootMotion/FinalIK/Tools/BodyTilt.cs

53 lines
1.4 KiB
C#
Raw Permalink Normal View History

2020-12-10 14:25:12 +00:00
using UnityEngine;
using System.Collections;
namespace RootMotion.FinalIK {
/// <summary>
/// Procedural body tilting with FBBIK.
/// </summary>
public class BodyTilt: OffsetModifier {
[Tooltip("Speed of tilting")]
public float tiltSpeed = 6f;
[Tooltip("Sensitivity of tilting")]
public float tiltSensitivity = 0.07f;
[Tooltip("The OffsetPose components")]
public OffsetPose poseLeft, poseRight;
private float tiltAngle;
private Vector3 lastForward;
protected override void Start() {
base.Start();
// Store current character forward axis and Time
lastForward = transform.forward;
}
// Called by IKSolverFullBody before updating
protected override void OnModifyOffset() {
// Calculate the angular delta in character rotation
Quaternion change = Quaternion.FromToRotation(lastForward, transform.forward);
float deltaAngle = 0;
Vector3 axis = Vector3.zero;
change.ToAngleAxis(out deltaAngle, out axis);
if (axis.y > 0) deltaAngle = -deltaAngle;
deltaAngle *= tiltSensitivity * 0.01f;
deltaAngle /= deltaTime;
deltaAngle = Mathf.Clamp(deltaAngle, -1f, 1f);
tiltAngle = Mathf.Lerp(tiltAngle, deltaAngle, deltaTime * tiltSpeed);
// Applying positionOffsets
float tiltF = Mathf.Abs(tiltAngle) / 1f;
if (tiltAngle < 0) poseRight.Apply(ik.solver, tiltF);
else poseLeft.Apply(ik.solver, tiltF);
// Store current character forward axis and Time
lastForward = transform.forward;
}
}
}