【问题标题】:Adding Local Rotation to Global Rotation将局部旋转添加到全局旋转
【发布时间】:2011-06-06 12:46:08
【问题描述】:

我尝试了许多公式和转换,但没有一个能得到我期望的结果。

场景很简单:

3DS Max等3D软件如何将局部旋转增量“转化”为全局绝对旋转?

一个例子可以帮助你理解: 3DS Max - Maya - Modo(三个都给了我相同的结果,所以我倾向于相信这个结果是正确的。)假设绝对旋转顺序为 XYZ。

1. World Rotation Y = 35.0;
2. Local Rotation X = 35.0;

在这些转换之后,按这个顺序,我看世界绝对旋转,我看到的是X:40.524 Y:-28.024 Z:-21.881

他们是如何达到这个结果的?什么样的公式?使用矩阵、欧拉角或四元数,我怎样才能得到相同的结果?

谢谢。

PS:一个简单的解决方案可以是使用四元数或矩阵,将局部旋转添加到全局中,然后检索绝对结果。但这并不好用,因为这样我们无法控制旋转顺序,结果总是使用公式的顺序来检索值。

【问题讨论】:

  • 您的后文没有多大意义。从欧拉角,您可以使用您喜欢的任何旋转顺序构造(和解构)旋转矩阵。如果您始终坚持单一的轮换顺序,您的用户会更清楚。

标签: opengl matrix rotation quaternions euler-angles


【解决方案1】:

如果要首先应用局部旋转(我怀疑是这样),那么您希望根据应用旋转的顺序旋转矩阵: p>

WorldMat * LocalMat [* column vector]

(前提是您预先将列向量相乘以应用您的转换,如果反之,则只需对整个表达式进行转置)

同样,如果您使用四元数,您应该您的四元数(而不是相加)。

【讨论】:

    【解决方案2】:

    旋转矩阵如下所示(假设列向量表示):

    [   1      0       0   ]
    [   0    cos(a)  sin(a)] = Rx(a)
    [   0   -sin(a)  cos(a)] 
    
    [ cos(a)   0    -sin(a)]
    [   0      1       0   ] = Ry(a)
    [ sin(a)   0     cos(a)]
    
    [ cos(a) sin(a)   0    ]
    [-sin(a) cos(a)   0    ] = Rz(a)
    [   0      0      1    ]
    

    乘以'local'意味着矩阵在右边。乘以“全局”意味着矩阵在左侧。所以你的旋转是Ry(35°)*Rx(35°)。或大约:

    [ .819  .329 -.469 ]
    [  0    .019  .574 ]
    [ .574 -.470  .671 ]
    

    欧拉旋转顺序 XYZ 表示 Rx(ax)*Ry(ay)*Rz(az)。所以,如果你插入数字 Rx(40.524°)*Ry(-28.024°)*Rz(-21.881),你会得到大约(在舍入误差内)相同的矩阵(我做了试试看,只是为了确保)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 2016-10-06
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2016-12-06
      • 2018-01-03
      • 1970-01-01
      相关资源
      最近更新 更多