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'标签

obj + mtl 格式说明的更多相关文章

  1. 关于OBJ/LIB格式,我以前有个总结

    1.VC,GCC obj,lib格式为coff 可相互通用2.vc,gcc的obj,lib可通过coff2omfn转成OMF格式,但VC在编译时要加/Zl选项3.VC,GCC的typelib可通过co ...

  2. DirectX11 With Windows SDK--19 模型加载:obj格式的读取及使用二进制文件提升读取效率

    前言 一个模型通常是由三个部分组成:网格.纹理.材质.在一开始的时候,我们是通过Geometry类来生成简单几何体的网格.但现在我们需要寻找合适的方式去表述一个复杂的网格,而且包含网格的文件类型多种多 ...

  3. webgl图库研究(包括BabylonJS、Threejs、LayaboxJS、SceneJS、ThingJS等框架的特性、适用范围、支持格式、优缺点、相关网址)

    3D图库框架范围与示例 摘要: 为实现企业80%以上的生产数据进行智能转化,在烟草.造纸.能源.电力.机床.化肥等行业,赢得领袖企业青睐,助力企业构建AI赋能中心,实现智能化转型升级.“远舢文龙数据处 ...

  4. three.js obj转js的详细步骤 convert_obj_three.py的用法

    three.js是最近非常流行的一个前端webgl库. js格式的模型文件是three.js中可以直接加载的文件.使用THREE.JSONLoader()直接加载,而不需要引用其它的loader插件. ...

  5. jt格式文件与网格压缩

    jt格式文件与网格压缩 介绍 jt是一种3D数据格式,主要用于工业,产品可视化,数据交换,并且西门子在2012推动jt成为ISO国际标准.在文件尺寸方面,采用了不少专门的压缩方法,比较轻量化. jt文 ...

  6. java中String.valueOf(obj)、(String)obj与obj.toString()有什么区别

    方法1:采用 Object.toString()方法 在这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以对任何严格意义上的java对象都可以调用 ...

  7. jt格式文件与3D数据压缩

    介绍 JT是西门子公司推出的PLM通用三维格式,设计为一个开放.高效率的.紧凑,持久性存储的产品数据格式,用于产品可视化.协作和CAD数据共享.JT文件格式包括多方面的数据,以及对曲面边的精准表示,产 ...

  8. 3D打印格式STL

    STL格式及其转换 近期接触了3D打印的一些东西,也制作了一个vrml转stl的插件,对该领域多了一些认识. 目前尚没有打印机直接支持stl.obj等格式,在打印之前需使用厂家提供的软件将stl等格式 ...

  9. 数据交换格式之 - Json

    Json简介: JSON是JavaScript对象表示法,是一种与语言无关的数据交换的格式,是一种完全独立于语言的文本格式. 使用ajax进行前后台数据交换,移动端与服务端的数据交换. web客户端和 ...

随机推荐

  1. matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象

    一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...

  2. BDC里的 BDC_OKCODE

      BDC OKCODE其实都是function code,对于处理一些BDC问题 非常有用,   列出一些知道的 OKCODE BDC_OKCODE 功能描述 =/00.  Enter = /8   ...

  3. C#对泛型实例化对像的方法

    最近在搞一个小东东,用到了泛型的处理,用到了对泛型的实例化问题.下面来讲讲对泛型的实例化,以代码为例,如: public class A { } public class B<T> { p ...

  4. JS 各种引擎介绍

    JS 各种引擎介绍 http://www.oschina.net/project/tag/296/javascript-engine 不同浏览器有不同的JS引擎: WebKit , Safari浏览器 ...

  5. ou can mix require and export. You can't mix import and module.exports.

    ou can mix require and export. You can't mix import and module.exports.

  6. POJ1191 棋盘分割

    Time Limit: 1000MS Memory Limit: 10000K Total Submissions: Accepted: 题目链接: http://poj.org/problem?id ...

  7. (idea maven)mybatis-generator步骤

    1.新建一个maven项目,选择maven-archetype-webapp 点击next 2.项目名称,点击next 3.选择项目存放路径,然后点击finish 4.在main包下 添加包java和 ...

  8. Java开发笔记(一百二十三)AWT图像视图

    前面介绍了AWT的几种基础控件,从按钮到文本标签,从输入框到选择框,无一例外都能显示文字,唯独无法显示某张图片文件.本以为AWT会提供专门的控件来显示图片,然而偏偏没有意料之中的图像控件,这可真是弱爆 ...

  9. 转发:for /f命令之—Delims和Tokens用法&总结

    在For命令语踞饽参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总拮.“For /f”常用来解析文本,读取字符串.分工上,delims负责切分字符串,而tokens ...

  10. 前端 html篇

    web开发本质: html是一个标准,规定了大家怎么写网页 1.浏览器输入网址回车发生了什么事 1. 浏览器 给服务端 发送了一个消息2. 服务端拿到消息3. 服务端返回消息4. 浏览器展示页面 se ...