Wavefront .OBJ文件格式解读【3D】
OBJ(或 .OBJ)是一种几何定义文件格式,最初由 Wavefront Technologies 为其高级可视化器动画包开发。 该文件格式是开放的,已被其他 3D 图形应用程序供应商采用。
OBJ 文件格式是一种简单的数据格式,仅表示 3D 几何体,即每个顶点的位置、顶点UV坐标、顶点法线以及使每个多边形定义为顶点列表的面。 默认情况下,顶点按逆时针顺序存储,因此无需显式声明面法线。 OBJ 坐标没有单位,但 OBJ 文件可以在人类可读的注释行中包含比例信息。
推荐:用 NSDT设计器 快速搭建可编程3D场景。
1、OBJ文件结构概述
哈希字符 (#) 后面的任何内容都是注释。
# this is a comment
OBJ 文件可以包含顶点数据、自由形式的曲线/曲面属性、元素、自由形式的曲线/曲面体声明、自由形式曲面之间的连接性、分组和显示/渲染属性信息。 最常见的元素是几何顶点、纹理坐标、顶点法线和多边形面:
# List of geometric vertices, with (x, y, z, [w]) coordinates, w is optional and defaults to 1.0.
v 0.123 0.234 0.345 1.0
v ...
...
# List of texture coordinates, in (u, [v, w]) coordinates, these will vary between 0 and 1. v, w are optional and default to 0.
vt 0.500 1 [0]
vt ...
...
# List of vertex normals in (x,y,z) form; normals might not be unit vectors.
vn 0.707 0.000 0.707
vn ...
...
# Parameter space vertices in (u, [v, w]) form; free form geometry statement (see below)
vp 0.310000 3.210000 2.100000
vp ...
...
# Polygonal face element (see below)
f 1 2 3
f 3/1 4/2 5/3
f 6/4/1 3/5/3 7/6/5
f 7//1 8//2 9//3
f ...
...
# Line element (see below)
l 5 8 1 2 4 9
1.1 几何顶点
顶点(Vertex)通过以字母 v 开头的行指定。后面是 (x,y,z[,w]) 坐标。 W 是可选的,默认为 1.0。 右手坐标系用于指定坐标位置。 某些应用程序通过在 x y 和 z 之后放置红色、绿色和蓝色值来支持顶点颜色(这会排除指定 w)。 颜色值范围从 0 到 1。
1.2 参数空间顶点
可以在以字符串 vp 开头的行中指定自由格式的几何语句。 在曲线或曲面的参数空间中定义点。 曲线点只需要u,非有理裁剪曲线的曲面点和控制点需要u 和v,有理裁剪曲线的控制点需要u、v 和w(权重)。
1.3 面元素
面(Face)是使用顶点、纹理和法线索引列表定义的,格式为 vertex_index/texture_index/normal_index,每个索引从 1 开始,并根据引用元素的定义顺序递增。 诸如四边形之类的多边形可以使用三个以上的索引来定义。
OBJ 文件还支持使用曲线和曲面来定义对象的自由形式几何体,例如 NURBS 曲面。
1.4 顶点索引
有效的顶点索引(Vertex indices)与先前定义的顶点列表的相应顶点元素相匹配。 如果索引为正,则它引用该顶点列表中的偏移量,从 1 开始。如果索引为负,则它相对引用顶点列表的末尾,-1 引用最后一个元素。
每个面可以包含三个或更多顶点。
f v1 v2 v3 ....
1.5 顶点纹理坐标索引
可选地,纹理坐标索引(Vertex texture coordinate indices)可用于在定义面时指定纹理坐标。 要在定义面时将纹理坐标索引添加到顶点索引,必须在顶点索引后紧接着放置斜线,然后放置纹理坐标索引。 斜杠前后不允许有空格。 有效的纹理坐标索引从 1 开始,与先前定义的纹理坐标列表中的相应元素匹配。 每个面可以包含三个或更多元素。
f v1/vt1 v2/vt2 v3/vt3 ...
1.6 顶点法线索引
或者,在定义面时,可以使用法线索引(Vertex normal indices)来指定顶点的法线向量。 要在定义面时将法线索引添加到顶点索引,必须在纹理坐标索引后放置第二个斜杠,然后放置法线索引。 有效的法线索引从 1 开始,并与先前定义的法线列表中的相应元素匹配。 每个面可以包含三个或更多元素
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...
1.7 没有纹理坐标索引的顶点法线索引
由于纹理坐标是可选的,因此可以在没有纹理坐标的情况下定义几何体,但必须在放置法线索引之前在顶点索引后面放置两个斜杠。
f v1//vn1 v2//vn2 v3//vn3 ...
1.8 线元素
以字母“l”(小写 L)开头的记录指定构建多段线(Polyline)的顶点的顺序。
l v1 v2 v3 v4 v5 v6 ...
1.9 其他几何格式
Obj 文件使用几种不同类型的插值(例如泰勒和 B 样条)支持高阶曲面,尽管第三方文件读取器对这些功能的支持还远未普及。 Obj 文件也不支持网格层次结构或任何类型的动画或变形,例如顶点蒙皮或网格变形。
1.10 材质引用
描述多边形视觉方面的材质存储在外部 .mtl 文件中。 OBJ 文件中可以引用多个外部 MTL 材料文件。 .mtl 文件可能包含一个或多个命名材质的定义。
mtllib [external .mtl file name]
...
该标签指定其后面的元素的材质名称。 材质名称与外部 .mtl 文件中的命名材质定义匹配。
usemtl [material name]
...
命名对象和多边形组通过以下标签指定。
o [object name]...g [group name]...
通过平滑组可以实现跨多边形的平滑着色。
s 1...# Smooth shading can be disabled as well.s off...
1.11 相对索引和绝对索引
OBJ 文件由于其列表结构,能够通过绝对位置(1 表示第一个定义的顶点,N 表示第 N 个定义的顶点)或相对位置(-1 表示最后定义的顶点)来引用顶点、法线等。
然而,并非所有软件都支持后一种方式,相反有些软件本质上只编写后一种形式(由于附加元素方便,无需重新计算顶点偏移量等),导致偶尔出现不兼容的情况。
2、材质模板库
材质模板库格式 (MTL) 或 .MTL 文件格式是 .OBJ 的配套文件格式,也由 Wavefront Technologies 定义,它描述一个或多个 .OBJ 文件中对象的表面着色(材质)属性。
.OBJ 文件引用一个或多个 .MTL 文件(称为“材质库”),并从那里按名称引用一个或多个材质描述。 .MTL 文件是 ASCII 文本,它根据 Phong 反射模型定义表面的光反射属性,以供计算机渲染之用。 该标准在不同的计算机软件包之间得到了广泛的支持,使其成为材料交换的有用格式。
MTL 格式虽然仍然广泛使用,但已经过时,并且不完全支持高光贴图和视差贴图等后来的技术。 然而,由于该格式的开放性和直观性,可以使用自定义 MTL 文件生成器轻松添加这些内容。
MTL 格式定义了多种格式。
2.1 基础材质
单个 .mtl 文件可以定义多种材质。 材质在文件中被逐个定义,每个材质都以 newmtl 命令开始:
# define a material named 'Colored'
newmtl Colored
材质的环境色(ambient)使用 Ka 声明。 颜色定义采用 RGB 格式,其中每个通道的值介于 0 和 1 之间。
# white
Ka 1.000 1.000 1.000
类似地,漫反射色(diffuse)是使用 Kd 声明的。
# white
Kd 1.000 1.000 1.000
镜面反射色(specular)使用 Ks 声明,并使用镜面指数 Ns 进行加权。
# black (off)
Ks 0.000 0.000 0.000# ranges between 0 and 1000
Ns 10.000
材质可以是透明的。 这称为 消融(dissolved)。 与真正的透明度不同,结果不取决于物体的厚度。 “d”的值为 1.0 是默认值,表示完全不透明,“Tr”的值为 0.0 也是如此。 消融适用于所有照明模型。
# some implementations use 'd'
d 0.9
# others use 'Tr' (inverted: Tr = 1 - d)
Tr 0.1
透明材料还可以具有透射滤光片颜色,用“Tf”指定。
# Transmission Filter Color (using R G B)
Tf 1.0 0.5 0.5
# Transmission Filter Color (using CIEXYZ) - y and z values are optional and assumed to be equal to x if omitted
Tf xyz 1.0 0.5 0.5
# Transmission Filter Color from spectral curve file (not commonly used)
Tf spectral <filename>.rfl <optional factor>
材质的表面也可以具有光密度(optical density), 这也称为折射率(index of refraction)。
# optical density
Ni 1.45000
值的范围可以从 0.001 到 10。值 1.0 表示光线在穿过对象时不会弯曲。 增加光密度会增加弯曲量。 玻璃的折射率约为1.5。 小于 1.0 的值会产生奇怪的结果,不推荐使用。
每种材质都有多种照明模型可用。 请注意,不需要设置透明照明模型来实现“d”或“Tr”的透明度,并且在现代使用中,即使使用透明材质,通常也不会指定照明模型。 照明模型列举如下:
0. Color on and Ambient off
1. Color on and Ambient on
2. Highlight on
3. Reflection on and Ray trace on
4. Transparency: Glass on, Reflection: Ray trace on
5. Reflection: Fresnel on and Ray trace on
6. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
7. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on
8. Reflection on and Ray trace off
9. Transparency: Glass on, Reflection: Ray trace off
10. Casts shadows onto invisible surfaces
2.2 纹理贴图
纹理材质(Texture material)使用与上面相同的属性,并另外定义纹理贴图。 以下是常见材质文件的示例。 有关更多详细信息,请参阅完整的 Wavefront 文件格式参考。
newmtl TexturedKa 1.000 1.000 1.000Kd 1.000 1.000 1.000Ks 0.000 0.000 0.000d 1.0illum 2# the ambient texture mapmap_Ka lemur.tga# the diffuse texture map (most of the time, it will be the same as the# ambient texture map)map_Kd lemur.tga# specular color texture mapmap_Ks lemur.tga# specular highlight componentmap_Ns lemur_spec.tga# the alpha texture mapmap_d lemur_alpha.tga# some implementations use 'map_bump' instead of 'bump' belowmap_bump lemur_bump.tga# bump map (which by default uses luminance channel of the image)bump lemur_bump.tga# displacement mapdisp lemur_disp.tga# stencil decal texture (defaults to 'matte' channel of the image)decal lemur_stencil.tga
纹理贴图语句也可能有选项参数(参见完整规范)
# texture origin (1,1,1) map_Ka -o 1 1 1 ambient.tga# spherical reflection maprefl -type sphere clouds.tga
2.3 纹理选项
-blendu on | off # set horizontal texture blending (default on)
-blendv on | off # set vertical texture blending (default on)
-boost float_value # boost mip-map sharpness
-mm base_value gain_value # modify texture map values (default 0 1)# base_value = brightness, gain_value = contrast
-o u [v [w]] # Origin offset (default 0 0 0)
-s u [v [w]] # Scale (default 1 1 1)
-t u [v [w]] # Turbulence (default 0 0 0)
-texres resolution # texture resolution to create
-clamp on | off # only render texels in the clamped 0-1 range (default off)# When unclamped, textures are repeated across a surface,# when clamped, only texels which fall within the 0-1# range are rendered.
-bm mult_value # bump multiplier (for bump maps only)-imfchan r | g | b | m | l | z # specifies which channel of the file is used to # create a scalar or bump texture. r:red, g:green,# b:blue, m:matte, l:luminance, z:z-depth.. # (the default for bump is 'l' and for decal is 'm')
例如,
# says to use the red channel of bumpmap.tga as the bumpmap
bump -imfchan r bumpmap.tga
对于反射贴图…
-type sphere # specifies a sphere for a "refl" reflection map
-type cube_top | cube_bottom | # when using a cube map, the texture file for eachcube_front | cube_back | # side of the cube is specified separatelycube_left | cube_right
2.4 供应商特定变更
由于解析文件的容易性以及文件格式的非官方传播,文件可能包含供应商特定的更改。
根据规范,选项应该位于纹理文件名之前。 但是,至少有一个供应商会生成末尾带有选项的文件。
# bump multiplier of 0.2
bump texbump.tga -bm 0.2
2.5 基于物理的渲染
在线 3D 编辑和建模工具 Clara.io 的创建者建议扩展 MTL 格式,以指定基于物理的渲染 (PBR) 贴图和参数。 此扩展随后被 Blender 和 TinyObjLoader 采用。 扩展 PBR 映射和参数为:
Pr/map_Pr # roughness
Pm/map_Pm # metallic
Ps/map_Ps # sheen
Pc # clearcoat thickness
Pcr # clearcoat roughness
Ke/map_Ke # emissive
aniso # anisotropy
anisor # anisotropy rotation
norm # normal map (RGB components represent XYZ components of the surface normal)
进一步提议的扩展来自 Microsoft DirectX 引擎的 DirectXMesh 工具包,允许定义模型的预编译 RMA 材质。
map_RMA # RMA material (roughness, metalness, ambient occlusion)
map_ORM # alternate definition of map_RMA
原文链接:Wavefront .OBJ格式说明 — BimAnt
相关文章:

Wavefront .OBJ文件格式解读【3D】
OBJ(或 .OBJ)是一种几何定义文件格式,最初由 Wavefront Technologies 为其高级可视化器动画包开发。 该文件格式是开放的,已被其他 3D 图形应用程序供应商采用。 OBJ 文件格式是一种简单的数据格式,仅表示 3D 几何体&…...

JavaScript:ES6中类与继承
在JavaScript编程中,ES6引入了一种更现代、更清晰的方式来定义对象和实现继承,那就是通过类和继承机制。本文将以通俗易懂的方式解释ES6中类与继承的概念,帮助你更好地理解和应用这些特性。 1. 类的创建与使用 类是一种模板,用于…...

通用指令(汇编)
一、数据处理指令1)数学运算数据运算指令的格式数据搬移指令立即数伪指令加法指令带进位的加法指令减法指令带借位的减法指令逆向减法指令乘法指令数据运算指令的扩展 2)逻辑运算按位与指令按位或指令按位异或指令左移指令右移指令位清零指令 3ÿ…...

