我在“自制”GL 坐标系中有旋转矩阵,并希望将它们应用于 collada 坐标系。
我知道我需要一个矩阵来乘以 GL 旋转以将它们转换为 collada 坐标系(其中 Z 实际上是向上的)。坐标系如下图所示:
我需要从左系统到右系统的转换..为了更多理解:
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 坐标转换为 COLLODA 坐标。
这些是将左系统(您标记为“GL”的系统)转换为右系统(“COLLADA”)的矩阵:
1 0 0
0 0 1
0 1 0
以另一种方式转换您将使用相同的矩阵。
DirectX 和许多库和游戏引擎(不是 OpenGL)使用左手规则系统,几乎所有你会发现的数学模型和设备都使用右手规则,这被称为向量的数学叉积。
这就是为什么不可能将一个系统转换为另一个抛出简单旋转的原因。
你必须选择一个坐标系来工作,尝试使用最常用的,然后做一些有用的函数来转换一个坐标系到另一个坐标系。
作为经验,我可以告诉你四元数是避免这个问题的最好方法,选择正确的矩阵来计算命运的手系统。
如果你有旋转问题(如果你使用超过 90° 的俯仰,你会遇到),搜索云台锁,然后使用四元数,这将节省大量时间和精力。
然后看这个:Euler to Quaternion,并通过 -sin(x) 更改 sin(x) 以在一个坐标系统之间切换到另一个坐标系统。
最好的祝福。