# obj、mtl文件格式详解 研究3D模型,就免不了用到了.obj文件及.mtl文件。 对这两种格式文件内容一头雾水,所有总结归纳一下,以备学习。 # obj 文件 > obj文件格式是Wavefront公司为它的一套基于工作站的3D建模和动画软件"AdvancedVisualizer"开发的一种文件格式。 OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件。 ## OBJ文件特点 - 1、OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。 - 2、OBJ文件主要支持多边形(Polygons)模型。 虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。 - 3、OBJ文件支持三个点以上的面,这一点很有用。 很多其它的模型文件格式只支持三个点的面,所以我们导入Maya的模型经常被三角化了,这对于我们对模型的再加工甚为不利。     - 4、OBJ文件支持法线和贴图坐标。 ## 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 betweenfree-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) ``` # obj对应的材质文件 # mtllib testvt.mtl # 组名称 g default # o 对象名称(Object name) o testvt.obj # 顶点 v -0.5 -0.5 0.1 v -0.5 -0.5 -0.1 v 0 0.5 0.1 v 0 0.5 -0.1 v 0.5 -0.5 0.1 v 0.5 -0.5 -0.1 # 纹理坐标 vt 0 1 vt 1 1 vt 0.5 0 # 顶点法线 vn 0 0 1 vn 0 0 -1 # 当前图元所用材质 usemtl Default # s Smooth shading across polygons is enabled by smoothing groups. # Smooth shading can be disabled as well. s off # v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3(索引起始于1) f 1/1/1 5/2/1 3/3/1 f 6/2/2 2/1/2 4/3/2 ``` # mtl 文件 三维模型处理会要读取.mtl文件来获得材质信息。 > .mtl文件(Material Library File)是材质库文件,描述的是物体的材质信息,ASCII存储,任何文本编辑器可以将其打开和编辑。一个.mtl文件可以包含一个或多个材质定义,对于每个材质都有其颜色,纹理和反射贴图的描述,应用于物体的表面和顶点。 以下是一个材质库文件的基本结构: ``` # 定义一个名为 'xxx'的材质 newmtl xxx # 材质的环境光(ambient color) Ka 0 0 0 # 散射光(diffuse color)用Kd Kd 0.784314 0.784314 0.784314 # 镜面光(specular color)用Ks Ks 0 0 0 # 折射值 可在0.001到10之间进行取值。若取值为1.0,光在通过物体的时候不发生弯曲。玻璃的折射率为1.5。 Ni 1 # 反射指数 定义了反射高光度。该值越高则高光越密集,一般取值范围在0~1000。 Ns 400 # 滤光透射率 Tf 1 1 1 # 渐隐指数描述 参数factor表示物体融入背景的数量,取值范围为0.0~1.0,取值为1.0表示完全不透明,取值为0.0时表示完全透明。 d 1 # 为漫反射指定颜色纹理文件 map_Kd test_vt.bmp ``` ``` newmtl B01 Ns 96.078431 Ka 1.000000 1.000000 1.000000 Kd 0.640000 0.640000 0.640000 Ks 0.000000 0.000000 0.000000 Ke 0.400000 0.400000 0.400000 Ni 1.000000 d 1.000000 illum 1 map_Kd http://www.xxx.com/demo/models/texture_X1/CO1_middle_mylar_backlight.png ``` 注释:每个材质库可含多个材质定义,每个材质都有一个材质名。用newmtl mtlName来定义一个材质。对于每个材质,可定义它的颜色光照纹理反射等描述特征。 主要的定义格式如下文所示: 材质颜色光照 1、环境反射有以下三种描述格式,三者是互斥的,不能同时使用。 - Ka r g b - 用RGB颜色值来表示,g和b两参数是可选的,如果只指定了r的值,则g和b的值都等于r的值。三个参数一般取值范围为0.0~1.0,在此范围外的值则相应的增加或减少反射率; - Ka spectral file.rfl factor - 用一个rfl文件来表示。factor是一个可选参数,表示.rfl文件中值的乘数,默认为1.0; - Ka xyz x y z - 用CIEXYZ值来表示,x,y,z是CIEXYZ颜色空间的各分量值。y和z两参数是可选的,如果只指定了x的值,则y和z的值都等于r的值。三个参数一般取值范围为0~1。 2、漫反射描述的三种格式: - Kd r g b - Kd spectral file.rfl factor - Kd xyz x y z 3、镜反射描述的三种格式: - Ks r g b - Ks spectral file.rfl factor - Ks xyz x y z 4、滤光透射率描述的三种格式: - Tf r g b - Tf spectral file.rfl factor - Tf xyz x y z 5、光照模型描述格式: - illum illum_# 指定材质的光照模型。illum后面可接0~10范围内的数字参数。 - map_Kd -options args filename 为漫反射指定颜色纹理文件(.mpc)或程序纹理文件(.cxc),或是一个位图文件。作用原理与可选参数与map_Ka同。 - map_Ks -options args filename 为镜反射指定颜色纹理文件(.mpc)或程序纹理文件(.cxc),或是一个位图文件。作用原理与可选参数与map_Ka同。 - map_Ns -options args filename 为镜面反射指定标量纹理文件(.mps或.cxs)。可选参数如下所示: - blendu on | off - blendv on | off - clamp on | off - imfchan r | g | b | m | l | z - mm base gain - o u v w - s u v w - t u v w - texres value - map_d -options args filename 为消隐指数指定标量纹理文件(.mps或.cxs)。作用原理和可选参数与map_Ns同。 - map_aat on 打开纹理反走样功能。