苏宁数据治理实战方法论和三字经
随着移动互联网和大数据的蓬勃发展,“数据即资产”的理念深入人心。大数据已发展成为具有战略意义的生产资料,在各行各业发挥着极其重要的作用,而大数据也给很多企业带来了前所未有的自豪感和自信感。 但是,大数据真的是越“大”越…...

创建型设计模式:3、单例模式(C++实现实例 线程安全)
目录 1、单例模式(Singleton Pattern)的含义 2、单例模式的优缺点 (1)优点: (2)缺点: 3、C实现单例模式的示例(简单) 4、C实现单例模式的示例ÿ…...

JavaWeb学习笔记
Maven:自动导入配置jar包。 Maven项目架构管理工具:核心思想:约定大于配置 Maven:环境优化 1.修改web.xml为最新的 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee&…...

ad+硬件每日学习十个知识点(24)23.8.4(时序约束,SignalTap Ⅱ)
文章目录 1.建立时间和保持时间2.为什么要建立时序约束?3.SignalTap Ⅱ4.SignalTap Ⅱ使用方法5.HDL的仿真软件(modelsim)6.阻抗匹配 1.建立时间和保持时间 答: 2.为什么要建立时序约束? 答: 3.Sign…...

FortiGate防火墙日志审计运维
环境介绍 CPU:8核,内存:16GB,硬盘:100GB 操作系统版本:CentOS-7-x86_64-DVD-2003 平台版本:鸿鹄2.7.0 安装组件 安装环境支持确认 鸿鹄计算引擎使用了 AVX2 高级指令集做向量计算加速…...

