OBJ格式解析
格式介绍
obj文件是3D模型文件格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准,适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过其中很多需要通过插件才能实现。
OBJ3.0文件格式支持直线(Line)、多边形(Polygon)、表面(Surface)和自由形态曲线(Free-form Curve)。直线和多边形通过它们的点来描述,曲线和表面则根据它们的控制点和依附于曲线类型的额外信息来定义,这些信息支持规则和不规则的曲线,包括那些基于贝塞尔曲线(Bezier)、B样条(B-spline)、基数(Cardinal/Catmull-Rom)和泰勒方程(Taylor equations)的曲线。其他特点如下:
- OBJ文件是一种3D模型文件。不包含动画、材质特性、贴图路径、动力学、粒子等信息。
- OBJ文件主要支持多边形(Polygons)模型。虽然也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。
- OBJ文件支持三个点以上的面,这一点很有用。很多其它的模型文件格式只支持三个点的面,所以导入Maya的模型经常被三角化了,这对于我们对模型进行再加工甚为不利。
- OBJ文件支持法线和贴图坐标。在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标。
格式解析
OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。
OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(/)。注意连接符(/)后面不能出现空格或Tab格,否则将导致文件出错。
下列关键字可以在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)
下面就是一个.ojb文件里的内容。
1 |
|
该obj得到的模型(立方体)如下:
- v: 表示顶点,即组成图的点,如立方体有8个顶点,每个顶点有x,y,z三个值。点的索引以1起始
- vt: 纹理坐标,其值为u, v,w。纹理应该是指某个面的粗糙程度(我暂且没看出这个变化),那纹理为什么有坐标呢?想象一块可以自由拉伸的布,坐标表示这个布的一角要放在这个位置,这就是纹理坐标。我们知道一个面最少由三个顶点才能构成,如果此时将一块布拉伸到这三个顶点上,则这块布会变成一个三角形。
- vn:顶点法向量,其值为x,y,z,你可能好奇为什么顶点有法向量,其实这个法向量是表示顶点的朝向。如果有三个顶点组成一个面,面是有两个朝向,向里或向外,所以可以通过顶点的朝向来确定面的朝向。而且这三个顶点的法向量是一样的。
- g: 表示组,后面参数为组名称,指定从此行之后到下一个以g开头的行之间的所有元素结合到一起
- f:表示一个面,由三个v/vt/vn的索引形式组成。比如obj文件中f 5/15/7 4/14/6 6/16/8 ,表示由第5、第4、第6这三个顶点组成了一个三角平面,平面的纹理由第15、第14、第16这三个纹理坐标形成,这个平面的朝向是第7、第6、第8这三个顶点的法向量求平均值。
- s off 表示关闭光滑组。说明这些面不该被平滑,编译器也会忽略该行
- usemtl: 此关键字后参数为材质名称,指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称,该材质可以在此obj文件所附属的mtl文件中找到具体信息
- mtllib: 此关键字后参数为文件名称,指定了obj文件所使用的材质库文件(mtl文件)的文件名称
mtl文件
obj文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。mtl文件是obj文件附属的材质库文件,材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
mtl文件使用的关键字
- newmtl: 定义新的材质组,后面参数为材质组名称
- Ka: 材质的环境光(ambient color)
- Kd: 散射光(diffuse color)
- Ks: 镜面光(specular color)
- Ke: 放射光(emissive color)
- Ns: 材质的光亮度
- d,Tr 均可用于定义材质的Alpha透明度
- sharpness: 材质的锐度(sharpness)
- illum: 照明度(illumination)后面可接0~10范围内的数字参数
- 0 Color on and Ambient off
- 1 Color on and Ambient on
- 2 Highlight on
- 3 Reflection on and Ray trace on
- 4 Transparency: Glass on
Reflection: Ray trace on - 5 Reflection: Fresnel on and Ray trace on
- 6 Transparency: Refraction on
Reflection: Fresnel off and Ray trace on - 7 Transparency: Refraction on
Reflection: Fresnel on and Ray trace on - 8 Reflection on and Ray trace off
- 9 Transparency: Glass on ,Reflection: Ray trace off
- 10 Casts shadows onto invisible surfaces
- Ni : 材质的光密度(optical density)
- Tf: 材质的透射滤波(transmission filter),对应数据为r,g,b值
- map_Ka、map_Kd map_Ks 材质的环境,散射和镜面贴图,对应数据为贴图文件名称
- refl: 材质的反射属性