C++ 将一个坐标系的旋转转换为另一个坐标系所需的矩阵

C++ 将一个坐标系的旋转转换为另一个坐标系所需的矩阵,c++,matrix,rotation,collada,C++,Matrix,Rotation,Collada,我有一个“自制”GL坐标系中的旋转矩阵,我想把它们应用到collada坐标系中 我知道我需要一个矩阵来乘以GL旋转,将它们转换为collada坐标系(其中Z实际上向上)。 坐标系如图所示: 我需要从左系统到右系统的转换..更多了解: ColladMatrix=GLRotMatrix*NeededMatrix 有人知道我需要的矩阵吗?我明白了,我误解了你问题中关于旋转矩阵的部分。我以为你要的是旋转矩阵,它会把GL坐标转换成COLLODA坐标 以下是将左侧系统(您标记为“GL”的系统)转换为右侧系

我有一个“自制”GL坐标系中的旋转矩阵,我想把它们应用到collada坐标系中

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

我需要从左系统到右系统的转换..更多了解:
ColladMatrix=GLRotMatrix*NeededMatrix


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

我明白了,我误解了你问题中关于旋转矩阵的部分。我以为你要的是旋转矩阵,它会把GL坐标转换成COLLODA坐标

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


要以另一种方式进行转换,您将使用相同的矩阵。

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

实际上,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]
希望有帮助

备注:对角化矩阵时也会发生同样的情况(实际上是基的变化),您需要对要对角化的矩阵进行前后相乘


编辑:我为矩阵编写了两个坐标系,因为一般来说,矩阵可以将向量从一个坐标系发送到另一个坐标系。这就更清楚了。

DirectX和许多库和游戏引擎(不是OpenGL)使用左手规则系统,以及几乎所有使用右手规则的数学模型和设备,这是指向量的数学叉积

这就是为什么不可能通过简单的旋转将一个系统转换为另一个系统的原因

您必须选择一个坐标系来工作,尝试使用将使用最多的坐标系,然后制作一些有用的函数来将一个坐标系转换为另一个坐标系

根据经验,我可以告诉你,四元数是避免这个问题的最好方法,选择正确的矩阵来计算命运之手系统

如果您在旋转方面有问题(如果您使用的俯仰角度超过90°),请搜索万向节锁,然后使用四元数,这将节省大量时间和精力

然后看这个:,将sin(x)改为-sin(x),使之在一个坐标系和另一个坐标系之间变化


最好的问候。

你所要求的不能用旋转矩阵来完成,因为旋转可以保留系统和你所使用的两个系统的利手性ẁ 他们有不同的用手习惯。还要注意,在GL中,z轴的方向与图像中的方向相反。此处提供的GL坐标系由我的一位同事创建的框架使用。在我旋转/平移之前,我获取旋转矩阵,然后获取我要移动的关节的点(向量)。之后,我将其转换为完整的变换矩阵(4x4)…最后我将它们应用于节点..所以基本上我要做的是“convertmatrix*rotationmatrix*convertmatrix”,然后得到向量,然后将其转换为transformationmatrix?@CaptainGouLash:只要记住数据当前所在的坐标系就行了。假设从COLLADA坐标数据开始。然后应用转换矩阵,数据以“GL”坐标表示。然后可以应用GL变换。完成后,应用转换矩阵并返回COLLADA坐标。我假设您的点起点x(您要移动的)位于COLLADA坐标中,您希望结果位于COLLADA坐标中,但矩阵位于GL坐标中。要移动点,需要(1)将其从collada变换为GL(2)在GL坐标中变换(3)将结果从GL变换回collada。运算(1)是矩阵B[col->gl],运算(2)是矩阵Xgl,运算(3)是矩阵B(gl->col)。几乎正确。你/有人能给我解释一下这个矩阵吗?一个轴仍然很奇怪。。其他的都可以走了!上下都很好。但是,当我向前移动手臂时,模型向后移动,而轴完全不工作?Y你确定你的图形是正确的吗?你可以试着在左边矩阵的元素(2,3)和右边矩阵的元素(3,2)中都放-1,而不是1。我有时很难理解你想说什么,但让我注意一点:。我也认为你和我一样误解了OP。他没有要求在GL和COLLADA的坐标系之间转换旋转矩阵。我想说的是,旋转是一个“视点问题”,从你用来建模旋转的视点到另一个具有不同旋转模型的观察者,一切都是相对的。你需要把问题“翻译”成你的观点来正确处理它。我所知道的避免这种“转换”问题的唯一方法是使用四元数,但是,一开始理解起来有点复杂。
                  [1 0 0                  [1 0 0
MatrixCollada  =   0 0 1   * MatrixGL *    0 0 1
                   0 1 0]                  0 1 0]