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

# 纹理坐标,用(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 TexturedKa 1.000 1.000 1.000Kd 1.000 1.000 1.000Ks 0.000 0.000 0.000d 1.0illum 2map_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'标签

更多《计算机视觉与图形学》知识,可关注下方公众号:

OpenGL之obj + mtl 格式说明相关推荐

  1. obj + mtl 格式说明

    OBJ(或 .OBJ)是一种开放的几何定义文件格式,最初由Wavefront Technologies公司开发,用以描述其Advanced Visualizer动画包.该格式已被其他3D图形应用供应商 ...

  2. Threejs渲染obj+mtl模型源码,3D工厂模型

    1,介绍 Threejs实现引入工厂模型,加载obj+mtl模型源码下载,可用于学习研究,二次开发 2,部分代码 // 创建一个场景,它将包含我们所有的元素,如物体,相机和灯光. var scene ...

  3. Android OpenGLES2.0(十六)——3D模型贴图及光照处理(obj+mtl)

    转自:http://blog.csdn.net/junzia/article/details/58272305 在Android OpenGLES2.0(十四)--Obj格式3D模型加载中实现了Obj ...

  4. OPENGL读取OBJ模型(包围盒、法向等计算)附加源码与资源下载页面

    OPENGL读取OBJ模型 标签(空格分隔): OPENGL/C++ 哈哈,先贴出下载链接好吧.下载页面 首先大家不要害怕,读取obj模型听上去很高端很麻烦,其实当你真正了解obj模型的格式,以及OP ...

  5. 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★

    文章目录 一.导入 OpenGL 的两个头文件 二.链接 OpenGL 库 三.将 Windows 桌面窗口改成 OpenGL 窗口 四.获取窗口设备 五.设置像素格式描述符 六.设置像素格式 七.创 ...

  6. three.js 笔记 --- 渲染图片 和 渲染obj,mtl文件

    渲染图片 let textureLoader = new THREE.TextureLoader();let textureLoaderRes = function (url) {return tex ...

  7. THREEJS导入外部OBJ+MTL后内存优化

    背景 近期做一个关于石油化工的3D数字孪生项目,模型均为客户那边提供,模型文件是obj+mtl+jpg组合.因为有较多局部控制动画,所以建模被要求拆分成多个obj模型,然后在场景中自动组合使用. 现象 ...

  8. three.js 加载obj+mtl模型

    本文提供了three.js中 实现将obj+mtl模型加载到场景中 的方法. 我们欲实现将桥模型加载到场景中,并对桥设置透明度: 实现过程: 分别导入three.js中的OBJLoader,MTLLo ...

  9. IIS发布3D可视化.obj/.mtl文件找不到问题解决方案

    IIS发布3D可视化.obj/.mtl文件找不到问题解决方案 因为演示需要,我就在服务器上发布了一个3d模型,通过一个网页去展示,但是总出现个别文件找不到或者渲染不出来的问题,在服务器上打开文件的路劲 ...

最新文章

  1. python和anaconda的区别_anaconda和python区别
  2. 32位处理器的寄存器介绍
  3. Pytorch预训练模型下载并加载(以VGG为例)自定义路径
  4. todo在此放置对话框控件_MFC界面开发进入BCGControlBar v30.5时代,Gantt Chart控件升级...
  5. MySql-phpMyAdmin
  6. 不要在给自己不学习找借口了,否则…
  7. 网络中的那些事儿(五)之校园网规划综述
  8. 嵌入式单片机STM32元器件晶振选型参考
  9. 1 javascript视频教程 初识javascript
  10. java获取时间天数间隔
  11. Fluent Python读后感
  12. 罗丹明RB/四甲基罗丹明标记酰胺化果胶Amidated Pectin, Rhodamine B/TRITC labeled;Rhodamine B/TRITC-Amidated Pectin
  13. 尚硅谷 尚医通学习笔记
  14. 一些受益匪浅的句子,太哲理了
  15. ImageJ macro 批量vsi转tif
  16. 【华为_WLAN】AP4030DN 由 FIT AP 更新至 FAT AP(Uboot方式)
  17. 往后余生的计算机音乐,纯音乐《飞翔的梦》 往后余生,与你同行
  18. java中的push方法_Java ArrayDeque push()方法与示例
  19. 健身课Day03-单侧臀腿力量训练
  20. 上海宽泛计算机招聘,2022上海市公务员考试职位表

热门文章

  1. 数值计算之 插值法(1)多项式插值——拉格朗日插值法
  2. 双极结型晶体管——三极管理解
  3. 1286.字母组合迭代器
  4. 阿轩的复习笔记-主从库数据一致性
  5. 简要分析光猫是如何通过运营商实现上网的
  6. (JAVA练习)输入一个四位数,各个位的数字相加
  7. linux管理控制面板--可视化管理linux
  8. Unity中一些小技巧
  9. 证券公司信息化5-我国证券公司交易系统的演化过程和主要阶段是怎样的?什么是卫星报盘系统?
  10. 【机器学习】线性回归——最小二乘法的概率解释高斯噪声(理论+图解+公式推导)