Unity3D 相同的 Matrix4x4 不同的欧拉

问题描述

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

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

测试代码

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

var eulers = matrix.rotation.eulerAngles;

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

这显然弄乱了我的代码。您知道如何“标准化”这些结果,以便两个欧拉都相同吗?

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

解决方法

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

,

除了 this answer 还可以看到 Quaternion.eulerAngles

当您读取 .eulerAngles 属性时,Unity 会将 Quaternion 旋转的内部表示转换为欧拉角。 因为使用欧拉角表示任何给定旋转的方法不止一种,所以您读出的值可能与您指定的值大不相同。

当由于浮点不精确而可能会因微小的变化而变化时,确切地选择了哪种表示。

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


然而,到目前为止,您获得的值似乎很奇怪!

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

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

,

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

您的矩阵不是旋转矩阵(实际上,它是关于 YZ 平面的反射),因此没有为它定义欧拉角的概念。

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