obj模型的格式
obj模型的格式
- 带纹理的obj模型
- mtl材质文件
带纹理的obj模型
一般带纹理的obj模型需要有以下三个文件,分别是.obj
文件,.mtl
纹理库文件,还有纹理贴图(这里是.jpg
)如图所示:
用记事本或者其他工具打开查看.obj
文件的内部结构如下图所示:
详细讲解下.obj
文件结构
#
代表文件的注释,用来描述具体的内容注释,当读到#时,可跳过该行。mtllib xxx.mtl
代表obj文件中包含纹理库信息(如右图所示,纹理信息后面详细讲解)
v -8.6007 1.3993 10.0000
- 格式:
v (vertices) x y z
意义:每个顶点的坐标
vt 0.0000 1.0000 0.0000
- 格式:
vt (vertex texture) u v
或者vt u v w
通常是0-1
意义:纹理坐标
vn 0.0000 0.0000 -1.0000
- 格式:
vn (vertex normal) x y z
意义:顶点法矢方向
f 1/1/1 2/2/1 3/3/1
- 格式 :f
v/vt/vn v/vt/vn v/vt/vn
(顶点索引 / 纹理坐标索引 / 顶点法向量索引
)
意义:构成的面
注意:其中面的构成可以只由:v、v/vt、v//vn(两斜杠)、v/vt/vn等情况构成,且顶点的个数也不一定要为3个,可以大于等于3如下所示:表示为5边形的面结构
f 1 2 3 4 5
仅包含顶点f v1 v2 v3 ....
包含顶点和纹理f v1/vt1 v2/vt2 v3/vt3 ...
包含顶点纹理和法线f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...
包括顶点和法线f v1//vn1 v2//vn2 v3//vn3 ...
- Group声明用于组织模型的单元(element)以及简化数据操作
o:代表object,表示不同的对象名称
对象是由组构成,比如一个城镇是一个对象,它有许多房子,每个房子都被认为是一个组,而每个房子又包含了很多子组,比如窗户,们,墙,屋顶等。
g:代表group,顶点或者三角面片的集合名称
组是由一系列面构成,这些面使用同样的属性,比如同样的材质。
s:代表smooth
s 1
...
s 2
...
smooth shading还可以被关闭
s off
``
`
# 材质引用
一个材质库是一个伴随.obj文件的独立文件,它为每个组定义了材质。.obj文件常常会包含一个材质库文件,有时它还会包含多个材质库文件。
包含mtl文件
```cpp
mtllib xxx.mtl
...
使用mtl文件
usemtl xxx
...
mtl材质文件
#
# Wavefront material file
# Converted by the DEEP Exploration 2.1.12.1218
# Right Hemisphere, LTD
# http://www.righthemisphere.com/
#
//定义材质以newmtl开头
newmtl inside //newmtl之后的都是材质的定义,它的范围是直到另一个新的newmtl出现,或该文件的结束才停止。
Ka 0.4 0.4 0.4//Ka - 环境光
Kd 0.587609 0.587609 0.587609//Kd-漫反射颜色
Ks 0.071744 0.071744 0.071744//Ks-镜面颜色
illum //1illum-光照模型
Ns 32
newmtl outside
Ka 0 0 0
Kd 1 1 1
Ks 0.384296 0.194061 0.174387
illum 2
//每个材质允许使用多照明模型。枚举如下:
//0. 色彩开,阴影色关
//1. 色彩开,阴影色开
//2. 高光开
//3. 反射开,光线追踪开
//4. 透明: 玻璃开 反射:光线追踪开
//5. 反射:菲涅尔衍射开,光线追踪开
//6. 透明:折射开 反射:菲涅尔衍射关,光线追踪开
//7. 透明:折射开 反射:菲涅尔衍射开,光线追踪开
//8. 反射开,光线追踪关
//9. 透明: 玻璃开 反射:光线追踪关
//10. 投射阴影于不可见表面
Ns 64//指定材质的反射指数,定义了反射高光度。64是反射指数值,该值越高则高光越密集,一般取值范围在0~1000。
//map_Ka - 环境光贴图
map_Kd cup.jpg//map-Kd - 漫反射颜色贴图
//map_Ks - 镜面颜色贴图
设置完成后打开obj文件得到的模型如下所示: