欧拉旋转问题

Euler Rotation Issue

我正在使用 C# 编写一段简单的代码,以确保玩家模型的头部指向鼠标的 Vector3 位置 (lookPoint),但它夹在 90 度范围内,即 45 度到鼠标的任一侧躯干的当前方向。

我已经研究过欧拉角的结果,以确保获得所需的 y 轴旋转值,但我对欧拉角何时应再次循环到 0 感到困惑,我可以似乎想出了解决办法。

 minRot = myTorso.transform.rotation.eulerAngles.y-180f-45f;
 maxRot = myTorso.transform.rotation.eulerAngles.y-180f+45f;

 lookDirection = Mathf.Atan2(lookPoint.x - transform.position.x, lookPoint.z - transform.position.z);
 lookRotation = Mathf.Clamp(Mathf.Rad2Deg * lookDirection, minRot, maxRot);

 myHead.eulerAngles = new Vector3(0,lookRotation,0);

这会导致头部在无法弄清楚它的最大值或最小值应该是多少时迅速回到极端之一。

任何人都可以帮我定义 minRot 和 maxRot 以便它解释 180 度交叉吗?

这应该可以满足您的需求。我只是基于提供的变量和代码,所以事情可能无法完美运行。所以如果没有,请告诉我,我们可以调整:

lookDirection = Mathf.Atan2(lookPoint.x - transform.position.x, 
                            lookPoint.z - transform.position.z) * Mathf.Rad2Deg;
Quaternion q = Quaternion.Euler(new Vector3(0, lookDirection, 0));
Quaternion targetRotation = new Quaternion();
Quaternion torsoRotation = myTorso.transform.rotation;
// Check if the angle is outside the 45degree range
if (Quaternion.Angle(q, torsoRotation) <= 45.0f)
    targetRotation = q;
else
{
    // This is to check which direction we're out of range
    float d = Mathf.DeltaAngle(q.eulerAngles.y, torsoRotation.eulerAngles.y);
    if (d > 0.0f)
        target = torsoRotation * Quaternion.Euler(0, -45f, 0);
    else if (d < 0.0f)
        target = torsoRotation * Quaternion.Euler(0, 45f, 0);
}
myHead.rotation = targetRotation;