我想编写一个函数,用于围绕其轴旋转对象,同时围绕其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();
如果你这样做,告诉我你的方式。
答案 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();
以上在数学上等同于通过连接各个旋转R
,R_z
和R_y
来计算旋转矩阵R_x
:R' = R_x * R_y * R_z
。
我建议你也阅读this并更好地了解你正在做什么以及一般轮换的潜在问题。