OBJ 文件格式(转自http://blog.csdn.net/caca001/archive/2010/01/18/5207597.aspx)
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中没有读取其参数。
http://blog.csdn.net/caca001/archive/2010/01/18/5207597.aspx)