将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转
Posted
技术标签:
【中文标题】将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转【英文标题】:Resolving rotation about an arbitary axis into rotation about X, Y and Z axis 【发布时间】:2011-08-17 15:55:39 【问题描述】:我目前正在尝试利用 GLUT 库在 OpenGL 中实现一个虚拟轨迹球。 截至目前,我正在通过对鼠标的新旧坐标进行标准轨迹球计算来计算旋转轴和旋转角度。但我想获得角度 theta1, theta2, theta3 ,这样物体绕 X 轴旋转 theta1 ,绕 Y 轴旋转 theta2 和绕 Z 轴旋转 theta3 会产生与以前相同的效果。
【问题讨论】:
所以你想绕 x 旋转,然后是 y,最后是 z,按这个顺序? 围绕一个轴的旋转不能仅由围绕另一个轴的旋转来表示。您需要旋转和平移来涵盖所有可能的旋转。 @ypnos 不,我认为他想用欧拉角表示他的任意轴(通过原点)旋转,即围绕坐标轴旋转三个,不需要平移。 由于您是新来的,请务必了解接受和投票功能。 【参考方案1】:你想要的是从axis-angle 两个三个Euler 角度。查看wikipedia rotation conversions。在那里,您可以从轴角到四分位数,然后再到欧拉角,或者通过完整的 3x3 旋转矩阵。
还要查看所谓的Rodrigues 参数以帮助进行转换。要首先绕 X 旋转,然后绕 Y 旋转,然后绕 Z 旋转,您需要执行 RZ(t3)*RY(t2)*RX(t1)
。
在您的情况下,构建 3x3 旋转矩阵并使用 OpenGL 根据矩阵转换模型视图可能更容易,而不是 3 次连续旋转。
【讨论】:
【参考方案2】:你想要的是所谓的欧拉角,它是围绕坐标轴旋转的三个角度(在你的情况下是 XYZ,或者可能是 ZYX?)。请务必查看要使用的正确约定(轴顺序),即适合您需要的约定。如果你搜索欧拉角计算公式你会发现其中很多,但它们都会使用不同的约定(并且很多人认为他们的约定是标准,所以不要特别提及它,但没有通用的标准)。
还请记住,欧拉角有许多缺点,例如万向节锁定、歧义和上述约定混乱。因此,如果您有机会通过任意轴和角度(甚至更好的是四元数)来表示旋转,那么您不应该弄乱欧拉角。但是,尽管如此,在this document 中,您可以找到将欧拉角转换为所有 12 种约定的矩阵并再次返回的方法。轴角到矩阵的转换非常简单。
【讨论】:
@ja72 这是我发现的唯一一个真正考虑了所有 12 种欧拉角约定的网站,更重要的是,它像对待它们一样对待它们,所有这些都同样重要。除了本网站(以及 Eberly 的书中)上的许多其他不错的材料。【参考方案3】:完成这项工作的更好方法是将围绕通过原点的轴的空间旋转转换为单位四分位数。单位四元数可以很容易地转换成欧拉角,没有任何歧义。更多关于转换的信息可以在这里找到http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles。
感谢大家的帮助!
【讨论】:
不,它们不能毫无歧义地转换为欧拉角。每个旋转(不仅是极端情况)都可以由至少两个不同的欧拉三元组表示(即使在相同的约定中)。欧拉角的众多缺点之一。 他们转换为欧拉轴,而不是欧拉角 :) 但是是的。就是这张票。以上是关于将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转的主要内容,如果未能解决你的问题,请参考以下文章