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

3
我有一个在"自制"的GL坐标系统中的旋转矩阵,并希望将它们应用于Collada坐标系统。 我知道我需要一个矩阵来乘以GL旋转矩阵,将它们转换为Collada坐标系统(其中Z实际上是UP)。 这些坐标系统在这里的图片中显示:
我需要从左侧系统到右侧系统的转换...为了更好地理解: ColladaMatrix=GLRotMatrix*NeededMatrix 有人知道我需要的矩阵吗?

1
你所要求的无法使用旋转矩阵完成,因为旋转保留系统的左右手性,而你展示的两个系统具有不同的左右手性。另外请注意,在GL中,z轴的方向与你的图像相反。 - Nobody moving away from SE
这里提供的GL坐标系是由我的一位同事创建的框架使用的。 - Captain GouLash
3个回答

5

我认为你需要用两个矩阵相乘来改变旋转矩阵的基础。

事实上,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]

希望这能有所帮助!

:对于对角化矩阵(实际上是基底变换),当你需要将其对角化时,你需要在矩阵左右两侧进行乘法。

编辑:我为矩阵写了两个坐标系,因为通常情况下,一个矩阵可以将一个向量从一个坐标系发送到另一个坐标系。这样更加清晰易懂。


在旋转/平移之前,我会获取旋转矩阵,然后获取我想要移动的关节点(向量)..之后我将其转换为完整的变换矩阵(4x4)..最后将它们应用到节点上..所以基本上我需要做的是 "convertmatrix * rotationmatrix * convertmatrix",然后获取向量,然后将其转换为变换矩阵? - Captain GouLash
1
@CaptainGouLash:只需要记住您的数据当前所在的坐标系即可。假设您从COLLADA坐标数据开始。然后应用转换矩阵,将数据转换为“GL”坐标。然后可以应用GL变换。完成后,再次应用转换矩阵,回到COLLADA坐标系。 - Nobody moving away from SE
我假设您的起始点x(您想要移动的点)在collada坐标系中,您希望结果以collada坐标系呈现,但矩阵在GL坐标系中。为了移动您的点,您需要(1)将其从collada转换为GL(2)在GL坐标系中进行变换(3)将结果从GL转换回collada。操作(1)是矩阵B [col->gl],操作(2)是MatrixGL,操作(3)是矩阵B [gl->col]。 - Dr_Sam
它几乎正确了...你/有人能解释一下这个矩阵吗?一个轴仍然很奇怪..其他的都可以!上下运动没问题。但是当我向前伸手臂时,模型会向后移动。 - Captain GouLash
哪个轴不工作?是y轴吗?那你确定你的图形没问题吗?你可以尝试在左边矩阵的(2,3)元素和右边矩阵的(3,2)元素中都用-1代替1。 - Dr_Sam

0

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

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

1 0 0
0 0 1
0 1 0

要进行相反的转换,您将使用相同的矩阵。


0

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

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

您必须选择一个坐标系来工作,尽量使用最常用的那个,然后编写一些有用的函数来将一个坐标系转换为另一个坐标系。

根据我的经验,我可以告诉您四元数是避免这些问题的最佳方法,选择正确的矩阵考虑目标的手性系统。

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

然后查看此链接:Euler to Quaternion,并将sin(x)更改为-sin(x),以在两个坐标系之间进行转换。

最好的问候。


我有时候不太理解你想说什么,但是让我注意一些事情:OpenGL使用右手坐标系。此外,我认为你误解了与我相同的OP。他并没有要求一个旋转矩阵来转换GL和COLLADA的坐标系。 - Nobody moving away from SE
我想要用这个来表达的是旋转是一个“视角问题”,从你用来模拟旋转的观察者的视角到另一个具有不同旋转模型的观察者的视角,一切都是相对的。因此,你需要将问题“翻译”为你自己的视角才能正确地处理它。我知道避免这种“翻译”问题的唯一方法是使用四元数,但是这在开始时可能有点复杂。 - JP Cordova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接