使用OpenGL在C ++中同时围绕其(x,y和amp; z)轴旋转对象

时间:2013-10-23 08:58:57

标签: c++ visual-studio-2010 opengl glrotate

我想编写一个函数,用于围绕其轴旋转对象,同时围绕其x,y和z轴传递每个角度;我读过here,但我完全不明白。例如,围绕我的形状轴旋转,我必须将哪些参数传递给glTranslatef(),以及如何创建乘以[0 1 0](用于计算新y轴)的矩阵?

我不明白为什么当我多次调用glRotatef()时,我只看到输出中的第一个调用;我在我的代码之后测试了gltranslatef和glPushMatrix以及glPopMatrix;但他们都没有帮助我; 对我来说理解这个主题的解决方案非常重要。

这是我的代码,但它不起作用!

glPushMatrix();
glRotatef(90,1,0,0); // rotate around X Axis
glPopMatrix();

glPushMatrix();
glRotatef(90,0,1,0); // rotate around Y Axis
glPopMatrix();

glPushMatrix();
glRotatef(90,0,0,1); // rotate around Z Axis
glPopMatrix();

如果你这样做,告诉我你的方式。

1 个答案:

答案 0 :(得分:0)

您的上述代码实际上没有做任何可见的事情,因为您在更改当前活动矩阵后不会渲染任何内容。以下代码段的效果如下(假设当前堆栈为MODELVIEW):

glPushMatrix();      // push the stack down one matrix and copy the current matrix
glRotatef(90,1,0,0); // multiply the current matrix M by a rotation matrix R -> M' = M * R

// usually you would render stuff here using the current model-view matrix

glPopMatrix();       // pop the top matrix off the stack

正如您所看到的,通过将新矩阵推入堆栈,您可以在推送之前保留矩阵在顶部的内容。然后你以某种方式操纵当前的顶部矩阵,渲染东西,然后关闭顶部矩阵以恢复之前的状态。

我认为您现在可以看到为什么您的上述代码绝对没有任何本质 - 除了造成不必要的开销。

使用矩阵堆栈,如果您坚持使用旧版GL,这里通常是正确的,因为您不希望您的修改影响随后渲染的几何体。但是,您真正想要的是简单的矩阵连接。假设您要执行外部轮换,即在world-space中围绕z-y-x的固定基础进行轮换,则需要执行以下操作:

glPushMatrix();
glRotatef(90,1,0,0);
glRotatef(90,0,1,0);
glRotatef(90,0,0,1);

// render camera

glPopMatrix();

以上在数学上等同于通过连接各个旋转RR_zR_y来计算旋转矩阵R_xR' = R_x * R_y * R_z

我建议你也阅读this并更好地了解你正在做什么以及一般轮换的潜在问题。