2011-03-23 20 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不知道或不关心你是否重复顶点。

相关问题