2013-11-02 80 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);