OpenGL выводит коробки наизнанку

Я пытаюсь создать 2 коробки в OpenGL, но они появляются наизнанку, и иногда они не перекрываются правильно. Видео http://www.youtube.com/watch?v=IVJu4zJFp7Q

Я предполагаю, что это проблема глубины, но я не смог понять, что я делаю неправильно.

вот код, который я использую для инициализации:

glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glDisable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST);

вот моя функция distplay glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );

drawYellowBox();
drawBlueBox();

и код, который я использую для рисования фигур:

glPushMatrix();
    glBegin(GL_QUADS);

        glColor3f(0.15, 0.15, 0.0);
        // draw front
        glVertex3f(-1.0, -1.5, 1.0);
        glVertex3f( 1.0, -1.5, 1.0);
        glVertex3f( 0.75,  1.5, 0.75);
        glVertex3f(-0.75,  1.5, 0.75);

        glColor3f(0.3, 0.3, 0.0);
        // draw back
        glVertex3f( 1.0, -1.5, -1.0);
        glVertex3f(-1.0, -1.5, -1.0);
        glVertex3f(-0.75,  1.5, -0.75);
        glVertex3f( 0.75,  1.5, -0.75);

        glColor3f(0.45, 0.45, 0.0);
        // draw left
        glVertex3f(-1.0, -1.5, -1.0);
        glVertex3f(-1.0, -1.5,  1.0);
        glVertex3f(-0.75,  1.5,  0.75);
        glVertex3f(-0.75,  1.5, -0.75);

        glColor3f(0.6, 0.6, 0.0);
        // draw right
        glVertex3f( 1.0, -1.5,  1.0);
        glVertex3f( 1.0, -1.5, -1.0);
        glVertex3f( 0.75,  1.5, -0.75);
        glVertex3f( 0.75,  1.5,  0.75);

        glColor3f(0.75, 0.75, 0.0);
        // draw top
        glVertex3f(-0.75,  1.5,  0.75);
        glVertex3f( 0.75,  1.5,  0.75);
        glVertex3f( 0.75,  1.5, -0.75);
        glVertex3f(-0.75,  1.5, -0.75);

        glColor3f(0.9, 0.9, 0.0);
        // draw bottom
        glVertex3f(-1.0, -1.5, -1.0);
        glVertex3f( 1.0, -1.5, -1.0);
        glVertex3f( 1.0, -1.5,  1.0);
        glVertex3f(-1.0, -1.5,  1.0);
    glEnd();

glPopMatrix();

glPushMatrix();
    glTranslatef(0.0,2.5,0.0);
    glRotatef(joint_ui_data->getDOF(Keyframe::HEAD), 0.0, 1.0, 0.0);


    glBegin(GL_QUADS);

        glColor3f(0.0, 0.15, 0.15);
        // draw front face
        glVertex3f(-0.8, -0.45, 0.8);
        glVertex3f( 0.8, -0.45, 0.8);
        glVertex3f( 0.75,  0.45, 0.75);
        glVertex3f(-0.75,  0.45, 0.75);

        glColor3f(0.0, 0.3, 0.3);
        // draw back face
        glVertex3f( 0.8, -0.45, -0.8);
        glVertex3f(-0.8, -0.45, -0.8);
        glVertex3f(-0.75,  0.45, -0.75);
        glVertex3f( 0.75,  0.45, -0.75);

        glColor3f(0.0, 0.45, 0.45);
        // draw left face
        glVertex3f(-0.8, -0.45, -0.8);
        glVertex3f(-0.8, -0.45,  0.8);
        glVertex3f(-0.75,  0.45,  0.75);
        glVertex3f(-0.75,  0.45, -0.75);

        glColor3f(0.0, 0.6, 0.6);
        // draw right face
        glVertex3f( 0.8, -0.45,  0.8);
        glVertex3f( 0.8, -0.45, -0.8);
        glVertex3f( 0.75,  0.45, -0.75);
        glVertex3f( 0.75,  0.45,  0.75);

        glColor3f(0.0, 0.75, 0.75);
        // draw top
        glVertex3f(-0.75,  0.45,  0.75);
        glVertex3f( 0.75,  0.45,  0.75);
        glVertex3f( 0.75,  0.45, -0.75);
        glVertex3f(-0.75,  0.45, -0.75);

        glColor3f(0.0, 0.9, 0.9);
        // draw bottom
        glVertex3f(-0.8, -0.45, -0.8);
        glVertex3f(-0.8, -0.45,  0.8);
        glVertex3f( 0.8, -0.45,  0.8);
        glVertex3f( 0.8, -0.45, -0.8);
    glEnd();
glPopMatrix();

спасибо.

3 ответов


проблема заключается в том, в каком порядке вы отправляете свои вершины.

как мы можем видеть в вашем коде порядок вершин вашего лицевой стороне есть.

// Front
glVertex3f(-1.0, -1.5, 1.0);   // Left   Top
glVertex3f( 1.0, -1.5, 1.0);   // Right  Top
glVertex3f( 0.75,  1.5, 0.75); // Right  Bottom
glVertex3f(-0.75,  1.5, 0.75); // Left   Bottom

как мы видим в этом фрагменте кода, Вы отправляете вершины стрелки. OpenGL по умолчанию считывает все полигоны против. Именно поэтому все противоположные грани удаляются / скрываются (отбираются).

чтобы исправить это, вы можете сделать 1 из 2 вещи.

  1. изменить режим glFrontFace() так оно и становится GL_CW, вместо GL_CCW. Помните, что изменение будет влиять на все, что идет после вызова glFrontFace(GL_CW) так что не забудьте позвонить glFrontFace(GL_CCW) снова, если в любой другой момент вы оказываете что-то, что имеет против опять обмотка.

  2. измените порядок отправки вершин в.

С

// Front
glVertex3f(-1.0, -1.5, 1.0);   // Left   Top
glVertex3f( 1.0, -1.5, 1.0);   // Right  Top
glVertex3f( 0.75,  1.5, 0.75); // Right  Bottom
glVertex3f(-0.75,  1.5, 0.75); // Left   Bottom

до

// Front
glVertex3f(-1.0, -1.5, 1.0);   // Left   Top
glVertex3f(-0.75,  1.5, 0.75); // Left   Bottom
glVertex3f( 0.75,  1.5, 0.75); // Right  Bottom
glVertex3f( 1.0, -1.5, 1.0);   // Right  Top

хотя, если у вас уже есть тонны сеток, вероятно, было бы намного проще просто изменить glFrontFace режим GL_CW.

дополнительно

также, если вы хотите изменить, какие лица отбираются, вы также можете изменить режим glCullFace, либо GL_FRONT, GL_BACK или GL_FRONT_AND_BACK начальное значение GL_BACK.

помните, что вам нужно позвонить glEnable(GL_CULL_FACE) чтобы включить отбраковку полигонов на основе их вершинной обмотки.

Edit

если это не проблема с вершинной намоткой, это может (хотя это было бы очень странно) быть проблемой тестирования глубины.

добавьте этот код в свой код инициализации.

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

чтобы исправить эту проблему, вам нужно будет перевернуть ваши лица вокруг вашего объекта или проверить нормали объекта под рукой...

Если вы создадите плоскость, вы заметите, что можете видеть через одну ее сторону, если вы не инвертируете нормали на сторону вида или не добавите двухстороннее решение...

обычно я использую away3d или три.js для 3D-контента...принципы те же самые


Я нашел проблему. Я включал тестирование глубины в моей функции initGlut() вместо функции initGl ().

glEnable(GL_DEPTH_TEST);