2011-03-23 46 views
0

OBJ文件使用索引到頂點的f行非常高效地表示數據。 但我注意到有很多OBJ模型有重複的v行。例如這裏是一個立方體試樣OBJ內容:爲什麼在OBJ文件中複製頂點/法線?

# Max2Obj Version 4.0 Mar 10th, 2001 
# 
mtllib ./Cube 2.mtl 
g 
# object Cube_1 to come ... 
# 
v -5.500000 0.000000 -1.000000 
v -5.500000 0.000000 1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -5.500000 2.000000 1.000001 
v -7.500000 2.000000 1.000000 
v -7.500000 2.000000 -1.000000 
v -5.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -5.500000 2.000000 1.000001 
v -5.500000 0.000000 -1.000000 
v -5.500000 2.000000 1.000001 
v -5.500000 0.000000 1.000000 
v -5.500000 0.000000 1.000000 
v -5.500000 2.000000 1.000001 
v -7.500000 2.000000 1.000000 
v -5.500000 0.000000 1.000000 
v -7.500000 2.000000 1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 2.000000 1.000000 
v -7.500000 2.000000 -1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 2.000000 -1.000000 
v -7.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -5.500000 0.000000 -1.000000 
v -7.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -7.500000 0.000000 -1.000000 
v -7.500000 2.000000 -1.000000 
# 32 vertices 

vt 0.000500 0.999500 0.000500 
vt 0.000500 0.000500 0.000500 
vt 0.999501 0.000500 0.000500 
vt 0.999501 0.999500 0.000500 
vt 0.999500 0.999500 0.999501 
vt 0.999500 0.000500 0.999501 
vt 0.000499 0.000500 0.999501 
vt 0.000499 0.999500 0.999501 
vt 0.999500 0.000500 0.999500 
vt 0.999500 0.999501 0.999500 
vt 0.000500 0.999501 0.999500 
vt 0.999500 0.000500 0.999500 
vt 0.000500 0.999501 0.999500 
vt 0.000500 0.000500 0.999500 
vt 0.999500 0.000500 0.000500 
vt 0.999500 0.999501 0.000500 
vt 0.000499 0.999501 0.000500 
vt 0.999500 0.000500 0.000500 
vt 0.000499 0.999501 0.000500 
vt 0.000499 0.000500 0.000500 
vt 0.999500 0.000500 0.000499 
vt 0.999500 0.999501 0.000499 
vt 0.000500 0.999501 0.000499 
vt 0.999500 0.000500 0.000499 
vt 0.000500 0.999501 0.000499 
vt 0.000500 0.000500 0.000499 
vt 0.000500 0.999501 0.999500 
vt 0.000500 0.000500 0.999500 
vt 0.999501 0.000500 0.999500 
vt 0.000500 0.999501 0.999500 
vt 0.999501 0.000500 0.999500 
vt 0.999501 0.999501 0.999500 
vt 0.000500 0.999500 0.000500 
vt 0.999501 0.000500 0.000500 
vt 0.999500 0.999500 0.999501 
vt 0.000499 0.000500 0.999501 
# 36 texture vertices 

vn 0.000000 -1.000000 -0.000000 
vn 0.000000 -1.000000 -0.000000 
vn 0.000000 -1.000000 -0.000000 
vn 0.000000 -1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn -0.000000 -0.000000 1.000000 
vn -0.000000 -0.000000 1.000000 
vn -0.000000 -0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
# 32 vertex normals 

g Cube_1 
usemtl 01_-_Default_1 
s 0 
f 1/33/1 2/2/2 3/34/3 
f 1/1/1 3/3/3 4/4/4 
f 5/35/5 8/8/8 7/36/7 
f 5/5/5 7/7/7 6/6/6 
f 9/9/9 10/10/10 11/11/11 
f 12/12/12 13/13/13 14/14/14 
f 15/15/15 16/16/16 17/17/17 
f 18/18/18 19/19/19 20/20/20 
f 21/21/21 22/22/22 23/23/23 
f 24/24/24 25/25/25 26/26/26 
f 27/27/27 28/28/28 29/29/29 
f 30/30/30 31/31/31 32/32/32 
# 12 faces 

g 

這會導致很多問題,當我使用gl.glDrawElements(GL10.GL_TRIANGLES,mNumOfIndices,GL10.GL_UNSIGNED_SHORT,mIndicesBuffer) 進口這樣一個模式到OpenGL ES的應用由於與法線有關的錯誤陰影引起的繪圖方法。看來我們希望如果我們使用drawElement方法而不是DrawArrays,我們給它的頂點不會被重複。

f行使得有可能消除任何重複以產生用於在OpenGL-ES中處理的非常有效的數據。但是OBJ文件有重複的結果,這些重複的結果與f行的目的不符。

回答

1

這很可能只是因爲保持數據的方式與OpenGL的固定管道在內部執行的方式相同,而OBJ允許消除冗餘而不需要它。所以只要軟件輸出的東西是一個有效的OBJ文件並描述了正確的形狀,它的作者就滿意了。你說的沒有必要複製OBJ中的任何位置,法線或紋理座標 - 'f'聲明提供了一個間接的級別以避免這種情況。

要顯示包含v個頂點,n個法線和t個紋理座標的一般情況OBJ,您需要準備好在最壞的情況下將v * n * t個頂點提交給OpenGL。 OpenGL不知道或不關心你是否重複頂點。

相關問題