OpenGL混淆了推和弹出的顺序

OpenGL confused order of push and pop

本文关键字:顺序 OpenGL      更新时间:2023-10-16

我正在努力让我的opengl应用程序正常工作,基本上在我开始处理场景图之前,每个对象都以推按开始绘制,然后以弹出结束

现在,我基本上把两个孩子添加到一辆汽车的底座(车轮)上,我在让他们相对于底座汽车画画时遇到了问题。如果我能发布一些代码,我会显示画所有东西的调用,然后显示我画的场景调用,我希望这是一个愚蠢的错误,因为我真的卡住了

void GameNode::Draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
car->Draw();
glPopMatrix();
for (int i = 0; i < MAXOBJECTS; i++)
{
    glPushMatrix();
    objects[i]->Draw();
    glPopMatrix();
}
for (int i = 0; i < MAXBUILDINGS; i++)
{
    glPushMatrix();
    build[i]->Draw();
    glPopMatrix();
}
glPushMatrix();
skyBox->Draw();
glPopMatrix();
glFlush();
glutSwapBuffers();
 }

然后在我的车里->绘制场景图这里是的代码

glPushMatrix();

object->Draw();
glPushMatrix();
glPopMatrix();
if(left != nullptr)
    {
        glPushMatrix();
        glPopMatrix();
        left->PreOrderDraw();
    }
if(right != nullptr)
{
    right->PreOrderDraw();
}
glPopMatrix();

因此,这基本上是将我的车轮设置在汽车底座附近,但当它们的位置偏移到应该是的位置时,并不是将它们相对于底座设置

我认为您对矩阵堆栈的工作方式感到困惑。我这么说是因为以下问题:

glPushMatrix( );
glPopMatrix( );
if(left != nullptr)
{
    glPushMatrix();
    glPopMatrix();
   // ...

您无理由多次推送/弹出(除非有遗漏的代码)。

我建议您阅读OpenGL编程指南-第3章-操作矩阵堆栈,幸运的是,它使用汽车及其车轮作为示例来教授如何使用堆栈。

根据我从你的代码中可以看出,你所做的只是多次推送/弹出身份矩阵,而从来没有从它们的来源翻译轮子。