OpenGL混淆了推送和弹出的顺序

时间:2014-04-17 18:42:33

标签: c++ opengl

我试图让我的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();
 }

然后在我的车 - &gt;画中我有这里的场景图是那个

的代码
glPushMatrix();


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

        glPushMatrix();

        glPopMatrix();

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

因此,这基本上将我的车轮设置在靠近汽车底座的位置,但当它们的位置偏离它们的位置时,它们不会相对于底座设置它们

1 个答案:

答案 0 :(得分:4)

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

glPushMatrix( );
glPopMatrix( );

if(left != nullptr)
{

    glPushMatrix();

    glPopMatrix();

   // ...

您无缘无故地推/弹多次(除非省略代码)。

我建议你阅读OpenGL Programming Guide - Chapter 3 - Manipulating the Matrix Stacks,幸运的是,你使用汽车,它的轮子作为教导如何使用堆栈的例子。

从我的代码中我可以看出,你所做的就是多次推送/弹出单位矩阵,而无需从原点转换轮子。