【转】OBJ 文件格式
OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。
OBJ文件特点
(1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。
(2)OBJ文件主要支持多边形(Polygons)模型。
虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。
(3)OBJ文件支持三个点以上的面,这一点很有用。
(4)OBJ文件支持法线和贴图坐标。 在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标了。
(5)OBJ文件不支持有孔的多边形面。
(6)OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。
OBJ文件的前缀
OBJ文件以纯文本的形式存储了模型的顶点、法线和纹理坐标和材质使用信息。
在OBJ文件中,每行的格式如下:前缀 参数1 参数2 参数3 ...
(前缀标识了这一行所存储的信息类型。参数则是具体的数据。)
OBJ文件的前缀可以有:
v 表示本行指定一个顶点。此前缀后跟着3个单精度浮点数,分别表示该定点的X、Y、Z坐标值
vt 表示本行指定一个纹理坐标。此前缀后跟着两个单精度浮点数。分别表示此纹理坐标的U、V值
vn 表示本行指定一个法线向量。此前缀后跟着3个单精度浮点数,分别表示该法向量的X、Y、Z坐标值
f 表示本行指定一个表面(Face)。一个表面实际上就是一个三角形图元。此前缀行的参数格式后面将详细介绍。
usemtl 此前缀后只跟着一个参数。该参数指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称。该材质可以在此OBJ文件所附属的MTL文件中找到具体信息。
mtllib 此前缀后只跟着一个参数。该参数指定了此OBJ文件所使用的材质库文件(*.mtl)的文件路径
以“#”开头的表示注释的前缀,以g开头的表示组的前缀。这些前缀并不影响模型的外观,可以忽略它们。
建立顶点索引
假设Indices:array of Integer是顶点索引数组,Vertices:array of TVertex是顶点数组,使用下面的代码段就可以把整个顶点索引对应的所有三角形绘制出来:
procedure DrawIndex(Indices:array of Integer;Vertices:array of TVertex);
var i :Integer;
begin
glBegin(GL_TRIANGLES);
for i := 0 to (High(Vertices)+1) div 3 -1 do
begin
glVertex3fv(@Vertices[Indices[i*3]]);
glVertex3fv(@Vertices[Indices[i*3+1]]);
glVertex3fv(@Vertices[Indices[i*3+2]]);
end;
glEnd;
end;
OBJ文件为模型中所有的顶点、法线、纹理坐标都建立起相应的索引,以节省更多的空间。
面可以使用负值索引,有时用负值索引描述面更为简便。
"f -4 -3 -2 -1"这句索引值"-3"表示从"f"这行往上数第3个顶点,
OBJ文件的结构
在一个OBJ文件中,首先有一些以v、vt或vn前缀开头的行指定了所有的顶点、纹理坐标、法线的坐标。然后再由一些以f开头的行指定每一个三角形所对应的顶点、纹理坐标和法线的索引。在顶点、纹理坐标和法线的索引之间,使用符号“/”隔开的。一个f行可以以下面几种格式出现:
f 1 2 3
表示以第1、2、3号顶点组成一个三角形。
f 1/3 2/5 3/4
表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,第二个顶点的纹理坐标的索引值为5,第三个顶点的纹理坐标的索引值为4。
f 1/3/4 2/5/6 3/4/2
表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,其法线的索引值是4;第二个顶点的纹理坐标的索引值为5,其法线的索引值是6;第三个顶点的纹理坐标的索引值为6,其法线的索引值是2。
f 1//4 2//6 3//2
表示以第1、2、3号顶点组成一个三角形,且忽略纹理坐标。其中第一个顶点的法线的索引值是4;第二个顶点的法线的索引值是6;第三个顶点的法线的索引值是2。
注意:文件中的索引值是以1作为起点的,在渲染的时候应注意将从文件中读取的坐标值减去1。
OBJ文件的基本结构
点数据(Vertex data):
v 几何体顶点 (Geometric vertices)
vt 贴图坐标点 (Texture vertices)
vn 顶点法线 (Vertex normals)
vp 参数空格顶点 (Parameter space vertices)
--------------------------------------------------------
自由形态曲线(Free-form curve)/表面属性(surface attributes):
deg 度 (Degree)
bmat 基础矩阵 (Basis matrix)
step 步尺寸 (Step size)
cstype 曲线或表面类型 (Curve or surface type)
--------------------------------------------------------
元素(Elements):
p 点 (Point)
l 线 (Line)
f 面 (Face)
curv 曲线 (Curve)
curv2 2D曲线 (2D curve)
surf 表面 (Surface)
--------------------------------------------------------
自由形态曲线(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)
--------------------------------------------------------
自由形态表面之间的连接(Connectivity between free-form surfaces):
con 连接 (Connect)
--------------------------------------------------------
成组(Grouping):
g 组名称 (Group name)
s 光滑组 (Smoothing group)
mg 合并组 (Merging group)
o 对象名称 (Object name)
--------------------------------------------------------
显示(Display)/渲染属性(render attributes):
bevel 导角插值 (Bevel interpolation)
c_interp 颜色插值 (Color interpolation)
d_interp 溶解插值 (Dissolve interpolation)
lod 细节层次 (Level of detail)
usemtl 材质名称 (Material name)
mtllib 材质库 (Material library)
shadow_obj 投射阴影 (Shadow casting)
trace_obj 光线跟踪 (Ray tracing)
ctech 曲线近似技术 (Curve approximation technique)
stech 表面近似技术 (Surface approximation technique)
MTL文件
材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
newmtl:定义新的材质组。对应数据为材质组名称。
Ka,Kd,Ks,Ke:材质的环境(ambient),散射(diffuse),镜面(specular),放射(emissive)参数。对应数据为r,g,b,a。
Ns:材质的光亮度(shininess)。对应一个数据。
d,Tr:均可用于定义材质的Alpha透明度。对应一个数据。
sharpness,illum:材质的锐度(sharpness)和照明度(illumination)。对应一个数据。
Ni:材质的光密度(optical density)。对应一个数据。
Tf:材质的透射滤波(transmission filter)。对应数据为r,g,b,a。(OSG中没有读取滤波文件的功能)
map_Ka,map_Kd,map_Ks:材质的环境(ambient),散射(diffuse)和镜面(specular)贴图。对应数据为贴图文件名称。
refl:材质的反射属性。OSG中没有读取其参数。