问题描述
我有使用欧拉角的脚本,它在 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 平面上正确旋转(或者我应该说是方向)的欧拉。