我目前正试图通过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);
答案 0 :(得分:1)
glPushMatrix()不会将“标准”矩阵推入堆栈,而是推送当前矩阵。希望你已经使用glLoadIdentity()
在某个时刻初始化了矩阵,并且可能还有一些初始变换来设置视图,因此这将被推送。
您通常不应该逐帧更新该矩阵,因为错误最终会累积。
相反,请在某个更新循环中更新旋转值,而不是在按键例程中更新。
另请注意,此GL渲染方法被视为已弃用。推荐的方法是使用可编程管道,包括创建自己的矩阵(以及其他更改)。
(如果你拼命想要保持持久变换同时还要推送和弹出以呈现其他东西,可以用glGet()
读取当前矩阵,将其存储在某处,然后执行{{1稍后再次恢复它......但不要为此做到这一点。)