【问题标题】:Combine multiple rotation matrixes in 3D在 3D 中组合多个旋转矩阵
【发布时间】:2017-08-28 14:50:32
【问题描述】:

我已经计算了每个轴的轴角度旋转。如果我只应用三个旋转中的一个,对象会按预期旋转。

如果我将旋转矩阵相乘,就像你通常会在组合旋转时那样做,我没有得到想要的结果,因为第一次旋转会影响其他旋转,因此最终结果不是我想要的。

我想将每个旋转应用于对象,就好像它之前没有旋转过一样。

我想这是一个简单的任务,但似乎我没有在搜索正确的关键字。 (而且标题也不完美……(欢迎提出建议))

感谢您的每一个提示/帮助。

【问题讨论】:

    标签: matrix 3d rotation transformation


    【解决方案1】:

    您正在体验gimbal lock。这不是数学问题,而是逻辑谬误。为了便于描述,请用您的手机试一试:

    1. 将其正面朝上放在桌面上,充电接口位于底部。
    2. 围绕 z 顺时针旋转 90 度。所以充电接口现在在左边。
    3. 围绕 x(假设充电端口位于顶部或底部,这将是手机的长轴)旋转 180 度。
    4. 现在手机倒置了,充电口在左边。

    但是:

    1. 将其正面朝上放在桌面上,充电接口位于底部。
    2. 围绕 x 旋转 180 度。所以充电接口现在位于顶部。
    3. 绕 z 顺时针旋转 90 度。
    4. 手机现在倒置了,充电端口在右侧

    如果指令是围绕 x 旋转 180 度并围绕 z 顺时针旋转 90 度,那么哪些是不正确的?两者都不正确。说明含糊不清。

    单个轮换的顺序总是很重要,因为第二个会影响第一个完成的工作,第三个会影响第一个和第二个完成的工作,等等。打乱顺序只会改变哪个会影响哪个。

    方向通常直接存储为矩阵或四元数,因为它是明确的并且因为它保持正确排序的动作顺序。

    【讨论】:

    • 我知道订单很重要,我目前的问题不是云台锁。我知道我不能直接使用我拥有的三个旋转。问题是如何修改它,以便我可以使用它们。
    • 根据我的回答:如果您所拥有的只是“围绕 x 旋转 x 度,围绕 y 旋转 y,围绕 z 旋转 z”,那么没有一个“正确”的最终方向。不管你认不认,这就是所谓的云台锁问题。
    • 但必须有一个描述我正在寻找的东西。必须有一种方法来改变我当前的价值观。
    【解决方案2】:

    刚刚偶然发现了这个问题,正在寻找稍微不同的东西。长话短说,您可能会以相反的顺序将矩阵相乘。

    链式旋转有点违反直觉。如果你有一个循环链R1*R2*R3*R4,那么你有两种方法来概念化正在发生的事情:intrinsicextrinsic

    intrinsic 视图从右到左工作。您从 R4 开始,然后按自己的方式工作到 R1。 R4 采用初始帧并生成一个围绕 R4 的旋转轴旋转的新帧。 R4 的轴在初始帧中指定。 R3 采用这个旋转的框架并围绕 R3 的旋转轴旋转它。这里,R3 的轴在 R4 的旋转框架中指定。这会沿着链条向下延伸,每次都会改变表达旋转轴的框架。

    extrinsic 视图从左到右工作。您从 R1 开始,然后按自己的方式工作到 R4。 R1 的输出帧围绕 R1 的轴旋转。 R1 的轴在初始帧中表示。然后 R2 获取 R1 的输出帧和 R2 的输出帧,并围绕 R2 的轴旋转。 R2 的轴再次在初始帧中表示。这会沿着链条向上延伸,每次旋转所有 在初始帧中表示的围绕某个轴的先前帧。

    已经感到困惑了吗?更好的是,这两种方式是完全等价的。它们只是看待同一事物的两种方式。正如我所说,链接旋转有点违反直觉。

    它的底线是,如果你有一堆在初始参考框架中表达的旋转矩阵,那么 extrinsic 视图是最有意义的。如果您想先围绕 R1 然后 R2 等旋转,那么您最左边的矩阵就是您要最后旋转的矩阵,即您将计算 Rn*Rn-1*...*R3*R2*R1

    【讨论】:

      【解决方案3】:

      旋转矩阵的组成不是微不足道的。我建议将您的旋转矩阵表示为quaternions。四元数具有非常有用的特性。将两个四元数相乘将得到第三个四元数,将其放回矩阵形式,是两个输入矩阵的精确组合。我认为Boost 库有这方面的代码,但我没有亲自使用过。

      编辑:您可以从(归一化的)轴矢量和旋转角度得到一个 rot 矩阵。看看维基百科上的这个article

      【讨论】:

      • 我使用的库提供四元数。这样那部分就完成了;)。所以我必须在三个向量上使用叉积来获得我正在寻找的四元数表示?我认为这与乘以旋转矩阵相同?
      • @user2479595 您应该能够为每个轴初始化旋转。通常一个轴向量和一个旋转角度就足以得到一个旋转矩阵。一旦有了 3 矩阵,您就可以将它们表示为四元数,将它们相乘,然后将结果表示为另一个旋转矩阵。你不妨看看汤米的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2014-12-16
      • 2016-06-12
      相关资源
      最近更新 更多