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 вещи.
изменить режим glFrontFace() так оно и становится
GL_CW
, вместоGL_CCW
. Помните, что изменение будет влиять на все, что идет после вызоваglFrontFace(GL_CW)
так что не забудьте позвонитьglFrontFace(GL_CCW)
снова, если в любой другой момент вы оказываете что-то, что имеет против опять обмотка.измените порядок отправки вершин в.
С
// 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);