1

我目前正在尝试通过 OpenGL 来了解基础知识。当时我尝试渲染一个带有金字塔的浮动立方体。我希望 Cube 在 Input 上旋转(这已经在工作)并且 Pyramid 保持在它应该在的位置。

在弄清楚使用后Push-PopMatrix我设法只旋转了立方体。我的问题是,只要我松开钥匙,立方体就会停止旋转。player.X那时并没有Player.Z重置(检查)。

所以我的猜测是PushMatrix把某种标准矩阵放到堆栈上,然后旋转它并显示它。因为1 * x总是相等x,所以没有旋转。

所以问题是:我如何设法将“旧”矩阵推入堆栈,而不是新矩阵?

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glPushMatrix();
glRotatef( -(player->Z), 1.0f, 0.0f, 0.0f );
glRotatef( -(player->X), 0.0f, 1.0f, 0.0f );
glBegin( GL_QUADS );
//Draw Cube
glEnd();
glPopMatrix(  );

glBegin( GL_TRIANGLES );
//Draw Pyramid
glEnd();


glFlush();
SwapBuffers (hDC);
4

1 回答 1

1

glPushMatrix() 不会将“标准”矩阵推入堆栈,它会推入当前矩阵。希望您已经在某个时候使用 a 初始化了矩阵glLoadIdentity(),可能还有一些初始转换来设置视图,所以这就是将要推送的内容。

您通常不应该逐帧更新该矩阵,因为错误最终会累积。

相反,在一些更新循环中更新您的旋转值,而不是在按键例程中。

另外,请注意,这种使用 GL 进行渲染的方法被认为已弃用。推荐的方法是使用可编程管道,这涉及创建您自己的矩阵(以及其他更改)。

(如果您迫切希望保持持久变换,同时还要推送和弹出以呈现其他内容,则可以使用 a 读取当前矩阵glGet(),将其存储在某处,然后执行 aglLoadMatrix()稍后再次恢复它......但不要'不这样做。)

于 2013-02-01T08:47:28.237 回答