2011-10-24 23 views
1

我已經實現了將3DS文件加載到我的OpenGL程序中的能力,並遇到一個小問題。所有的頂點都被正確放置,並且繪製了面,但問題是大部分(或全部)頂點似乎保留了與一個或兩個頂點的連接,從而創建了大量額外的邊。任何人遇到這個問題之前,或者有什麼我可以修復它的建議?如何正確渲染3ds文件中的面孔

下面的代碼塊是我用來繪製面部的循環。它一次循環一個頂點,在理論上跳過每一個第四個值,因爲它們是未使用的面部修改器。

glBegin(GL_TRIANGLES); 
for(int x = 1; x < 4*numberOfTriangles+1; x++) 
{ 
    //Face bit modifiers not needed, skip em. 
    if(tLoop == 4) 
    { 
     tLoop = 0; 
     continue; 
    } 
    else 
    { 
     glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]); 
     tLoop++; 
    } 
} 
glEnd(); 

接下來是代表我遇到的問題的圖像。 http://img.photobucket.com/albums/v298/Reaperc89/Pistol.jpg

+0

如果不知道3ds文件中的網格數據是什麼,這很難排除故障。這可能是因爲網格存儲爲索引三角形(即作爲一組索引(其中每個3個索引集引用三個三維的頂點)以及一組頂點)。 – axon

+0

3ds文件網格數據一個接一個地存儲頂點,而面數據存儲爲表示頂點的3個索引。例如對於一個立方體來說,臉部一個的三個索引可能是4,0和7.這些將與頂點列表中的第5,第1和第8個頂點相關聯。還有第四個值也是面部數據的一部分,但它們是位面標誌修改器,對於構建幾何圖形不是必需的。 – Evan

+2

你爲什麼以'x = 1'而不是'x = 0'開頭?如果每個第四個元素都帶有'if(x%4 == 3)''而不是單獨的變量,那麼你可以跳過,儘管我建議不讀取你不想要的值(或者展開循環,這樣每次迭代繪製一個三角形)。 – user786653

回答

3

glBeginglEnd在循環之外的事實絕對沒有問題。使用每個頂點依次繪製三角形只是正確的方法。它會每3個連續的頂點建立一個三角形,這就是你想要的。

你的問題是,你在else塊內增加tLoop,因此實際上每五個索引跳過一次,而不是每四分之一。所以展開阻止了它,但它與glBegin/glEnd沒有任何關係,不能在循環之外工作。但是,像在註釋中說,你不需要tLoop無論如何,你可以只使用x代替:

glBegin(GL_TRIANGLES); 
for(int x = 1; x < 4*numberOfTriangles+1; x++) 
    if(x % 4) //works if x starts at 1, though I don't know why x has to start at 1 
     glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]); 
glEnd(); 

甚至更​​好的展開循環:

glBegin(GL_TRIANGLES); 
for(int x = 1; x < 4*numberOfTriangles+1; x+=4) { 
    glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]); 
    glVertex3f(Vertices[Triangles[x+1]*3],Vertices[(Triangles[x+1]*3)+1],Vertices[(Triangles[x+1]*3)+2]); 
    glVertex3f(Vertices[Triangles[x+2]*3],Vertices[(Triangles[x+2]*3)+1],Vertices[(Triangles[x+2]*3)+2]); 
} 
glEnd(); 

但佈置glBegin/glEnd內循環是你可以做的最愚蠢的事情。事實上,如果您已經使用基於頂點/索引數組的表示形式,將渲染代碼移植到頂點數組中應該相當容易,頂點數組比立即模式快得多,在VBO的支持下更是如此。

+0

啊,好吧,我明白你現在得到什麼,謝謝你的反饋。 – Evan

0

找出我自己的問題。注意開始塊和結束塊是如何出現在循環之外的。該程序試圖使用網格中的每個頂點一個接一個地繪製三角形。因此它創造了一個巨大的混亂。我改變了每次放置三個頂點(一個面),並且我將開始/結束塊放置在循環內,並且每次將循環更改爲4,從而允許我跳過面部數據。

以防萬一有人好奇。

+0

這就是您可以渲染三角形的最慢方式。使用glBegin/glEnd是以前不贊成使用的方式。爲每個三角形做這個只是病態的不好。我敦促你花更多的時間去試着去了解你錯在哪裏。 – Alan

+0

我是新來的openGL,並沒有意識到有一個替代方法來做到這一點。雖然現在你提到它,但我可以更多地研究它。 – Evan

+0

不,那不是你的問題,請看我的答案。 –