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

标签 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 - 图片中的所有轴都会改变它们的位置。

最佳答案

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

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

关于math - 在 OpenGL 中绕 3 个轴旋转对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3596675/

相关文章:

javascript - 如何检测 3d 立方体的哪一侧被点击?

javascript - WebGL,gl 矩阵。如何从相机 View 和投影矩阵中获取平截头体顶点?

c++ - OpenGL C++ SDL 二维阴影

python - 在Python中如何找到最低有效数字

python - 欧拉计划 47 查找包含 4 个因子的所有数字

c++ - 当我从 C++ 中的有符号整数中减去无符号整数时会发生什么?

c++ - 为什么我的 CUDA 应用程序没有启动?

c++ - 带有 C++ 类的 OpenGL

OpenGL 3D 纹理坐标

JavaScript 三 Angular 函数