Skip to content

Instantly share code, notes, and snippets.

@TheAllenChou
Last active July 14, 2019 01:59
Show Gist options
  • Save TheAllenChou/e6dc4665e2b3cbedd4b3764d0be313d6 to your computer and use it in GitHub Desktop.
Save TheAllenChou/e6dc4665e2b3cbedd4b3764d0be313d6 to your computer and use it in GitHub Desktop.
public static Vector3 ClampBend(Vector3 vector, Vector3 reference, float maxBendAngle)
{
float vectorLenSqr = vector.sqrMagnitude;
if (vectorLenSqr < MathUtil.Epsilon)
return vector;
float referenceLenSqr = reference.sqrMagnitude;
if (referenceLenSqr < MathUtil.Epsilon)
return vector;
Quaternion bendRot = Quaternion.FromToRotation(reference, vector);
Vector3 axis = QuaternionUtil.GetAxis(bendRot);
float angle = QuaternionUtil.GetAngle(bendRot);
if (angle > MathUtil.Pi)
{
axis = -axis;
angle = MathUtil.TwoPi - angle;
}
if (angle <= maxBendAngle)
return vector;
Quaternion clampedBendRot = QuaternionUtil.AxisAngle(axis, maxBendAngle);
Vector3 result = clampedBendRot * reference;
result *= Mathf.Sqrt(vectorLenSqr) / Mathf.Sqrt(referenceLenSqr);
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment