gpt4 book ai didi

c# - Unity - 任意角度之间的夹具旋转

转载 作者:行者123 更新时间:2023-11-30 23:13:46 25 4
gpt4 key购买 nike

我有一个任务,我必须在其他两个角度之间夹紧一个角度。

The catch is that the limits can be >360 or <0

(例如 [-45,45] 或 [275,45])。

Is there a clean way to do this taking into account all the special cases?

(例如范围 [-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);

ClampRotation2:

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);
}

最佳答案

好的,所以我找到了在所有情况下都能正确夹紧角度的解决方案,

Quaternion.Angle() 带给您,我呈现:

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;

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);
float correctedRotation = roll / Mathf.PI * 180F;

float minAngleF = minAngle.eulerAngles.z;
float maxAngleF = maxAngle.eulerAngles.z;

if (correctedRotation < 0) correctedRotation += 360;

if (maxAngleF < 0) maxAngleF += 360;

if (minAngleF < 0) minAngleF += 360;
if (minAngleF > maxAngleF) minAngleF -= 360;

if (correctedRotation < minAngleF || correctedRotation > maxAngleF)
{
float rotationToMax = Quaternion.Angle(Quaternion.Euler(0F, 0F, correctedRotation), Quaternion.Euler(0F, 0F, maxAngleF));
float rotationToMin = Quaternion.Angle(Quaternion.Euler(0F, 0F, correctedRotation), Quaternion.Euler(0F, 0F, minAngleF));
if (Mathf.Abs(rotationToMax) < Mathf.Abs(rotationToMin))
correctedRotation = maxAngleF;
else
correctedRotation = minAngleF;
}
Quaternion endAngle = Quaternion.Euler(0F, 0F, correctedRotation);

关于c# - Unity - 任意角度之间的夹具旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43492004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com