Объекты дрожат при вращении - PullRequest
1 голос
/ 15 марта 2019

У меня проблема с кодом opengl

Я пытаюсь построить дом и повернуть его на 360 °, для простоты предположим, что у дома есть передняя стена с окном и дверью, а также задняя стена.

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

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glLoadIdentity();
gluLookAt(0.0, 0.0, 40.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotatef(angle, 0.0, 1.0, 0.0);

glEnable(GL_DEPTH_TEST);

glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(8.0, 3.0, 0.0);
glVertex3f(8.0, -10.0, 0.0);
glVertex3f(1.0, -10.0, 0.0);
glVertex3f(1.0, 3.0, 0.0);
glEnd();

glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(-9.0, -4.0, 0.0);
glVertex3f(-9.0, 3.0, 0.0);
glVertex3f(-2.0, 3.0, 0.0);
glVertex3f(-2.0, -4.0, 0.0);
glEnd();

glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(10.0, -10.0, -20.0);
glVertex3f(-10.0, -10.0, -20.0);
glVertex3f(-10.0, 10.0, -20.0);
glVertex3f(10.0, 10.0, -20.0);
glEnd();


glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(10.0, -10.0, 0.0);
glVertex3f(10.0, 10.0, 0.0);
glVertex3f(-10.0, 10.0, 0.0);
glVertex3f(-10.0, -10.0, 0.0);
glEnd();


glDisable(GL_DEPTH_TEST);


glutSwapBuffers();

1 Ответ

3 голосов
/ 15 марта 2019

Проблема называется Z-fight . Это вызвано тем, что глубина «дверь», «окно» и «стена» равны. Координаты vertiex преобразуются матрицей вида модели и матрицей проекции и интерполируются для каждого фрагмента, охватываемого многоугольником. Это приводит к неточностям конечной координаты z (глубины).

Включите смещение заливки полигона (glPolygonOffset), прежде чем рисовать стены, чтобы решить проблему:

glEnable(GL_DEPTH_TEST);
glDisable( GL_POLYGON_OFFSET_FILL );

// draw door and window
// ...

glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 1, 1 );

// draw walls
// ...

Смещение заливки полигона управляет глубиной фрагмента на минимальную величину. Это приводит к тому, что глубина "стен" отличается от глубины "окна" и "двери" даже после преобразования с помощью вида модели и матрицы проекции.
Поскольку смещение добавляется к глубине «стены», «стена» всегда находится за окном и дверью, независимо от точки зрения.

...