obj + mtl

一、OBJ文件

OBJ文件格式为简单数据格式,它仅表现3D几何体,即顶点的位置、以顶点列表方式定义每个多边形的顶点法向量面的UV坐标,以及纹理顶点

顶点默认以逆时针方向存储,不必显式声明法向。

1. 文件格式

  •   # 顶点列表,用(x,y,z[,w])坐标表示                           v 0.123 0.234 0.345 1.0
  •   # 纹理坐标,用(u,v[,w])坐标表示                            vt 0.500 -1.352 [0.234]
  •   # 法向量,用(x,y,z)的形式,法向量非单位向量      vn 0.707 0.000 0.707
  •   #                                                                                 f 1 2 3
  •                                                                                         f 3/1 4/2 5/3
  •                                                                                         f 6/4/1 3/5/3 7/6/5

2. 面的定义

面通过顶点列表、纹理及法向的索引来定义。定义多边形时可超过三张顶点/纹理/法向索引。OBJ文件也支持自由曲面,如NURB(非均匀有理B样条)。
有多种方式定义一个面,然而每行面定义语句都以f起首

  • 2.1 顶点
  • 合法的顶点索引从1开始,对应于预先定义的顶点列表中相应的顶点元素。每个面可以包含三个以上元素。
  • f v1 v2 v3 v4
  • 2.2 顶点/纹理坐标
  • 可选地,纹理坐标索引可以用来指定面的纹理坐标。在定义一个面时,如需为顶点索引添加纹理坐标索引,须在顶点索引之后附上纹理坐标索引,并用/号分隔。
  • 注意/号之前或之后都不允许有空格。合法的纹理坐标索引从1开始,对应于预先定义的纹理坐标列表中相应的元素。每个面可以包含三个以上元素。
  • f v1/vt1 v2/vt2 v3/vt3
  • 2.3 顶点/纹理坐标/法向
  • 可选地,法向索引可以用来指定顶点的法向量。在定义一个面时,如需为顶点索引添加法向索引,须在纹理坐标索引之后附上法向索引,并用/号分隔。
  • 合法的法向索引从1开始,对应于预先定义的法向列表中相应的元素。每个面可以包含三个以上的元素。
  • f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3
  • 2.4 顶点/法向
  • 由于纹理坐标是可选的,在定义几何体时可以忽略,但在索引中不能少,所以顶点索引之后须画两道/,即//,再写上法向索引。
  • f v1//vn1 v2//vn2 v3//vn3
mtllib patrick.mtl

# 610 Vertices
v 0.043767 0.212379 0.006323  
v 0.054958 0.165363 0.004953
v 0.076992 0.163141 0.127957
v 0.064977 0.211497 0.150498
v 0.125207 0.162172 0.206775
...//忽略

# 3492 Texture Coordinates
vt 0.4431 0.9599
vt 0.4707 0.9791
vt 0.4898 0.9444
vt 0.4431 0.9599
vt 0.4898 0.9444
vt 0.4699 0.9187
vt 0.4699 0.9187
vt 0.4898 0.9444
vt 0.5087 0.9197
...//忽略

# 3492 Vertex Normals
vn -0.696479 -0.717388 -0.016476
vn -0.751117 -0.660094 0.009993
vn -0.589625 -0.789677 0.169566
vn -0.616143 -0.787612 -0.00589
vn -0.589625 -0.789677 0.169566
vn -0.764593 -0.557964 0.322604
vn -0.764593 -0.557964 0.322604
vn -0.589625 -0.789677 0.169566
...//忽略

# body2, 1164 grouped triangles

usemtl pat
o body2
g body2

f 1/1/1 2/2/2 3/3/3
f 1/4/4 3/5/5 4/6/6
f 4/7/7 3/8/8 5/9/9
f 4/10/10 5/11/11 6/12/12
f 6/13/13 5/14/14 7/15/15
...

二、MTL文件

MTL文件一般包括一个或多个材质的定义,每个材质定义都包含颜色(color)纹理(texture)反射贴图(reflection map)

它们被用于描述几何体的表面和顶点的纹理。Material文件内容以ASCII格式存储,.mtl文件可包含一至多个命名的材质。

obj文件中指定外部.mtl文件: mtllib 文件名.mtl

  • 材质的阴影色(ambient color)用Ka声明。颜色用RGB定义,每条通道的值从0到1之间取。
       Ka 1.000 1.000 1.000   # 白色
  • 材质的固有色(diffuse color)用Kd。
       Kd 1.000 1.000 1.000   # 白色
  • 材质的高光色(specular color)用Ks。带权高光色则用高光系数Ns表示。
       Ks 0.000 0.000 0.000  # 黑色(即关闭高光)
       Ns 10.000                      # 范围从0到1000
  • 材质可以是透明的,即是说“溶解的”。与真透明度不同,其结果并不依赖于物体厚度。
       d 0.9   # 有些用'd'实现
       Tr 0.9  # 其他的用'Tr'
  • 反光度:为了模拟更真实的效果,还会有一个镜面高光的反光度参数(Shininess),描述了镜面高光的强度,反光度越大表示镜面高光越亮。所以我们可以认为材质由环境光照、漫反射光照、镜面光照和反光度共同定义和描述。反光度取值范围为0-1000。  d 0.9   # 有些用'd'实现
       Ns 96.078443
  • 光照模型:illum  对应的取值范围
       0:恒色照明模型,最终颜色取值为Kd值,color = Kd。
       1:漫反射照明模型,最终颜色由环境颜光照和漫反射光照决定,并且受多个光源影响。
       2:漫反射和镜面光照结合模型,最终颜色由环境光照、漫反射光照和镜面光照共同决定。
       illum 2

纹理贴图:带纹理材质使用如上相同的属性,并额外定义纹理贴图。  

# 例1(一个材质):
newmtl Textured
   Ka 1.000 1.000 1.000
   Kd 1.000 1.000 1.000
   Ks 0.000 0.000 0.000
   d 1.0
   illum 2
   map_Ka lenna.tga        # 阴影色纹理贴图
   map_Kd lenna.tga        # 固有色纹理贴图 (多数情况下与其阴影色纹理贴图相同)
   map_Ks lenna.tga        # 高光色纹理贴图
   map_d lenna_alpha.tga   # alpha通道纹理贴图
   map_bump lenna_bump.tga # 凹凸贴图
   bump lenna_bump.tga     # 也有用'bump'而非'map_Bump'标签
# 例2(多个材质):
newmtl patty
    Ns 0
    d 1
    illum 2
    Kd 0.8 0.8 0.8
    Ks 0.0 0.0 0.0
    Ka 0.2 0.2 0.2
    map_Kd Patty_Wagon.png

newmtl pat
    Ns 0
    d 1
    illum 2
    Kd 0.8 0.8 0.8
    Ks 0.0 0.0 0.0
    Ka 0.2 0.2 0.2
    map_Kd Char_Patrick.png

newmtl sb
    Ns 0
    d 1
    illum 2
    Kd 0.8 0.8 0.8
    Ks 0.0 0.0 0.0
    Ka 0.2 0.2 0.2
    map_Kd Spongebob_SquarePants.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值