基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战
项目实验结果展示: 基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战——项目可以私聊 该项目可以作为毕业设计,以及企业级的项目开发,主要包含了车辆的目标检测、目标跟踪以及车辆的速度计算,同样可以进行二次开发。 …...

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式
近日,以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛,并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…...

MyBatis-动态SQL-foreach
目录 标签有以下常用属性: 小结 <froeach> <foreach>标签有以下常用属性: collection:指定要迭代的集合或数组的参数名(遍历的对象)。item:指定在迭代过程中的每个元素的别名(遍历…...

VUE框架:vue2转vue3全面细节总结(3)路由组件传参
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人_python人工智能视觉(opencv)从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了: https://blog.csdn.net/lbcy…...

音视频技术开发周刊 | 305
每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 大神回归学界:何恺明宣布加入 MIT 「作为一位 FAIR 研究科学家,我将于 2024 年加入麻省理工学院(MIT)电气工程与计算机科学…...

vue 图片base64转化
import html2canvas from ‘html2canvas’ html2canvas(canvasDom, options).then(canvas > { //此时的图片是base64格式的,我们将图片格式转换一下 let type ‘png’; let imgData canvas.toDataURL(type); // 照片格式处理 let _fixType function(type) { …...

TS学习03-类
类 calss A {name: stringconstructor(name:string) {this.name name}greet() {return hello, this.name} } let people new A(RenNing)继承 子类是一个派生类,他派生自父类(基类),通过 extends关键字 派生类通常被称作 子类…...

FastAPI(七)应用配置
目录 一、在apps下新建文件夹config 二、新建配置文件app_conf.py 一、在apps下新建文件夹config 二、新建配置文件app_conf.py from functools import lru_cachefrom pydantic.v1 import BaseSettingsclass AppConfig(BaseSettings):app_name: str "Windows10 插件&qu…...

eclipse Java Code_Style Code_Templates
Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程,不然有时候不生效,旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了...

01《Detecting Software Attacks on Embedded IoT Devices》随笔
2023.08.05 今天读的是一篇博士论文 论文传送门:Detecting Software Attacks on Embedded IoT Devices 看了很长时间,发现有一百多页,没看完,没看到怎么实现的。 摘要 联网设备的增加使得嵌入式设备成为各种网络攻击的诱人目标&…...

APP外包开发的学习流程
学习iOS App的开发是一项有趣和富有挑战性的任务,是一个不断学习和不断进步的过程。掌握基础知识后,不断实践和尝试新的项目将使您的技能不断提升。下面和大家分享一些建议,可以帮助您开始学习iOS App的开发。北京木奇移动技术有限公司&#…...

第0章 环境搭建汇总
mini商城第0章 环境搭建汇总 本文是整个mini商城的前置文档,所有用到的技术安装都在本篇文档中有详细描述。所有软件安装不分先后顺序,只是作为一个参考文档,需要用到什么技术软件,就按照文档安装什么软件,切不可一上来全部安装一遍。 文章中有些截图中服务器地址是192.16…...

大数据培训课程-《机器学习从入门到精通》上新啦
《机器学习从入门到精通》课程是一门专业课程,面向人工智能技术服务,课程系统地介绍了Python编程库、分类、回归、无监督学习和模型使用技巧以及算法和案例充分融合。 《机器学习从入门到精通》课程亮点: 课程以任务为导向,逐步学…...
暗黑版GPT流窜暗网 降低犯罪门槛
随着AIGC应用的普及,不法分子利用AI技术犯罪的手段越来越高明,欺骗、敲诈、勒索也开始与人工智能沾边。 近期,专为网络犯罪设计的“暗黑版GPT”持续浮出水面,它们不仅没有任何道德界限,更没有使用门槛,没有…...

数电与Verilog基础知识之同步和异步、同步复位与异步复位
同步和异步是两种不同的处理方式,它们的区别主要在于是否需要等待结果。同步是指一个任务在执行过程中,必须等待上一个任务完成后才能继续执行下一个任务;异步是指一个任务在执行过程中,不需要等待上一个任务完成,可以…...

JAVA Android 正则表达式
正则表达式 正则表达式是对字符串执行模式匹配的技术。 正则表达式匹配流程 private void RegTheory() {// 正则表达式String content "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2) &qu…...

【MFC】07.MFC第三大机制:消息映射-笔记
本专栏上两篇文章分别介绍了【MFC】05.MFC第一大机制:程序启动机制和【MFC】06.MFC第二大机制:窗口创建机制,这篇文章来为大家介绍MFC的第三大机制:消息映射 typfd要实现消息映射,必须满足的三个条件: 类必…...

【jvm】jvm的生命周期
目录 一、启动二、执行三、退出 一、启动 1.java虚拟机的启动是通过引导类加载器bootstrap class loader创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的(根据具体虚拟机的类型) 二、执行 1.一个运行中的java虚拟机…...

激光雷达测距和摄像头联合棋盘格反射率标定板
目前,激光雷达不仅在军事上起到了重要的作用,而且发挥其测程大、精度高、反应速度快、可靠性高等优点,在商业领域应用越来越广,发展越来越迅速,具有较高的实用价值和商业价值。车载三维成像激光雷达采用脉冲式测量原理…...

【Docker】docker镜像+nginx部署vue项目:
文章目录 一、文档:二、打包vue项目:三、配置nginx:四、配置Dockerfile:五、构建镜像:六、运行容器:七、最终效果: 一、文档: 【1】菜鸟教程:https://www.runoob.com/do…...

文件编辑(vi/vim)
在所有的命令执行前,先按Esc 1、vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式…...

1007 Maximum Subsequence Sum (PAT甲级)
惭愧,知道该用DP做,但是又翻了参考书才想起来。dp[i]表示以i项为结尾的最大子列。 #include <cstdio> #include <vector>int K, maxx, u, pu, pv; std::vector<int> vec, dp;int main(){scanf("%d", &K);vec.resize(K)…...