Preventing Quaternion.RotateTowards from using shortest distance
I'm using procedural animation to slowly aim limbs and turrets at stuff with Quaternion.LookRotation and RotateTowards and they are clamped up to a specific angle from a "root" transform. My current problem is that if the parent object moves or turns too quickly, the limbs will rotate through the supposedly inaccessible clamped angles in order to reach the new target angle instead of going the long way through the accessible angles. Any way I can deal with this?
Relevant code snippet including clamping for clarity:
//parent is the rotation it will default to when inactive
//root is the rotation that is compared to when checking for max angle
public virtual void Look(Vector3 point) {
if (!initialized)
return;
Vector3 dir = point - transform.position;
Quaternion rot = Quaternion.LookRotation (dir, upVector);
Quaternion forward = Quaternion.LookRotation (root.forward, root.up);
if (clamp)
rot = ClampRot(rot, forward);
targetRot = Quaternion.Lerp(parent.rotation, rot, factorCurrent); //factorCurrent dictates the bias of the lookAt between the source and target rotations
currentRot = Quaternion.RotateTowards(currentRot, targetRot, Time.deltaTime * speed); //this is what needs work
}
public virtual Quaternion ClampRot(Quaternion rot, Quaternion forward)
{
float angle = Quaternion.Angle(rot, forward);
if (angle > clampAngleMax)
return Quaternion.RotateTowards(forward, rot, clampAngleMax);
else
return rot;
}
And to illustrate here's a clip of it in action with the issues visible Relevant timestamps are at 1:00 and 1:20
I'd appreciate any and all insight you have into this problem because i'm planning on reusing this method of clamped aiming in other projects. Thanks!
Your answer

Follow this Question
Related Questions
Clamping Wrapping Rotation to Fixed Angle 0 Answers
ARKit, head turning, clamp 2 Answers
Child object looktowards waypoint 0 Answers
Turning the camera 0 Answers