【问题标题】:(OpenGL) Pushing "old" matrix onto stack(OpenGL)将“旧”矩阵推入堆栈
【发布时间】:2013-02-01 08:34:48
【问题描述】:

我目前正在尝试通过 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);

【问题讨论】:

    标签: c opengl matrix


    【解决方案1】:

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

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

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

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

    (如果你迫切希望保持一个持久的变换,同时还推动和弹出来渲染其他东西,可以使用glGet() 读取当前矩阵,将其存储在某处,然后执行glLoadMatrix() 以恢复稍后再做一次……但不要为此这样做。)

    【讨论】:

    • 需要的解决方案是编写一个旋转函数(包括一个静态结构)并在每次运行时将旋转值相加......谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多