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

Math 在OpenGL中围绕3个轴旋转对象,math,opengl,3d,geometry,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); glVerte

我试图通过增加轴的旋转角度值来实现对象围绕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();
编辑: 我有这样的斧子:
angleX、angleY、angleZ在按键时是全局递增的-例如,按下“A”后,angleX将递增10,我希望X轴在此之后不会移动,Y轴和Z轴将围绕X轴旋转。但只有当我只更改一个角度变量时,这才是真的。在绕多个轴旋转后,当我改变时,例如,angleX-图片中的所有轴都将改变其位置

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


使用四元数可能有一种更简单、内存占用更少的方法;这是我真正需要更深入了解的一个领域。不过,就我现在所知,这是我实现我认为您所追求的行为的方法。

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

四元数并没有那么难。您基本上可以这样做(实现Quat类非常简单)-


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

一些问题:1)你能更具体地描述你要寻找的行为吗?2) 你能否提供更多的细节,说明你所发布的内容没有达到预期的效果?3) 您能否提供有关如何更改angleX、angleY和angleZ值的更多详细信息?我已经用更多详细信息编辑了我的问题Hanks,这是我一直在寻找的一个简单解决方案。
Matrix yawMatrix = Quat(yawAxis, m_rx).matrix();
Matrix pitchMatrix = Quat(pitchAxis, m_ry).matrix();
Matrix rotMatrix = Matrix::multiply(yawMatrix, pitchMatrix);