一般带纹理的obj模型需要有以下三个文件,分别是.obj文件,.mtl纹理库文件,还有纹理贴图(这里是.jpg)如图所示:

用记事本或者其他工具打开查看.obj文件的内部结构如下图所示:
详细讲解下.obj文件结构
#代表文件的注释,用来描述具体的内容注释,当读到#时,可跳过该行。mtllib xxx.mtl代表obj文件中包含纹理库信息(如右图所示,纹理信息后面详细讲解)
v -8.6007 1.3993 10.0000
v (vertices) x y zvt 0.0000 1.0000 0.0000
vt (vertex texture) u v或者vt u v w 通常是0-1vn 0.0000 0.0000 -1.0000
vn (vertex normal) x y zf 1/1/1 2/2/1 3/3/1
v/vt/vn v/vt/vn v/vt/vn(顶点索引 / 纹理坐标索引 / 顶点法向量索引)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 ...
o:代表object,表示不同的对象名称
对象是由组构成,比如一个城镇是一个对象,它有许多房子,每个房子都被认为是一个组,而每个房子又包含了很多子组,比如窗户,们,墙,屋顶等。
g:代表group,顶点或者三角面片的集合名称
组是由一系列面构成,这些面使用同样的属性,比如同样的材质。
s:代表smooth
s 1
...
s 2
...
smooth shading还可以被关闭
s off
``
`
# 材质引用
一个材质库是一个伴随.obj文件的独立文件,它为每个组定义了材质。.obj文件常常会包含一个材质库文件,有时它还会包含多个材质库文件。
包含mtl文件
```cpp
mtllib xxx.mtl
...
使用mtl文件
usemtl xxx
...
#
# 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文件得到的模型如下所示:
