在OpenGL中围绕3个轴旋转对象

时间:2010-08-29 21:27:20

标签: math opengl 3d geometry

我试图通过递增轴的旋转角度值来实现约3个轴的物体旋转,并显示这些轴以使观察者可以预测下一个旋转方向。但是在几次旋转之后,仅根据显示的轴执行绕Z轴的旋转。有没有机会可以简单地完成,而不需要考虑四元数?

glPushMatrix ();
glRotatef (angleX, 1.0, 0.0, 0.0);
glRotatef (angleY, 0.0, 1.0, 0.0);
glRotatef (angleZ, 0.0, 0.0, 1.0);
glBegin(GL_LINES);
glVertex3f(80.0, 0.0, 0.0);   //x axis
glVertex3f(-80.0, 0.0, 0.0);
glVertex3f(0.0, 80.0,  0.0);  //y axis
glVertex3f(0.0, -80.0,  0.0);
glVertex3f( 0.0, 0.0, 80.0);  //z axis
glVertex3f( 0.0, 0.0, -80.0);
//here is some code for drawing arrows at axes ends
glEnd();
glPopMatrix();

修改 我有这样的轴: http://img841.imageshack.us/i/arrowsx.jpg/ angleX,angleY,angleZ是按键时递增的全局变量 - 例如在按下'A'之后,angleX增加10,我希望轴X在此之后不会移动,轴Y和Z将围绕X轴旋转。但只有当我只改变一个角度变量时才会这样。旋转约一个轴后,当我改变时,例如, angleX - 图片中的所有轴都将改变它们的位置。

3 个答案:

答案 0 :(得分:2)

您发布的代码基本上将关于每个轴的所有旋转都集中到围绕该轴的单个旋转中。正如您所注意到的,只要您所做的只是围绕单个轴的增量旋转,它就能很好地工作。从您的更新中,您还希望按键笔划将旋转应用于显示的图像,而不是在编码时聚合。实现您正在寻找的行为的一种方法是存储在您应用的每个轮换中的队列或可调整大小的向量(std :: vector,或std :: queue或其他容器,如果您使用的是C ++)。每次用户按下一个键时,将所需轴的固定角度大小的另一个旋转添加到列表中。在播放过程中,按照输入的顺序应用旋转(可能是相反的顺序,我必须多考虑一下)。然后,这将旋转应用于显示的几何体,而不是规范(即未旋转)的几何体。

使用四元数可能有一种更简单,内存更少的方法来实现这一点;这是我真正需要精通的一个领域。但是,现在就说出我所知道的,这就是我想要实现我认为你所追求的行为的方式。

答案 1 :(得分:0)

我在大学里做过一些OpenGL编程。似乎我遇到了同样的问题,并且每次更新任何给定角度时最终应用每个角度的总和。

答案 2 :(得分:0)

四元数并不难。你基本上做了这样的事情(实现Quat类非常简单) -

Matrix yawMatrix = Quat(yawAxis, m_rx).matrix();
Matrix pitchMatrix = Quat(pitchAxis, m_ry).matrix();
Matrix rotMatrix = Matrix::multiply(yawMatrix, pitchMatrix);

并将旋转矩阵应用于相机的视点,使其围绕目标点旋转。