Unity3D 相同的 Matrix4x4 不同的欧拉

Unity3D Same Matrix4x4 different eulers

我有使用欧拉角的脚本,它在 Windows PC 和 Android 设备上的表现不同。

我有与输入相同的 Matrix4x4,但欧拉角不一样。

测试代码:

var matrix = new Matrix4x4(
    new Vector4(-1, 0, 0, 0),
    new Vector4(0, 1, 0, 0),
    new Vector4(0, 0, 1, 0),
    new Vector4(0, 0, 0, 1)
);

var eulers = matrix.rotation.eulerAngles;

Windows 设备上 euler 的内容是 (0, 180, -5.12263832E-05),我认为这是正确的,但在 Android 设备上是 (309.394653, 318.791473, 256.987244)

这显然弄乱了我的代码。您知道如何“规范化”这些结果以使两个欧拉方程相同吗?

矩阵由 Tilemap.GetTransformMatrix(Vector3Int position) 返回,应该表示图块的方向。

您的矩阵不是旋转矩阵(实际上,它是关于 YZ 平面的反射),因此欧拉角的概念本身未定义The documentation for Matrix4x4.rotation 没有指定矩阵不是旋转矩阵时的任何行为,因此您应该假设它可以 return 任何东西 ,甚至不同平台上的不同值。

除了 also see Quaternion.eulerAngles

When you read the .eulerAngles property, Unity converts the Quaternion's internal representation of the rotation to Euler angles. Because, there is more than one way to represent any given rotation using Euler angles, the values you read back out may be quite different from the values you assigned.

当可能由于浮点不精确而发生微小变化时,究竟选择了哪种表示。

=> Fazit:尽量避免使用欧拉角。


但是,到目前为止,您获得的值似乎出现了奇怪的偏差!

它们不是(近似)相同旋转 Quaternion 值的不同表示的问题,而是完全不同的旋转!我非常怀疑Unity会突然在另一个平台

上解释相同的Matrix4x4完全不同

-> 您似乎没有向我们展示实际的整个用例。

@jfd348 给了我一个提示,我想出了我想做什么。

Your matrix is not a rotation matrix (in fact, it is a reflection about the YZ plane), so the very notion of Euler angles is not defined for it.

我使用 var quat = Quaternion.LookRotation(matrix.GetColumn(2), matrix.GetColumn(1)); 构建了一个四元数,它可以转换为表示二维平面上正确旋转(或者我应该说方向)的欧拉。