zoukankan      html  css  js  c++  java
  • obj + mtl 格式说明

    OBJ(或 .OBJ)是一种开放的几何定义文件格式,最初由Wavefront Technologies公司开发,用以描述其Advanced Visualizer动画包。该格式已被其他3D图形应用供应商采纳,是一种被绝大多数普遍公认的格式。
    OBJ文件格式为简单数据格式,它仅表现3D几何体,即顶点的位置、以顶点列表方式定义每个多边形的顶点、法向量和面的UV坐标,以及纹理顶点。顶点默认以逆时针方向存储,不必显式声明法向。

    1. 文件格式
    注释行以#号起首
      # 这是注释
    一个OBJ文件包含几类定义: 
      # 顶点列表,用(x,y,z[,w])坐标表示,w为可选
      v 0.123 0.234 0.345 1.0
      v ...
      ...

      # 纹理坐标,用(u,v[,w])坐标表示,w为可选
      vt 0.500 -1.352 [0.234]
      vt ...
      ...

      # 法向量,用(x,y,z)的形式,法向量非单位向量
      vn 0.707 0.000 0.707
      vn ...
      ...

      # 面的定义详见下
      f 1 2 3
      f 3/1 4/2 5/3
      f 6/4/1 3/5/3 7/6/5
      f ...
      ...

    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 ...

    3. 引用材质
    用来描述多边形可视面貌的材质存储于外部.mtl文件中。.mtl文件可包含一至多个命名的材质。
      mtllib [外部 .mtl 文件名]
      ...
    命名的对象、多边形群组和材质群组通过以下标签指定:
      o [对象名]
      ...
      g [群组名]
      ...
      usemtl [材质名]
      ...
    材质名对应于外部.mtl文件中的已命名材质。每个标签应用于所有后续面,直到下一个同类型标签出现。如果当前材质定义中不包括纹理,则纹理坐标可以被忽略。
      f v1//vn1 v2//vn2 v3//vn3
      ...
    多边形之间的平滑描影由平滑群组控制。
      s 1
      ...
      # 平滑描影也可以取消。
      s off
      ...
    一个OBJ文件中可引用一个以上的外部MTL材质文件。

    4. 相对和绝对索引
    由于其列表结构,OBJ文件可以以绝对或相对列表位置引用顶点、法向等。绝对索引值以1为基准,相对索引值可以是负数。不过,不是所有的软件都支持后者,也有些软件在写格式时内置使用相对索引形式(由于这样便于在添加元素时不用重新计算顶点偏移等因素)。这些偶尔会造成不兼容。

    5. 材质模板库(MTL)
    在3D计算机图形学中,最为普遍的几何体交换文件格式之一就是OBJ,MTL文件则是其附属文件,用以描述几何体的表面描影属性。
    尽管MTL格式被广泛使用,它已经过时,无法完全支持最新技术,诸如镜面贴图和视差贴图。然而,由于格式的开放和直观,不足之处可用定制MTL文件生成器轻易补完。
    5.1 基础材质
    单独一个.mtl文件包含多个材质。材质在文件中逐个定义,每一条语句以newmtl起首。
      # 定义一个名为 'Colored'的材质
      newmtl Colored
    材质的阴影色(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'
    每个材质允许使用多照明模型。枚举如下:
    0. 色彩开,阴影色关
    1. 色彩开,阴影色开
    2. 高光开
    3. 反射开,光线追踪开
    4. 透明: 玻璃开 反射:光线追踪开
    5. 反射:菲涅尔衍射开,光线追踪开
    6. 透明:折射开 反射:菲涅尔衍射关,光线追踪开
    7. 透明:折射开 反射:菲涅尔衍射开,光线追踪开
    8. 反射开,光线追踪关
    9. 透明: 玻璃开 反射:光线追踪关
    10. 投射阴影于不可见表面
       illum 2
    5.2 纹理贴图
    带纹理材质使用如上相同的属性,并额外定义纹理贴图。
       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'标签

  • 相关阅读:
    Windows Php Apache Phpstorm VS Code
    cygwin学习
    Linux链表理解
    gcc和arm-linux-gcc默认头文件库搜索路径
    测试DOS命令
    字符二维数组char[][]与char**(转)
    浅谈 C++ 中的 new/delete 和 new[]/delete[] (转)
    Linux抢占式调度简介(转)
    USB中的端点详细了解(转)
    QT窗口组件的父子关系
  • 原文地址:https://www.cnblogs.com/daofaziran/p/11541522.html
Copyright © 2011-2022 走看看