OBJ文件解析

OBJ文件是一种文本文件,可以直接用写字板或是文档编辑器进行查看和编辑修改。
1.OBJ文件特点
(1)OBJ文件是一种3D模型文件,不包含动画、材质特性、贴图路径、动力学、粒子等信息。
(2)OBJ文件主要支持多边形(Polygons)模型。
(3)OBJ文件支持三个点以上的面。
(4)OBJ文件支持法线和贴图坐标。

2.OBJ文件结构:
以一个立方体模型的test.obj文件为例,以下为文件内容:

mtllib cube.mtl
g default
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.998008 0.998008
vt 0.001992 0.998008
vt 0.998008 0.001992
vt 0.001992 0.001992
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 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 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 -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 -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
s 1
g pCube1
usemtl file1SG
f 1/1/1 2/2/2 3/3/3
f 3/3/3 2/2/2 4/4/4
s 2
f 3/13/5 4/14/6 5/15/7
f 5/15/7 4/14/6 6/16/8
s 3
f 5/21/9 6/22/10 7/23/11
f 7/23/11 6/22/10 8/24/12
s 4
f 7/17/13 8/18/14 1/19/15
f 1/19/15 8/18/14 2/20/16
s 5
f 2/5/17 8/6/18 4/7/19
f 4/7/19 8/6/18 6/8/20
s 6
f 7/9/21 1/10/22 5/11/23
f 5/11/23 1/10/22 3/12/24

3.OBJ文件分析
从文件内容看,其内容比较简单,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的数据行都由关键字(Keyword)开头,简单解释了这一行的数据时是什么。而多行之间可以使用连接符反斜杠()将不同意义的数据逻辑地连接在一起表示一行(如果要自己对文件进行修改,特别需要注意连接符()后面不能出现空格或Tab格,否则文件将出错)。

下面将逐一解释文件中每行数据代表的意义:
简单来讲,
以字母"v"开头的行是顶点数据,在v -0.500000 -0.500000 0.500000中左边第一个" -0.500000"是这个顶点的X轴坐标值,中间的"-0.500000"为Y轴坐标值,最后的"0.500000"为Z轴坐标值,另外它的索引号是1(索引号是在画图时规定了的,在这里不做讨论)。
以字母"vt"开头的行是顶点数据的贴图/纹理坐标点 (Texture vertices),其值为u, v,如vt 0.001992 0.001992。纹理坐标指的是,纹理图片如果被放在屏幕上显示时,以屏幕左下角为原点的坐标。
以字母"vn"开头的行是顶点数据之法线向量(normal),其值为x,y,z,如vn 0.000000 0.000000 1.000000。其实这个法向量是表示顶点的朝向,由顶点的xyz的坐标分别相加再除以3得到的。假设有三个顶点组成一个面,面是有两个朝向,向里或向外,所以可以通过顶点的朝向来确定面的朝向,特别的这三个顶点的法向量是相同的。
以字母"f"开头的行是表示面(face),以3个"v/vt/vn"的索引形式组成。比如obj文件中
f 3/13/5 4/14/6 5/15/7 ,表示由第2、第13、第5这三个顶点组成了一个三角平面,平面的纹理由第4、第14、第6这三个纹理坐标形成,而这个平面的朝向是第5、第15、第7这三个顶点的法向量的平均值决定的。

4.对于索引数据而言,通常写的3D程序中一个索引值对应于一个顶点,这个顶点有固定的空间坐标,纹理坐标,法线等信息。
而对于obj文件,一个索引值对应于一个顶点数据的空间坐标或者纹理坐标或法线,且均是由1开始计数。
比如说,对于上述的立方体obj文件中,
以字母"v"开始的第一行直到结束的第八行分别对应于索引1-8,
以字母"vt"开始的第一行直到结束的第二十四行分别对应于索引1-24,
以字母"vn"开始的第一行直到结束的第二十四行分别对应于索引1-24.....
因此需要取特别的行数据时,可以以 "v"索引/"vt"索引/"vn"索引 的格式自由组合,描述顶点信息。如v3/vt24/vn19

补充:名词解释
(1)顶点数据(Vertex data):
v 几何体顶点(Geometric vertices)
vt 贴图坐标点(Texture vertices)
vn 顶点法线(Vertex normals)
vp 参数空格顶点 (Parameter space vertices)

(2)元素(Elements):
p 点(Point)
l 线(Line)
f 面(Face)
curv 曲线(Curve)
curv2 2D曲线(2D curve)
surf 表面(Surface)

(3)自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):
parm 参数值(Parameter values )
trim 外部修剪循环(Outer trimming loop)
hole 内部整修循环(Inner trimming loop)
scrv 特殊曲线(Special curve)
sp 特殊的点(Special point)
end 结束陈述(End statement)

(4)成组(Grouping):
g 组名称(Group name)
s 光滑组(Smoothing group)
mg 合并组(Merging group)
o 对象名称(Object name)

你可能感兴趣的:(文件)