1。OBJ文件
OBJ文件中包含丰富的3D对象类型,而且文档 的说明很详细。因此熟悉OBJ文件的格式对于理解其他3D文件的格式也是很有用的。
下面我们举例说明OBJ文件的格式:
例1:
v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
f 1 2 3 4
v 表示顶点坐标(vertex)。
f 表示面(face),就是多边形。最后一行表示一个
有四个顶点的多边形。其顶点是用引用号(reference
number)表示的。引用号就是顶点序号。
例二:
v 0.000000 2.000000 2.000000
v 0.000000 0.000000 2.000000
v 2.000000 0.000000 2.000000
v 2.000000 2.000000 2.000000
v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
f 1 2 3 4
f 8 7 6 5
f 4 3 7 8
f 5 1 4 8
f 5 6 2 1
f 2 6 7 3
这次有8个顶点,6个面。注意OBJ文件格式规范中规定可以用负的顶引用号表示相对顶点序号,但glm不能处理这
种情况,用3D Exploration可以打开,但objview会crash)。
例3:
v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
v 4.000000 0.000000 -1.255298
v 4.000000 2.000000 -1.255298
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.276597 0.000000 0.960986
vn 0.276597 0.000000 0.960986
vn 0.531611 0.000000 0.846988
vn 0.531611 0.000000 0.846988
# 6 vertices
# 6 normals
g all
s 1
f 1//1 2//2 3//3 4//4
f 4//4 3//3 5//5 6//6
# 2 elements
# 表示注释
vn 表示顶点法向矢量(vertex normal)。我们知道在OpenGL中要使用光照需要对每个点指定 法向矢量。在OBJ文件中则把这些法向矢量集中放在一起,而用序号来引用它们。
g 表示group,all是group的名字。下面的两个 face 都属于这个group,直到下一个g 命令或者 文件结束为止。
s 表示平滑组(smooth group),1是group的序号。
比较有意思的是最后两行。1//1 中第一个1表 示顶点序号(对应于由 v 命令定义的各行),后一个1表示顶点法向矢量序号(对应于由 vn命令
定义的各行)。中间其实省略了纹理矢量序号(对应于由 vt 命令定义的各行)。2//2,3//3,4//4,都作同样的解释。因此这一行还是表示一个四边形,只不过对每个点不仅定义了顶点坐标,而且定义了法向矢量。
例4:下面是colorcube.obj的内容:
mtllib colorcube.mtl
v 0.000000 2.000000 2.000000
v 0.000000 0.000000 2.000000
v 2.000000 0.000000 2.000000
v 2.000000 2.000000 2.000000
v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
# 8 vertices
g front
usemtl red
f 1 2 3 4
g back
usemtl blue
f 8 7 6 5
g right
usemtl green
f 4 3 7 8
g top
usemtl gold
f 5 1 4 8
g left
usemtl orange
f 5 6 2 1
g bottom
usemtl purple
f 2 6 7 3
# 6 elements
mtllib colorcube.obj 表示本OBJ文件要用到一个材料文件colorcube.mtl,这个文件和本文件在同一个目录下。
usemtl red 表示此后的物体使用名叫red的材料,直到下一个usemtl 命令为止。材料red 由colorcube.mtl 定义。
下面是colorcube.mtl的内容:
#
# colocube.mtl
#
newmtl red
Ka 0 0 0
Kd 1 0 0
newmtl blue
Ka 0 0 0
Kd 0 0 1
newmtl green
Ka 0 0 0
Kd 0 1 0
newmtl gold
Ka 0.247250 0.199500 0.074500
Kd 0.751640 0.606480 0.226480
Ks 0.628281 0.555802 0.366065
illum 0
Ns 51.200001
newmtl orange
Ka 0 0 0
Kd 0.9 0.5 0
newmtl purple
Ka 0 0 0
Kd 0.7 0 0.9
newmtl red 定义一个名叫red的材料。
Ka,Kd,Ks,illum,Ns 分别定义ambient, diffuse, specular, emission 和 shiness 参数。
到这里,我们对OBJ文件中涉及多边形的部分有了初步的了解。OBJ文件还包含很多其它的命令,实现规范中的所有命令是很繁杂的工作,glm.c 只实现了涉及多边形的一部命令,大体上也就是我们这几个例子中所用到的命令。