2013-11-02 49 views
7

我想在OpenGL中创建2个盒子,但它们出现内外,有时他们不正确重叠。视频http://www.youtube.com/watch?v=IVJu4zJFp7QOpenGL渲染盒子里面出来

我猜这是一个深度问题,但我一直无法弄清楚我做错了什么。

这里是我使用的初始化代码:

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

谢谢。

回答

8

的问题在于为了发送你的顶点。

正如我们在您的代码中看到的,您的正面的顶点顺序是。

// 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默认读取所有多边形逆时针。这就是为什么所有相​​反的面被删除/隐藏(被删除)。

要解决这个问题,你可以做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模式更改为可能会简单得多。

额外

此外,如果你想改变其面临被淘汰,你也可以改变glCullFace的模式,要么GL_FRONTGL_BACKGL_FRONT_AND_BACK初值为GL_BACK

请记住,您需要致电glEnable(GL_CULL_FACE)以根据顶点绕组剔除多边形。

编辑

如果它不是一个顶点缠绕问题,它可能(虽然这将是很奇怪),是一个深度测试的问题。

将此代码添加到您的初始化代码中。

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 
+0

不幸的是,这doesn解决不了问题。我尝试重新排序顶点,但没有效果。恢复到原始顶点并将glFrontFace更改为CW仍未修复渲染。 – Ares

+0

@Ares查看编辑答案。 – Vallentin

+0

这也是我的问题。 (使用Ubuntu 16.04,python GL和GLUT,我使用GLUT来绘制立方体而不是我自己的顶点来测试和隔离它;如果GLUT自己的立方体在里面,那么它不是绕组问题,但需要打开深度标记。 –

2

为了解决这个问题,你需要翻转过来,你的对象在你们的脸上或检查你手边的物体的法线...

如果你创建你会发现,你可以通过一个侧面看到飞机它,除非你反转法线观察侧或添加一个双面的解决方案...

我通常使用的Away3D或3D内容three.js所......的原理是相同的

+0

我试过颠倒了一些面的顶点顺序,但没有效果。这是因为背面剔除?我试图禁用它背面剔除。 – Ares

+0

是的,这可能是一种可能性,我会宁愿把我的答案放在评论中,但我不能评论问题呢..尝试通过away3D网站论坛寻找一般问题有相同的解决方案只是实施有点不同 – Careen

1

我发现了这个问题。我在我的initGlut()函数中启用了深度测试,而不是initGl()函数。

glEnable(GL_DEPTH_TEST);