2011-12-06 48 views
1

顯示我跟着如何創建一個攪拌器城堡教程,然後我導出爲obj文件,並將其解析到如下所示的格式:解析的我obj文件,但它正在古怪

GLfloat mesh01_coords[] = { 
50, 0.1, 50, 
-50, 0.1, 50, 
-50, 0.1, -50, 
50, 0.1, -50, 
-9.6351, 9.94983, 17.4283, 
-9.6351, 9.94983, 18.7616, 
-9.07887, 9.94983, 18.7616, 
-9.07887, 9.94983, 17.4283, 
10.2729, 9.94983, 18.8564, 
10.2729, 9.94983, 17.523, 
9.71662, 9.94983, 17.523, 
9.71662, 9.94983, 18.8564, 
10.3075, 9.94983, 20.0883, 
8.97417, 9.94983, 20.0883, 
8.97417, 10.9498, 20.0883, 
... 

編輯:我有我的指數陣列設置

GLubyte mesh01_indices[] = { 
0, 2, 1, 
0, 3, 2, 
4, 6, 5, 
4, 7, 6, 
... 

難道我的模型負載只是

glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 
glNormalPointer(GL_FLOAT, 0, mesh01_normals); 
glVertexPointer(3, GL_FLOAT, 0, mesh01_coords); 
glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices); 

這產生R andom對象沒有接近我想要的結果

EDIT2:謝謝大家的幫助,我得到了它的工作。

+0

您正在使用的索引以及城堡?那些是定義三角形的東西。座標僅僅是網格的頂點。 – Bart

+0

你的問題是..? – ildjarn

+0

我的問題是,如果我應該使用GL_QUADS或者不是,那麼問題可能是我的數組大約是20000個索引長?這將是什麼工作? – thesentyclimate413

回答

1

的OBJ文件使用索引。基本上這意味着通過指定三角形作爲頂點數組中的索引來消除重複的頂點,而不是直接指定具有頂點的三角形。

這裏是一個做事繪製一個正方形(僞)的「天真」的方式爲例:

// Triangle 1 
Vertex v1 = (-1, 1, 0) 
Vertex v2 = (-1, -1, 0) 
Vertex v3 = (1, -1, 0) 
// Triangle 2 
Vertex v4 = (1, -1, 0) 
Vertex v5 = (-1, 1, 0) 
Vertex v6 = (1, 1, 0) 

使用指標,這將是這樣的:

Vertex v1 = (-1, 1, 0) 
Vertex v2 = (-1, -1, 0) 
Vertex v3 = (1, -1, 0) 
Vertex v4 = (1, 1, 0) 

indices = {v1, v2, v3, // First triangle 
      v3, v1, v4} // Second triangle 

現在,因爲你是以「天真」的方式加載你的數據,你基本上跳過了一些需要渲染的三角形(因此是「缺失的方面」)。另外,有些三角形將無法正確渲染,因爲您是從可能彼此沒有關係的頂點創建它們。

使用GL_QUADS不會解決你的問題。你可以創建一個像第二個例子那樣操作的索引緩衝區,或者存儲頂點,然後循環遍歷索引並創建索引中的單個頂點到頂點數組中,這會導致類似於第一個例子。但是,採用後者的方式會導致性能較差和內存消耗較多,因爲您存儲更多頂點,因此需要將更多信息傳遞給顯卡。

+0

謝謝你的回答@NickLH,我用我的索引數組編輯了我的主帖,但仍然無法得到結果 – thesentyclimate413

0

您的代碼

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, mesh01_indices); 

將只畫出一個三角形,因爲它會只使用前3個指標。嘗試

glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices); 

其中n是mesh01_indices中的索引數。

+0

謝謝你,我的結果確實顯示了多一點。儘管它沒有什麼與我期望的結果很接近。幾乎只是看起來像隨機原語。 – thesentyclimate413

+0

你可以嘗試改變GLubyte mesh01_indices []到GLuint mesh01_indices []',然後使用GL_UNSIGNED_INT而不是GL_UNSIGNED_BYTE嗎? – Bart

+0

我現在已經有點看起來像一座城堡了,但很多事情都缺失了。我開始認爲我的攪拌機沒有正確導出或其他東西 – thesentyclimate413

1

通過使用GL_UNSIGNED_INT我的指標,以及重新編譯我的攪拌機的文件,以確保一切的確是個三角形,我能夠看到