(OpenGL)将“旧”矩阵推入堆栈

时间:2013-02-01 08:34:49

标签: c opengl matrix

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

在弄清楚使用Push-PopMatrix之后,我设法只旋转了多维数据集。 我的问题是,一旦我放开钥匙,立方体就会停止旋转。 此时player.XPlayer.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);

1 个答案:

答案 0 :(得分:1)

glPushMatrix()不会将“标准”矩阵推入堆栈,而是推送当前矩阵。希望你已经使用glLoadIdentity()在某个时刻初始化了矩阵,并且可能还有一些初始变换来设置视图,因此这将被推送。

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

相反,请在某个更新循环中更新旋转值,而不是在按键例程中更新。

另请注意,此GL渲染方法被视为已弃用。推荐的方法是使用可编程管道,包括创建自己的矩阵(以及其他更改)。

(如果你拼命想要保持持久变换同时还要推送和弹出以呈现其他东西,可以用glGet()读取当前矩阵,将其存储在某处,然后执行{{1稍后再次恢复它......但不要为此做到这一点。)