C# Unity3D相同的矩阵x4x4不同的EULER

C# Unity3D相同的矩阵x4x4不同的EULER,c#,unity3d,matrix,euler-angles,C#,Unity3d,Matrix,Euler Angles,我有一个使用euler angles的脚本,它在Windows PC和Android设备上的行为不同 我有相同的矩阵X4X4作为输入,但欧拉角不一样 测试代码: var矩阵=新矩阵x4( 新矢量4(-1,0,0,0), 新矢量4(0,1,0,0), 新矢量4(0,0,1,0), 新矢量4(0,0,0,1) ); var-eulers=矩阵.rotation.eulerAngles; Windows设备上的Euler内容为(0, 180,-5.122638,E-05)< /代码>,我认为是正确

我有一个使用euler angles的脚本,它在Windows PC和Android设备上的行为不同

我有相同的矩阵X4X4作为输入,但欧拉角不一样

测试代码:

var矩阵=新矩阵x4(
新矢量4(-1,0,0,0),
新矢量4(0,1,0,0),
新矢量4(0,0,1,0),
新矢量4(0,0,0,1)
);
var-eulers=矩阵.rotation.eulerAngles;
<> Windows设备上的Euler内容为<代码>(0, 180,-5.122638,E-05)< /代码>,我认为是正确的,但是在Android设备上,它的代码>(309.394653,318.791473,256.987244)

这显然弄乱了我的代码。您是否知道如何“规范化”这些结果,使两个EULER相同


矩阵由Tilemap.GetTransformMatrix(Vector3Int位置)返回,应该表示一个tile的方向。

你的矩阵不是一个旋转矩阵(事实上,它是关于YZ平面的反射),因此没有为它定义Euler角的概念。当矩阵不是旋转矩阵时,不指定任何行为,因此您应该假设它可以返回任何内容,甚至不同平台上的不同值。

此外,还可以查看

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

由于浮点的不精确性,哪种表示形式可能会发生微小的变化

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


然而,到目前为止,你得到的价值观似乎有点离谱

它们不是(近似)相同旋转四元数的不同表示,而是完全不同的旋转!我非常怀疑Unity会突然在另一个平台上解释相同的
Matrix4x4
完全不同


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

当@jfd348给我一个提示时,我明白了我想要做什么


你的矩阵不是旋转矩阵(事实上,它是关于YZ平面的反射),所以欧拉角的概念并没有为它定义


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

请注意,欧拉角有很多种。不能保证任何系统使用与另一个系统相同的约定,也不能保证坐标系匹配。文档应该指定坐标系和使用的欧拉角。如果你展示你的代码并解释你的用例,这会有所帮助。。。也许用一个完整的矩阵来得到一个向量3不是最好的方法。。。