将局部旋转添加到全局旋转

时间:2011-06-06 12:46:09

标签: opengl matrix rotation quaternions euler-angles

我尝试了很多公式和转换,但没有任何东西能给我我期望的结果。

情景非常简单:

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:一个简单的解决方案可以是使用四元数或矩阵,将局部旋转添加到全局中,然后检索绝对结果。但是这不能很好地工作,因为通过这种方式我们无法控制旋转顺序,结果总是使用公式的顺序来检索值。

2 个答案:

答案 0 :(得分:1)

你希望乘以旋转矩阵的顺序取决于旋转的应用顺序,如果首先应用局部旋转(我怀疑它是),那么:

WorldMat * LocalMat [* column vector]

(如果你预先乘以列向量来应用你的变换,只要你反过来整个表达式的转置)

同样,如果您正在使用四元数,则应该乘以四元数(不添加它们)。

答案 1 :(得分:0)

旋转矩阵看起来像这样(假设列向量表示):

[   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),你会得到大约(在舍入误差内)相同的矩阵(我做了尝试一下,只是为了确保)。