为什么顶点/法线在OBJ文件中重复?

时间:2011-03-23 16:35:22

标签: opengl-es

OBJ文件使用f作为顶点索引的行来非常有效地表示数据。 但是我注意到很多OBJ模型都有重复的v行。例如,这里是一个示例立方体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,似乎opnegl-es期望我们给它的顶点不重复。

f行可以消除任何重复,从而生成非常有效的数据,以便在OpenGL-ES中进行处理。但OBJ文件有重复,这违背了f行的目的。

1 个答案:

答案 0 :(得分:1)

这可能只是因为保持数据的方式与OpenGL的固定管道内部相同,OBJ允许消除冗余但不需要冗余。因此,只要软件输出有效的OBJ文件并描述正确的形状,其作者就会满意。你说没有必要复制OBJ中的任何位置,法线或纹理坐标是正确的 - 'f'声明提供了一个间接级别,以避免这种情况。

要显示包含v顶点,n法线和t纹理坐标的一般情况OBJ,您需要准备好在最坏的情况下将v * n * t顶点提交给OpenGL。 OpenGL不知道或不关心你是否复制顶点。