Matrix需要将一个坐标系的旋转转换为另一个坐标系

时间:2013-04-03 12:56:29

标签: c++ matrix rotation collada

我在“自制”GL坐标系中有旋转矩阵,并希望将它们应用于collada坐标系。

我知道我需要一个矩阵来乘以GL旋转,将它们转换为collada坐标系(其中Z实际上是UP)。 坐标系统如下图所示:

enter image description here

我需要从左侧系统到右侧系统的转换...以获得更多理解:
ColladaMatrix = GLRotMatrix * NeededMatrix

有人知道我需要的矩阵吗?

3 个答案:

答案 0 :(得分:3)

我认为您需要乘以两个矩阵来更改旋转矩阵的基础。

实际上,ColladaMatrix就是那个(col [col]坐标,GL坐标中的[gl])

y [col] = R [col,col] x [col]

但是如果要使用GL矩阵,则需要将x [col]转换为GL坐标,然后在GL基础上应用旋转,最后返回Collada坐标。所以

y [col] = B [gl-> col] R [gl,gl] B [col-> gl] x [col]

所以,

  

R [col,col] = B [gl-> col] R [gl,gl] B [col-> gl]

这里B [gl-> col]和B [col-> gl]是相同的,所以

                  [1 0 0                  [1 0 0
MatrixCollada  =   0 0 1   * MatrixGL *    0 0 1
                   0 1 0]                  0 1 0]

希望它有所帮助!

备注:在对矩阵进行对角化时(实际上是基础的变化)也会发生同样的情况,你需要预先和后乘以你想要对角化的矩阵。

编辑:我为矩阵编写了两个坐标系,因为一般来说,矩阵可以将一个矢量从坐标系发送到另一个坐标系。这使得它更加清晰。

答案 1 :(得分:0)

我明白了,我在你的问题中误读了关于旋转矩阵的部分。我以为你要求旋转矩阵,将GL坐标转换为COLLODA坐标。

这些是将左侧系统(您标记为“GL”的系统)转换为右侧系统(“COLLADA”)的矩阵:

1 0 0
0 0 1
0 1 0

以相反的方式转换你将使用相同的矩阵。

答案 2 :(得分:0)

DirectX和许多库和游戏引擎(不是OpenGL)使用左手规则系统,几乎所有你会发现的数学模型和设备都使用右手规则,这是指向量的数学交叉产品。

这就是为什么没有可能将一个系统转换为另一个系统抛出简单的旋转。

您必须选择一个coord系统才能工作,尝试使用最常用的系统,然后制作一些有用的功能,将一个coord系统转换为另一个系统。

对于经验,我可以告诉你,四元数是解决这个问题的最佳方法,选择正确的矩阵来统计命运的手系统。

如果您在旋转方面遇到问题(如果您使用超过90°的音高),请搜索万向节锁定,然后使用四元数,这将节省大量时间和精力。

然后查看:Euler to Quaternion,并将sin(x)改为-sin(x),以便在一个坐标系与另一个坐标系之间进行切换。

最好的问候。