0

我想编写一个函数,用于同时围绕它的轴旋转一个对象,同时围绕它的 x、y 和 z 轴传递每个角度;我在这里阅读,但我没有完全理解它。例如,为了围绕我的形状的轴旋转,我必须将哪些参数传递给 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();

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

4

1 回答 1

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,即围绕in的固定基础进行旋转z-y-x,您需要执行以下操作:

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

// render camera

glPopMatrix();

R以上在数学上等效于通过连接各个旋转来计算旋转矩阵R_zR_y并且R_xR' = R_x * R_y * R_z

我建议您也阅读内容,以便更好地了解您在做什么以及一般轮换的潜在问题。

于 2013-10-23T10:29:09.247 回答