抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

OBJ 格式解析

OBJ是一种常用的文本格式(也可以是二进制)的三维模型格式,可读性很强

.OBJ

打开一个.obj文件,通常形如

mtllib sphere.mtl
o Sphere
v 0.5 0.5 -0.5
...
vt 0.0 1.0
...
vn 0.0 0.0 1.0
...
f 1/19/15 8/18/14 2/20/16
...

obj本身是一个巨大的字符串,由换行符\n分割每一行,每一行都代表一组数组

组信息

行开头 含义
g 组名
o 物体(object)名称
s 平滑组
mg merging group
// 关闭平滑组
s off
// 下面的f都属于平滑组1
s 1
f ...
f ...

顶点数据

行开头 含义 格式
v 顶点坐标 Float3
vt 纹理坐标 Float2或Float3
vn 顶点法线 Float3

参数模型顶点数据

行开头 含义 格式
vp 参数空间顶点 Float3
cstype 曲线、曲面形式
deg
bmat
step

图元数据

行开头 含义 格式
f 四边面 v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 v4/vt4/vn4
p v1 v2 v3
l 线 v1/vt1 v2/vt2
curv 曲线
curv2 二维曲线
surf surface
// f 有多种形式,如
f 1 2 3
f 1/1/1 2/2/2 3/3/3
f 1//1 2//2 3// 3

渲染信息

行开头 含义
lod lod
使用材质名称 usemtl
引入一个材质库(很类似#include) mtllib
// 在obj的开头通常会使用mtllib引入一个材质库
mtllib sphere.mtl
// 在一组f前使用usemtl表示使用这个材质
usemtl yellow
s 1
f ...

注意事项

观察可知,对于obj来说,一个三脚面,他们的顶点坐标、纹理坐标、顶点法线的index并不是共同的,比如1/19/15就表示组成这个三角形的第一个顶点,他的顶点坐标位于第1个v,纹理坐标位于第19个vt,顶点法线位于第15个vn

而且非常阴间的是,obj的索引是从1开始的,而非0,在导入到游戏引擎被图形API使用时,需要将f的索引都减一

.mtl

mtl是常与obj一起使用的文件,用于描述材质,写过PBR的人很容易理解含义

newmtl yellow
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.599518 0.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd wmqjcfsg_2K_Albedo.jpg
map_roughness wmqjcfsg_2K_Roughness.jpg
map_metallic wmqjcfsg_2K_Displacement.jpg
map_ao wmqjcfsg_2K_AO.jpg
行开头 含义 格式 范围
Ns specular,越高高光越紧凑 Float 0~1000
Ka ambient,环境光反射率
Kd diffuse,漫反射颜色
Ks 高光颜色
Ke 自发光颜色
Ni 折射率(玻璃的折射率为1.5)
illum 使用何种光照模型
d dissolve,不透明度,为1时完全不透明 Float 0~1
map_xxx xxx贴图

参考

Object Files

MTL material format

评论