【问题标题】:Objects shake when rotating旋转时物体晃动
【发布时间】:2019-08-06 16:27:26
【问题描述】:

我的 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();

【问题讨论】:

    标签: opengl depth-testing


    【解决方案1】:

    这个问题被称为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
    // ...
    

    多边形填充偏移以最小量操纵片段的深度。这导致“墙”的深度与“窗”和“门”的深度不同,即使经过模型视图和投影矩阵的变换。
    由于向“墙”的深度添加了偏移量,因此“墙”始终位于窗户和门的后面,与视角无关。

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2022-06-29
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      相关资源
      最近更新 更多