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

我试图通过增加轴的旋转角度值来实现约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 – 图片中的所有轴都将改变它们的位置.

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

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

点赞