旋转时物体会晃动

时间:2019-03-15 14:47:01

标签: opengl depth-testing

我的opengl代码遇到问题

我正在尝试盖房子并将其旋转360°,为简单起见,我们假设房子的前墙带有窗户和dor,后墙。

我正在使用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 个答案:

答案 0 :(得分:3)

该问题称为Z-fighting。这是因为“门”,“窗”和“墙”的深度相等。顶点坐标由模型视图矩阵和投影矩阵进行转换,并为多边形覆盖的每个片段进行插值。这导致最终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
// ...

多边形填充偏移量可将片段的深度控制为最小。这导致即使在通过模型视图和投影矩阵进行转换之后,“墙”的深度也不同于“窗口”和“门”的深度。
由于将偏移量添加到“墙”的深度,因此“墙”始终位于窗口和门的后面,与视点无关。