2012-01-28 66 views
0

我在使用OpenGL爲WRL(VRML)文件中描述的對象建模。使用glDrawElements從WRL(VRML)文件中繪製對象

我真的不關心解析文件,我想這部分將是相當簡單的。在這個階段,我只是試圖在一個頂點數組和索引數組中進行硬編碼,這樣我就可以很好地理解它是如何工作的,以便我可以概括任何WRL輸入文件。

我正在嘗試一個基本的盒子(矩形棱鏡)模型。目前,我有這個頂點數組:

GLfloat vertices[] = { 
    -0.200000, -0.025000, -0.050000, 
    -0.200000, -0.025000, 0.050000, 
    -0.200000, 0.025000, -0.050000, 
    -0.200000, 0.025000, 0.050000, 
     0.200000, -0.025000, -0.050000, 
     0.200000, -0.025000, 0.050000, 
     0.200000, 0.025000, -0.050000, 
     0.200000, 0.025000, 0.050000 
}; 

與該指數數組:

GLubyte indices[] = { 
    7, 3, 5, -1, 5, 3, 1, -1, 
    6, 2, 7, -1, 7, 2, 3, -1, 
    4, 0, 6, -1, 6, 0, 2, -1, 
    5, 1, 4, -1, 4, 1, 0, -1, 
    2, 0, 3, -1, 3, 0, 1, -1, 
    4, 6, 5, -1, 5, 6, 7, -1 
}; 
直接來自於WRL文件 Coordinate3 {point []}IndexedFaceSet {coordIndex []}

我然後通過調用啓用的頂點數組功能:

glEnableClientState(GL_VERTEX_ARRAY);

,併成立了glVertexPointer:

glVertexPointer(3, GL_FLOAT, 0, vertices);

最後我用glDrawElements函數來繪製框:

glDrawElements(GL_POLYGON, 24, GL_UNSIGNED_BYTE, indices);

,然後關閉頂點數組功能:

glDisableClientState(GL_VERTEX_ARRAY);

所以在此之後,我希望要繪製一個框,當我使用glDrawElements(GL_POINTS, 24, GL_UNSIGNED_BYTE, indices);它顯示爲epected在8個頂點什麼,如果正確的頂點與線連接,將代表期望的框(除了有一個點在中間,但是當我使用26作爲計數參數,然後在中間的點消失)

但是,當我使用GL_POLYGON或GL_LINE_LOOP在glDrawElements的第一個參數中,我得到垃圾。這8個頂點顯然存在,但他們以非常奇怪的方式聯合起來。

我很困惑現在,我甚至不知道我在做正確此。也許有人可以讓我在正確的方向至少?

回答

0

的矩形棱柱不是GL_POLYGON。請注意單詞的單數形式:多邊形。如一個多邊形。矩形棱鏡由多個多邊形組成,而不僅僅是一個。

你想要的是得出一些GL_TRIANGLES。創建一個索引列表,顯示組成框的每個三角形。這意味着每個盒子的臉部都由兩個三角形組成,所以你總共需要12個三角形。這意味着36個指數。

+0

謝謝,這項工作是否適用於更復雜的3D形狀,或者是否有更好的方法來渲染這些圖形? – jacobappleton 2012-01-28 02:37:18

+0

這或多或少地表現了一切。有時可以使用'GL_TRIANGLE_STRIP',但它需要一些設置工作。你必須正確建立索引列表和一切。 – 2012-01-28 02:41:05