我需要从左侧系统到右侧系统的转换...为了更好地理解: ColladaMatrix=GLRotMatrix*NeededMatrix 有人知道我需要的矩阵吗?
我认为你需要用两个矩阵相乘来改变旋转矩阵的基础。
事实上,ColladaMatrix是这样做的([col]表示Collada坐标系中的列,[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]
希望这能有所帮助!
注:对于对角化矩阵(实际上是基底变换),当你需要将其对角化时,你需要在矩阵左右两侧进行乘法。
编辑:我为矩阵写了两个坐标系,因为通常情况下,一个矩阵可以将一个向量从一个坐标系发送到另一个坐标系。这样更加清晰易懂。
我明白了,我误读了你问题中关于旋转矩阵的部分。我以为你在问的是旋转矩阵,它可以将GL坐标转换为COLLADA坐标。
以下是将左侧系统(你标记为“GL”的那个)转换为右侧系统(“COLLADA”)的矩阵:
1 0 0
0 0 1
0 1 0
要进行相反的转换,您将使用相同的矩阵。
DirectX和许多库和游戏引擎(不包括OpenGL)使用左手规则系统,而几乎所有的数学模型和设备都使用右手规则,这是指向量的数学叉积。
这就是为什么没有可能通过简单的旋转将一个系统转换为另一个系统。
您必须选择一个坐标系来工作,尽量使用最常用的那个,然后编写一些有用的函数来将一个坐标系转换为另一个坐标系。
根据我的经验,我可以告诉您四元数是避免这些问题的最佳方法,选择正确的矩阵考虑目标的手性系统。
如果您在旋转方面遇到问题(如果您使用的俯仰角大于90°),请搜索万向节锁定,然后使用四元数,这将节省大量时间和精力。
然后查看此链接:Euler to Quaternion,并将sin(x)更改为-sin(x),以在两个坐标系之间进行转换。
最好的问候。