obj格式是什么意思

你是否好奇那些3D游戏中复杂的角色、建筑、场景是怎么实现的,美工使用3D建模软件设计好角色模型之后,程序又是怎么让它们动起来的哪?

在计算机中,3D角色等模型最终都是存储成文件,这些文件必然携带了角色形状、材质等属性,程序就是通过读取并解析这些文件,通过代码控制它们动起来,创造了一个又一个精彩的游戏世界。另外,看似复杂无比的模型都是通过大量三角形来逼近的,表示单个三角形就简单很多了,而3D模型文件的内容也就是立足于三角形。

obj文件是Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,大部分3D软件都支持导入、导出obj格式的模型文件。

立方体模型

接下来,我们使用blender这款开源的3D建模软件创建一个简单的立方体模型,设置立方体的顶面颜色为橘黄色,其他面全部为红色,j将其导出为obj文件,使用任意文本编辑器打开来一步步看看里面都有什么。

说明:导出共生成了两个文件,一个为.obj后缀模型文件,一个为.mtl后缀的材质文件。

看懂obj模型文件

完整的obj文件内容如下

# Blender v3.1.2 OBJ File: # www.blender.orgmtllibmycube.mtloCubev1.0000001.000000-1.000000v1.000000-1.000000-1.000000v1.0000001.0000001.000000v1.000000-1.0000001.000000v-1.0000001.000000-1.000000v-1.000000-1.000000-1.000000v-1.0000001.0000001.000000v-1.000000-1.0000001.000000vt0.6250000.500000vt0.8750000.500000vt0.8750000.750000vt0.6250000.750000vt0.3750000.750000vt0.6250001.000000vt0.3750001.000000vt0.3750000.000000vt0.6250000.000000vt0.6250000.250000vt0.3750000.250000vt0.1250000.500000vt0.3750000.500000vt0.1250000.750000vn0.00001.00000.0000vn0.00000.00001.0000vn-1.00000.00000.0000vn0.0000-1.00000.0000vn1.00000.00000.0000vn0.00000.0000-1.0000usemtlMaterialsofff1/1/15/2/17/3/13/4/1usemtlMaterial.001f4/5/23/4/27/6/28/7/2f8/8/37/9/35/10/36/11/3f6/12/42/13/44/5/48/14/4f2/13/51/1/53/4/54/5/5f6/11/65/10/61/1/62/13/6
#开头的表示注释。mtllib mycube.mtl表示引用了一个外部的材质文件,材质文件名为mycube.mtl,后面会介绍材质文件的内容。o Cube指定了模型名称为Cube。v开头的共有8行,表示立方体的8个顶点坐标(x,y,z)。vt开头的共有14行,表示uv贴图坐标(x,y),看到这些奇怪的数字可能让你一头雾水,当我们把这14行数字表示的坐标点逐一绘制出来,并将相邻的点连接起来就得到了下面的图形。这样就豁然开朗了,它就像是一张包装纸,刚好可以包裹住一个立方体盒子的6个面。

vn开头的共有6行,它表示立方体6个面对应的法向量,法向量在这里起到识别某个面是正面还是反面的作用。usemtl Material表示使用mycube.mtl文件中Material定义的材质,接下来的通过索引指定的面将使用该材质。s off表示关闭光滑组(Smoothing group)。f开头的表示由顶点、uv纹理坐标、法向量索引确定的表面,如5/2/1表示v开头的第5个顶点、这个点对应vt贴图的第2个坐标(就是包装纸的某个点应该和立方体盒子的哪个点对齐)、这个点对应vn开头的第1个法向量;一个立方体表面共有4个点,因此需要有4组索引数据来确定一个面。使用Material材质的面只有一个,就是建模时设置为橘黄色的面。usemtl Material.001表示使用mycube.mtl文件中Material.001表示的材质,接下来的通过索引指定的面将使用该材质。之后5行以f开头的面是建模时设置为红色的面,格式同橘黄色的面。看懂mtl材质文件

现在,来看看mycube.mtl材质文件都包含什么内容,完整内容如下:

# Blender MTL File: None# Material Count: 2newmtlMaterialNs359.999993Ka1.0000001.0000001.000000Kd0.8000000.5821920.154415Ks0.5000000.5000000.500000Ke0.0000000.0000000.000000Ni1.450000d1.000000illum2newmtlMaterial.001Ns250.000000Ka1.0000001.0000001.000000Kd0.8000000.0022070.009875Ks0.5000000.5000000.500000Ke0.0000000.0000000.000000Ni1.450000d1.000000illum2
#开头表示注释。newmtl Material定义材质Material,接下来的内容都是该材质的属性。Ns表示高光色的权重。Ka表示环境光,三个数字分别对应R、G、B值。Kd表示漫反射光,三个数字分别对应R、G、B值。Ks表示高光,三个数字分别对应R、G、B值。Ke表示发射光,三个数字分别对应R、G、B值。Ni表示光学密度。d表示透明度,0是完全透明,1是完全不透明。illum 2表示指定的光照模型(参考:Phong光照模型),illum后面的数字范围为0~10,具体含义如下:
0Color onand Ambient off1Color onand Ambient on2Highlight on3Reflection onand Ray trace on4Transparency: Glass onReflection: Ray trace on5Reflection: Fresnel onand Ray trace on6Transparency: Refraction onReflection: Fresnel offand Ray trace on7Transparency: Refraction onReflection: Fresnel onand Ray trace on8Reflection onand Ray trace off9Transparency: Glass onReflection: Ray trace off10Casts shadows onto invisible surfaces
newmtl Material.001表示指定材质Material.001,之后的内容都是关于该材质的属性,具体含义和Material完全相同,不再详述。参考文献

[1]. 《WebGL指南》第10章高级技术>加载三维模型,401页。

obj格式是什么意思