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 |
顶点数据
行开头 |
含义 |
格式 |
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 |
mtllib sphere.mtl
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