将围绕任意轴的旋转分解为绕X,Y和Z轴旋转

时间:2011-08-17 15:55:39

标签: c opengl rotation glut

我目前正在尝试使用GLUT库在OpenGL中实现虚拟轨迹球。 到目前为止,我正在通过对鼠标的新旧坐标进行标准的弧球计算来计算旋转轴和旋转角度。但我想获得角度theta1,theta2,theta3,这样物体绕X轴旋转θ1,绕Y轴旋转θ2,绕Z轴旋转θ3将产生与以前相同的效果。

3 个答案:

答案 0 :(得分:3)

你想要的是欧拉角,它是围绕坐标轴旋转的三个角度(在你的情况下是XYZ,或者是ZYX?)。请务必仔细查看要使用的正确约定(轴顺序),这意味着符合您需求的约定。如果你搜索欧拉角计算公式,你会发现其中很多,但它们都会使用不同的约定(很多人都认为它们的约定是标准的,所以不要特别提及它,但是没有一般性的标准)。

另外请记住,欧拉角有许多缺点,例如万向节锁定,模棱两可和所提到的常规混乱。因此,如果您有机会通过任意轴和角度(或甚至更好的四元数)来表示旋转,那么您不应该使用欧拉角。但是,在this document中,您可以找到将欧拉角转换为所有12种约定的矩阵的方法,然后再返回。从轴角到矩阵的转换非常简单。

答案 1 :(得分:3)

你想要的是axis-angle两个Euler两个角度。看看wikipedia rotation conversions。在那里你可以从轴角到四分之一,再到欧拉角,或者通过完整的3x3旋转矩阵。

还要查看所谓的Rodrigues参数以帮助转换。首先要旋转X,然后是Y,然后是Z,你要做RZ(t3)*RY(t2)*RX(t1)

在您的情况下,构建3x3旋转矩阵并使用OpenGL基于矩阵转换模型视图可能更容易,而不是3次顺序旋转。

答案 2 :(得分:0)

更好的方法是将围绕通过原点的轴的空间旋转转换为单位四分之一。单位四分之一可以轻松转换为欧拉角,没有任何歧义。有关转换的更多信息,请访问http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles

感谢您的帮助!