我有一项任务,必须在其他两个角度之间夹住一个角度。
问题是限制可以 >360 或
(例如 [-45,45] 或 [275,45])。
考虑到所有特殊情况,有没有一种干净的方法可以做到这一点
案例?
(例如范围 [-45,45] 和输入角度 225 应为 -45)。
提前致谢!
附:我使用的是 unity,所以我手头有所有默认的四元数方法。
当前代码:
Quaternion inputAngle = Quaternion.identity;
if (Character.IsFacingRight)
inputAngle = Quaternion.FromToRotation(forwardVector, playerInput);
else
inputAngle = Quaternion.FromToRotation(playerInput, forwardVector);
Quaternion minAngle = Quaternion.Euler(0F, 0F, addedForce.force.angle);
Quaternion angleRange = Quaternion.Euler(0F, 0F, addedForce.force.angleRange);
Quaternion maxAngle = angleRange * minAngle;
// var yaw = Math.Atan2(2.0 * (inputAngle.y * inputAngle.z + inputAngle.w * inputAngle.x), inputAngle.w * inputAngle.w - inputAngle.x * inputAngle.x - inputAngle.y * inputAngle.y + inputAngle.z * inputAngle.z);
// var pitch = Math.Asin(-2.0 * (inputAngle.x * inputAngle.z - inputAngle.w * inputAngle.y));
float roll = (float)Math.Atan2(2.0 * (inputAngle.x * inputAngle.y + inputAngle.w * inputAngle.z), inputAngle.w * inputAngle.w + inputAngle.x * inputAngle.x - inputAngle.y * inputAngle.y - inputAngle.z * inputAngle.z);
Quaternion correctedRotation = Quaternion.Euler(0F, 0F, roll / Mathf.PI * 180F);
float endAngleZ = ClampRotation2(correctedRotation.eulerAngles.z, minAngle.eulerAngles.z, maxAngle.eulerAngles.z);
Quaternion endAngle = Quaternion.Euler(0F, 0F, endAngleZ);
夹紧旋转2:
public static float ClampRotation2(float angle, float min, float max)
{
if (angle < 0) angle += 360;
if (max < 0) max += 360;
if (min < 0) min += 360;
if (min > max) min -= 360;
return Mathf.Clamp(angle, min, max);
}