欧拉角度旋转到方向不正确的 X 轴

Euler Angle Rotation To Direction Incorrect X Axis

提问人:drilager60 提问时间:11/13/2023 最后编辑:drilager60 更新时间:11/14/2023 访问量:49

问:

我正在开发这个游戏,其中我有一个局部欧拉角来控制相机瞄准的位置。其水平范围为 0 - 360,垂直范围为 -88 - 88。我还有一个游戏对象的世界位置向量,我希望该欧拉角瞄准它。

在我的计算中,Y(水平)的欧拉角大部分是正确的,并且工作得很好。但是,只要相机 Y 轴不超过 5.f 或低于 5.f,X 轴(垂直)就可以工作。

这是计算

Vector2 CalcEuler(Vector3 dst, Vector3 src)
{
    //dst is game object vector position, src is player camera position
    UnityEngine_Quaternion_o quat = UnityEngine_Quaternion_o::LookRotation((dst - src).ToUnityVec3(), UnityEngine_Vector3_o::get_right());
    Vector3 euler = quat.get_eulerAngles();
    return { euler.y, euler.x };
}

Euler.y 完美返回正确的水平旋转。然而,euler.x 确实返回了正确的垂直旋转,但如果对象位置 Y 高于或低于本地相机位置,它将返回高于 Y 可以支持的最大欧拉数字(大约 256.f)

答:

while (euler.x >= 88.f)
    euler.x -= 360.f;

while (euler.x <= -88.f)
    euler.x += 360.f;

if (euler.x > 0.6f) {
    euler.x = -euler.x + 0.6f;
}
else if (euler.x < -0.6)
    euler.x = fabsf(euler.x) - 0.6;
C# unity-游戏引擎 数学

评论

0赞 BugFinder 11/13/2023
是的,360 数字 = 比如 256
0赞 drilager60 11/13/2023
@BugFinder返回的值通常是随机的,但始终高于 200。现在我尝试使用 Vector3.up 而不是 Vector3.right,结果是相同的,只是现在如果物体在我的相机 Y 上方或下方,它会拍摄到 359.99 作为最大 Y
0赞 derHugo 11/13/2023
有点困惑为什么你从一个方向到四元数,然后回到欧拉角.立即在欧拉中计算不是更容易吗?
0赞 drilager60 11/13/2023
@derHugo是的,但是由于我在与 c# 代码/类交互时使用 c++,因此我无法正确分配或创建新的类实例。我被迫使用静态函数。
0赞 derHugo 11/13/2023
Vector3 euler = quat.get_eulerAngles();无论如何,几乎分配了一个 Vector3,对吧?

答: 暂无答案