【问题标题】:Matrix needed to convert rotations for one coordinate system to another将一个坐标系的旋转转换为另一个坐标系所需的矩阵
【发布时间】:2013-03-25 03:44:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您所要求的不能使用旋转矩阵来完成,因为旋转保留了系统的手性,而您所要的两个系统具有不同的手性。另请注意,在 GL 中,z 轴的方向与您的图像中的方向相反。
  • 此处提供的 GL 坐标系由我的一位同事创建的框架使用

标签: c++ matrix rotation collada


【解决方案1】:

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

确实,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 ”然后获取向量然后将其转换为transformationmatrix?
  • @CaptainGouLash:试着记住您的数据当前所在的坐标系。假设您从 COLLADA 坐标数据开始。然后应用转换矩阵,您的数据位于“GL”坐标中。然后你可以应用你的 GL 转换。完成后,您应用转换矩阵并返回 COLLADA 坐标。
  • 我假设您的点起点 x(您想要移动的)在 collada 坐标中,您希望结果在 collada 坐标中,但矩阵在 GL 坐标中.要移动您的点,您需要 (1) 将其从 collada 转换为 GL (2) 将其转换为 GL 坐标 (3) 将结果从 GL 转换回 collada。运算 (1) 是矩阵 B[col->gl],运算 (2) 是 MatrixGL,运算 (3) 是矩阵 B(gl->col)。
  • 它几乎是正确的..你/有人能给我解释一下这个矩阵吗?一个轴仍然很奇怪..其他轴很好!上下工作正常。但是当我向前移动手臂时,模型会向后移动
  • 究竟哪个轴不起作用?是吗?你确定你的图形是正确的吗?您可以尝试在 (#) 左侧矩阵的元素 (2,3) 和右侧矩阵的元素 (3,2) 中都使用 -1 而不是 1。
【解决方案2】:

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

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

1 0 0
0 0 1
0 1 0

要反过来转换你会使用相同的矩阵。

【讨论】:

    【解决方案3】:

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

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

    你必须选择一个坐标系统来工作,尝试使用最常用的,然后做一些有用的函数来转换一个坐标系统到另一个。

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

    如果你有旋转问题(如果你使用超过 90° 的俯仰,你会遇到),搜索云台锁,然后使用四元数,这样会节省很多时间和精力。

    然后看这个:Euler to Quaternion,然后将 sin(x) 更改为 -sin(x) 以在一个坐标系之间切换到另一个坐标系。

    最好的问候。

    【讨论】:

    • 我有时很难理解你想说的话,但让我注意一点:OpenGL uses a right handed system。另外,我认为您以与我相同的方式误解了 OP。他没有要求在 GL 和 COLLADA 的坐标系之间转换的旋转矩阵。
    • 我想说的是,旋转是一个“观点问题”,从你用来模拟旋转的观点来看,一切都是相对的,与另一个具有不同模型的观察者旋转。而且您需要将问题“翻译”为您的观点才能正常工作。我知道避免这种“翻译”问题的唯一方法是使用四元数,但是一开始理解起来有点复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2021-03-30
    相关资源
    最近更新 更多