2012-12-03 46 views
0

我使用Blender創建.obj文件,然後嘗試編寫自定義分析器來讀取文件並創建網格。我有幾個問題。我的例子是使用攪拌機的立方體,但我想擴展我的問題超出立方體。.obj文件triangle_fan或三角形

當我創建攪拌機一個立方體,並保存爲一個obj文件,我得到這個...

# Blender v2.63 (sub 0) OBJ File: '' 
# www.blender.org 
mtllib cube.mtl 
o Cube_Cube.001 
v -0.911915 -0.851241 1.196067 
v -0.911915 -0.851241 -0.803933 
v 1.088085 -0.851241 -0.803933 
v 1.088085 -0.851241 1.196067 
v -0.911915 1.148759 1.196067 
v -0.911915 1.148759 -0.803933 
v 1.088085 1.148759 -0.803933 
v 1.088085 1.148759 1.196067 
usemtl 
s off 
f 2 1 5 6 
f 6 7 3 2 
f 7 8 4 3 
f 1 4 8 5 
f 1 2 3 4 
f 8 7 6 5 

我的網格渲染的方法看起來是這樣的....

@Override 
    public void draw(GL10 gl) 
    { 
     super.draw(gl); 
     gl.glColor4f(255, 0, 255, 150); 
     gl.glFrontFace(GL10.GL_CCW); 
     gl.glEnable(GL10.GL_CULL_FACE); 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer); 

     gl.glDrawElements(GL10.GL_TRIANGLE_FAN,vertexBuffer.array().length,GL10.GL_UNSIGNED_SHORT,indexBuffer); 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glDisable(GL10.GL_CULL_FACE); 
     gl.glColor4f(255, 255, 255, 255); 
    } 

如何填充我的索引緩衝區和頂點緩衝區以便能夠繪製此多維數據集。我可以在一個「drawElements」函數中擁有所有頂點,還是必須按三角形做三角形? .obj文件是否會使四個以上的頂點成爲一張臉? (如二維五角大樓或六角形?)如果是這樣,我將如何繪製這些? .OBJ文件是否使用Triang風扇或條帶?

謝謝!

回答

0

OpenGL和圖形卡只是簡單的機器,它可以非常快速地繪製三角形。因此你應該首先關注三角形。忽略四邊形。無論如何,四邊形通常由一組兩個三角形取代,您無法控制它們是如何分開的。五角星等問題更多。也忽略帶子和粉絲。無論如何,通用的3D模型通常只有三角形。在特殊情況下,風扇和條可用作優化。例如,如果從高度圖中以網格的形式對景觀進行建模,則三角形條是非常有用的。

+0

有道理....那麼我怎麼解釋.obj文件中提供給我的索引緩衝區?他們將面部列爲一組4個指數而不是6個(6是構成面部的兩個三角形) – Matthew

+0

f 2 1 5 6 - 您可以將其解釋爲兩個三角形(2,1,5)和(1 ,5,6)。不知道排序是否正確。然後將這兩個三角形加載到緩衝區中。只要它們創建一個凸多邊形,obj格式就可以有任意數量的頂點。這取決於你如何加載。在這種情況下,您可能會使用三角風扇,但您會有很多OpenGL API調用(從風扇切換到三角形等)。擁有一個大三角形緩衝區並在一個API調用中渲染會更快。 – Eiver

1

就實際效率提升而言,如果將緩衝區存儲在GPU上,最有可能不會有一個。如果您正在計算CPU上的數據並將其緩存到每個幀(如果可以,應該避免使用它,並將其存儲在GPU本身中),那麼您將通過使用三角形風扇/條帶來減小緩衝區大小。但是,在光柵化過程中,除非光柵化器循環能夠遍歷具有多於3個頂點的複雜形狀(我高度懷疑),否則它將不得不三角形化多邊形。

我不是一個沉重的android程序員,但如果您使用的OpenGL版本具有「GenerateBuffer()」&「DrawArrays()」,請使用它們。由於使用三角形風扇/條只能真正幫助硬件組件之間的緩衝速度,如果您的Android設備沒有專用圖形設備,可能無法進行優化。

就你將如何做的而言,你只需對三角形列表進行三角化。使用三角形條時,必須遍歷所有三角形,並找到與之前每個頂點具有相同2頂點位置的列表。對於三角形的球迷來說,你需要遍歷所有的三角形,並找到一個與前一個頂點相同的2個頂點位置的列表,並且它們都必須有一個相同的旋轉起點頂點。

以上描述是的三角測量算法只是逆:


    三角形條帶(給定的 「n」 個verteces列表): 每個三角形是「新的三角形(N-2,n-1個,n)「其中(n> 2)
    三角形扇(給出」n「個頂點列表): 每個三角形是」新三角形(0,n-1,n)「,其中」0「是第一個元素和(n> 2)

對於四邊形(與您的示例代碼一樣),可以使用上面的三角形扇形方法(triangl e strip無法從blender obj文件四邊形中運行)。

+0

感謝您對三角形條*和*三角形風扇的描述。我一直把它們混爲一談,就像我腦子裏一樣。 –