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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/81222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法你有多牛逼-下

1.简介 Fiddler是一款强大的HTTP抓包工具&#xff0c;它能记录所有客户端和服务器的http和https请求&#xff0c;允许你监视&#xff0c;设置断点&#xff0c;甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说&#xff0c;都有很大的帮助。Fiddler提供的功能基本上能…

SpringMVC的架构有什么优势?——表单和数据校验(四)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

51单片机学习--DS18B20温度读取温度报警器

需要先编写OneWire模块&#xff0c;再在DS18B20模块中调用OneWire模块的函数 先根据原理图做好端口的声明&#xff1a; sbit OneWire_DQ P3^7;接下来像之前一样把时序结构用代码模拟出来&#xff1a; unsigned char OneWire_Init(void) {unsigned char i;unsigned char Ac…

JVM之类加载与字节码(一)

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […

ChatGPT发展到了什么程度?代码生成,程序员将被取代?

前言 ChatGPT 是一个基于人工智能的聊天机器人&#xff0c;由 OpenAI 开发。ChatGPT 的历史可以追溯到早期的语言模型&#xff0c;例如循环神经网络 (RNN) 和长短时记忆网络 (LSTM)。如今的 ChatGPT-3 则是最新的版本。 ChatGPT发展到了什么程度&#xff1f;代码生成&#xff0…

自动化处理,web自动化测试处理多窗口+切换iframe框架页总结(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 web 自动化之处理…

【高级程序设计语言C++】红黑树

1. 红黑树的概念2. 红黑树的插入2.1. 情况12.2. 情况22.3. 情况32.4. 插入情况小总结 3. 红黑树与AVL树的对比4. 红黑树在线生成网站 1. 红黑树的概念 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;它在插入和删除操作时通过调整节点的颜…

Scrum是什么意思,Scrum敏捷项目管理工具有哪些?

一、什么是Scrum&#xff1f; Scrum是一种敏捷项目管理方法&#xff0c;旨在帮助团队高效地开展软件开发和项目管理工作。 Scrum强调迭代和增量开发&#xff0c;通过将项目分解为多个短期的开发周期&#xff08;称为Sprint&#xff09;&#xff0c;团队可以更好地应对需求变…

FFmpeg常见命令行(二):FFmpeg转封装

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…

HttpRunner自动化测试之脚手架工具使用(一键搭建)

脚手架工具使用&#xff1a; 每一个成熟的系统工具&#xff0c;都会有对应的脚手架工具&#xff0c;它可以快速构建项目的必要目录&#xff0c;不必自己一个一个的配置与搭建&#xff0c;只需要执行一些命令即可。 httprunner也提供了脚手架工具&#xff0c;使用步骤如下&…

通过Idea部署Tomcat服务器(详细图文教学)

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

Excel表格(一)

1.单一栏的宽度和高度设置 2.大标题的跨栏居中 3.让单元格内的文字------自动适应 4.序号递增 5.货币符号 6.日期格式的选择 选到单元格&#xff0c;选中对应的日期格式 7.自动求和的计算 然后在按住回车键即可求出当前行的金额 点击自动求和 8.冻结表格栏 9.排序 1.单栏排序 …

【redis】SpringBoot集成redis

目录 1.添加redis依赖2.配置redis3.操作redis3.1 操作string 3.1 操作其它数据类型 4. Spring-Session基于Redis解决共享Session问题4.1 问题提出 4.1 添加依赖 4.2 修改配置4.3 存储和读取 1.添加redis依赖 方法①&#xff1a; <dependency><groupId>org.springf…

WordPress 子主题(child theme)介绍

经常开发WordPress主题的朋友往往会遇到一个困惑&#xff0c;虽然主题提供了默认设置&#xff0c;也自带了不少自定义功能&#xff0c;可以满足大部分的场景使用&#xff0c;但毕竟众口难调&#xff0c;一些个性化的需求难免无法满足&#xff0c;这时就必须得修改主题文件来实现…

【动态规划刷题 5】 最小路径和地下城游戏

最小路径和 链接: 64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输…

使用 PowerShell 将 Excel 中的每个工作表单独另存为独立的文件

导语&#xff1a;在日常工作中&#xff0c;我们经常需要处理 Excel 文件。本文介绍了如何使用 PowerShell 脚本将一个 Excel 文件中的每个工作表单独另存为独立的 Excel 文件&#xff0c;以提高工作效率。 1. 准备工作 在开始之前&#xff0c;请确保已经安装了 Microsoft Exc…

Cocos基本介绍

一、下载Dashboard Cocos Creator 3.8 手册 - 安装和启动 二、编辑器结构 1.资源管理器&#xff1a;显示了项目资源文件夹(assets)中的所有资源 2.场景编译器&#xff1a;用于展示和编辑场景中可是内容的工作区域 3.层级管理器&#xff1a;用树状列表的形式展示场景中的所有…

pytest测试框架之fixture测试夹具详解

fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown&#xff0c;但相对之下它的功能更加强大和灵活。 命名方式灵活&#xff0c;不限于unittest的setup、teardown可以实现数据共享&#xff0c;多个模块跨文件共享前置后置可以实现多个模块跨…

【AutoLayout案例1-按钮居中显示 Objective-C语言】

一、按钮居中显示 1.接下来,我们就用这个autoLayout,自动布局,给大家写一个,实现几个案例,给大家看一下 那么,首先,第一个,大家注意, 当我们使用autoLayout,自动布局的时候,我们新建一个项目, 这个新建的项目,里面有一个控制器,这个控制器,是不是默认,是四四…

FreeRTOS通过消息队列实现串口命令解析(串口中断)

作者&#xff1a;Jack_G 时间&#xff1a;2023.08.08 版本&#xff1a;V1.0 上次修改时间&#xff1a; 环境&#xff1a; \quad \quad \quad \quad STM32Cube MX V6.8.1 \quad \quad \quad \quad STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 \quad \quad \quad \qu…