三维模型obj文件解析

article/2025/10/25 6:47:04

目录

  • obj文件简介
  • 文件结构
    • 顶点数据(Vertex data):
    • 自由形态曲线(Free-form curve)/表面属性(surface attributes):
    • 元素(Elements):
    • 自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):
    • 自由形态表面之间的连接(Connectivity between free-form surfaces):
    • 显示(Display)/渲染属性(render attributes):
    • 索引
  • 构造obj立方体实例
    • 需要的文件
    • 文件解析obj
    • 文件解析mtl
    • 纹理映射的具体过程
    • 使用不同材质
  • 参考及感谢

obj文件简介

obj文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。
OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。另外,有一种与此相关二进制文件格式(*.MOD),其作为专利未公开。

OBJ3.0文件格式支持直线(Line)、多边形(Polygon)、表面(Surface)和自由形态曲线(Free-form Curve)。直线和多边形通过它们的点来描述,曲线和表面则根据它们的控制点和依附于曲线类型的额外信息来定义,这些信息支持规则和不规则的曲线,包括那些基于贝塞尔曲线(Bezier)、B样条(B-spline)、基数(Cardinal/Catmull-Rom)和泰勒方程(Taylor equations)的曲线。其他特点如下:
(1)OBJ文件是一种3D模型文件。不包含动画、材质特性、贴图路径、动力学、粒子等信息。
(2)OBJ文件主要支持多边形(Polygons)模型。虽然也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。
(3)OBJ文件支持三个点以上的面,这一点很有用。很多其它的模型文件格式只支持三个点的面,所以导入Maya的模型经常被三角化了,这对于我们对模型进行再加工甚为不利。
(4)OBJ文件支持法线和贴图坐标。在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标。

文件结构

OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符()。注意连接符()后面不能出现空格或Tab格,否则将导致文件出错。
下列关键字可以在OBJ文件使用。在这个列表中, 关键字根据数据类型排列,每个关键字有一段简短描述。

顶点数据(Vertex data):

v 几何体顶点(Geometric vertices)
vt 贴图坐标点(Texture vertices)
vn 顶点法线(Vertex normals)
vp 参数空格顶点 (Parameter space vertices)

自由形态曲线(Free-form curve)/表面属性(surface attributes):

deg 度(Degree)
bmat 基础矩阵(Basis matrix)
step 步尺寸(Step size)
cstype 曲线或表面类型 (Curve or surface type)

元素(Elements):

p 点(Point)
l 线(Line)
f 面(Face)
curv 曲线(Curve)
curv2 2D曲线(2D curve)
surf 表面(Surface)

自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):

parm 参数值(Parameter values )
trim 外部修剪循环(Outer trimming loop)
hole 内部整修循环(Inner trimming loop)
scrv 特殊曲线(Special curve)
sp 特殊的点(Special point)
end 结束陈述(End statement)

自由形态表面之间的连接(Connectivity between free-form surfaces):

con 连接 (Connect)
成组(Grouping):
g 组名称(Group name)
s 光滑组(Smoothing group)
mg 合并组(Merging group)
o 对象名称(Object name)

显示(Display)/渲染属性(render attributes):

bevel 导角插值(Bevel interpolation)
c_interp 颜色插值(Color interpolation)
d_interp 溶解插值(Dissolve interpolation)
lod 细节层次(Level of detail)
usemtl 材质名称(Material name)
mtllib 材质库(Material library)
shadow_obj 投射阴影(Shadow casting)
trace_obj 光线跟踪(Ray tracing)
ctech 曲线近似技术(Curve approximation technique)
stech 表面近似技术 (Surface approximation technique)

索引

OBJ里的面的索引可正可负,为正数时是指顶点的绝对索引,为负时(比如:f -a -b -c),表示从该面位置开始,倒数的第a,b,c个顶点,vn,vt索引也一样。
OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。
材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。
参考:
百度百科:https://baike.baidu.com/item/obj%E6%96%87%E4%BB%B6/3574019?fr=aladdin
3D中的OBJ文件格式详解:https://www.cnblogs.com/slysky/p/4081307.html

构造obj立方体实例

需要的文件

1、准备任两个bmp图片文件,分别命名为cube-colormat.bmp和cube-ast.bmp
cube-colormat.bmp

在这里插入图片描述
cube-ast.bmp
在这里插入图片描述
2、新建文本,文件名改成cube.mtl,将以下内容复制进文本:

newmtl mtl1
illum 4
Ka 0.2 0.2 0.2
Kd 1 1 1
Ks 0.2 0.2 0.2
Tf 1.00 1.00 1.00
map_Kd cube-colormat.bmp
newmtl mtl2
illum 4
Ka 0.2 0.2 0.2
Kd 1 1 1
Ks 0.2 0.2 0.2
Tf 1.00 1.00 1.00
map_Kd cube-ast.bmp

3、上文有说obj文件是一种可读的文本文件,所以新建txt文本并将后缀名改成obj(例如cube.obj)。比如下面是一个立方体,由8个点,6个面,12个三角形组成,将文本框中的内容复制到新建的cube.obj内:

mtllib cube.mtl
g default
v -1.000000 -1.000000 1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
v 1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
vt 0.0 0.0 #1
vt 0.4 0.0
vt 0.0 0.4
vt 0.4 0.4
vt 0.4 0.4 #5
vt 0.8 0.4
vt 0.4 0.8
vt 0.8 0.8
vt 0.4 0.6
vt 0.8 0.6 #10
vt 0.4 1.0
vt 0.8 1.0
vt 0.0 0.4
vt 0.4 0.4
vt 0.0 0.8 #15
vt 0.4 0.8
vt 0.4 0.0
vt 0.8 0.0
vt 0.4 0.4
vt 0.8 0.4
vt 0.0 0.6
vt 0.4 0.6
vt 0.0 1.0
vt 0.4 1.0 #24
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
s off
usemtl mtl1
f 1/1/1 2/2/2 3/3/3
f 3/3/3 2/2/2 4/4/4
f 3/13/5 4/14/6 5/15/7
f 5/15/7 4/14/6 6/16/8
f 5/21/9 6/22/10 7/23/11
f 7/23/11 6/22/10 8/24/12
#usemtl mtl2
f 7/17/13 8/18/14 1/19/15
f 1/19/15 8/18/14 2/20/16
f 2/5/17 8/6/18 4/7/19
f 4/7/19 8/6/18 6/8/20
f 7/9/21 1/10/22 5/11/23
f 5/11/23 1/10/22 3/12/24

以上文件在此:
百度盘免费下载:share_noel/csdn/cube.zip
https://blog.csdn.net/qq_41102371/article/details/125646840
或者愿意用c币支持的朋友点这里:cube.zip

文件解析obj

我们所关心的主要是下面这些参数

前缀说明
v表示本行指定一个顶点此前缀后跟着3个单精度浮点数,分别表示顶点的x,y,z坐标值
vt表示本行指定一个纹理坐标,此前缀后跟着两个单精度浮点数,分别表示此纹理坐标的u,v值
vn表示本行指定一个法线向量 此前缀后跟着3个单精度浮点数,分别表示顶点法向量x,y,z坐标值
f表示本行指定一个表面(Face)
usemtl此前缀后只跟着一个参数。该参数指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称。该材质可以在此OBJ文件所附属的MTL文件中找到具体信息。
mtllib此前缀后只跟着一个参数,该参数指定了此OBJ文件所使用的材质库文件(*.mtl)的文件路径
参考:
https://blog.csdn.net/Taily_Duan/article/details/82905430
下面进行逐个讲解
“#”代表后面的内容是注释

mtllib cube.mtl:模型的材质将由cube.mtl确定
g default:后面的点、法线、面等都属于default组

v -1.000000 -1.000000 1.000000:v后面是对应一个空间点的x,y,z坐标

vt 0.0 0.0是纹理坐标,对应纹理图片cube-colormat.bmp的x,y坐标

vn是顶点法线,表示为一个三维空间向量,由3个量组成

usemtl mtl1:由mtllib cube.mtl已经定位到了文件cube.mtl,usemtl mtl1表示使用cube.mtl中的mtl1材质;mtl2则是另一种材质。
在这里插入图片描述

f 1/1/1 2/2/2 3/3/3:
f表示面。面后面跟着的整型值分别是属于这个面的顶点、纹理坐标、法向量的索引。面的格式为:
f Vertex1/Texture1/Normal1 Vertex2/Texture2/Normal2 Vertex3/Texture3/Normal3
在这里插入图片描述
s off或者s 0表示关闭光滑组
参考:
https://www.cnblogs.com/youthlion/archive/2013/01/21/2870451.html?spm=a2c4e.10696291.0.0.532519a4C9kU59
http://www.zwqxin.com/archives/opengl/obj-model-format-import-and-render-1.html

文件解析mtl

newmtl mtl1:newmtl指定新材质的名称为mtl1,以供obj文件中对应查询

illum 光照模型
#光照模型属性如下:
#0. 色彩开,阴影色关
#1. 色彩开,阴影色开
#2. 高光开
#3. 反射开,光线追踪开
#4. 透明: 玻璃开 反射:光线追踪开
#5. 反射:菲涅尔衍射开,光线追踪开
#6. 透明:折射开 反射:菲涅尔衍射关,光线追踪开
#7. 透明:折射开 反射:菲涅尔衍射开,光线追踪开
#8. 反射开,光线追踪关
#9. 透明: 玻璃开 反射:光线追踪关
#10. 投射阴影于不可见表面

Ka r g b #环境光反射,g和b两参数是可选的,如果只指定了r的值,则g和b的值都等于r的值

Kd r g b #漫反射

Ks r g b #镜面光反射
参考:
https://blog.csdn.net/Taily_Duan/article/details/82905430

纹理映射的具体过程

选择编辑好的cube.obj,右键打开方式使用win10自带的3D查看器,结果如下
在这里插入图片描述
在这里插入图片描述

文本打开编辑obj,除了第一个面,其它面全用#注释掉
在这里插入图片描述

保存后用3D查看器打开,可以看到只有第一个三角面出现。
在这里插入图片描述

现在对照着vt后面的坐标,以及前面的cube-colormat.bmp
在这里插入图片描述

图片被分成5X5的格子,按比例看,每个格子占0.2,起点为(0.0 0.0)在左下白格“1”处。
根据面的格式:
f Vertex1/Texture1/Normal1 Vertex2/Texture2/Normal2 Vertex3/Texture3/Normal3
第一个三角面:
f 1/1/1 2/2/2 3/3/3
根据顺序索引1,2,3号点构成这个空间面
v -1.000000 -1.000000 1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
1,2,3号纹理坐标分别对应这三个点
vt 0.0 0.0 #1
vt 0.4 0.0
vt 0.0 0.4
1,2,3号法向量分别对应这三个点
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000

在图片中的“1”“2”“3”点构成的三角形区域的纹理映射到空间点v1,v2,v3构成的空间面上。
将第2,3个面取消注释

在这里插入图片描述

保存后再用3D查看器打开obj,三个空间面如下
在这里插入图片描述

使用不同材质

将每个面的注释取消,并取消usemtl mtl2的注释,表示后面6个三角面的纹理由材质mtl2决定,而在cube.obj中可看到,mtl2材质来自于图片cube-ast.bmp
在这里插入图片描述
用3D查看器
在这里插入图片描述
可看到第二个材质也被映射到了立方体上

参考及感谢

文中已列出

如有错漏,敬请指正
--------------------------------------------------------------------------------------------诺有缸的高飞鸟202009


http://chatgpt.dhexx.cn/article/CQAvx8Ny.shtml

相关文章

linux类动态库,Linux动态库(一)

起因 博主在以Linux下做开发。在软件需求中,需要动态库带来的灵活性。 比如说博主主导的智能主机的开发。它需要支持很多种类的设备控制,如普通的开关灯、RGB灯、窗帘、百叶窗等等。我们将这些设备抽象成Device类,具体的设备就从这个类上派生…

OpenFlow Switch

The picture of OpenFlow Switch openflow 架构分为2层,一个是控制器层,一个是switch 层。中间是由openflow protocal进行连接的,负责传输指令与数据。switch分为3大块,第一是openflow channe,他是负责向控制器传输数据…

【博客450】OpenFlow学习

OpenFlow OpenFlow协议规范定义了OpenFlow交换机、流表、OpenFlow通道以及OpenFlow交换协议。 OpenFlow是第一个开放的南向接口协议,也是目前最流行的南向协议。它提出了控制与转发分离的架构,规定了SDN转发设备的基本组件和功能要求,以及与控…

OpenFlow交换机【ACM SIGCOMM顶会论文笔记】

目录 写在前面的话OpenFlow交换机基本思想与工作原理专用OpenFlow交换机(Dedicated OpenFlow switches) 启用OpenFlow的交换机(OpenFlow-enabled switches)其他功能(Additional features)控制器&#xff08…

关于ns-3中安装openflow的问题,解决openflow not found

官网 官网里面并没有明确的描述,这里结合自己的安装过程讲解一下 首先下载源码,记住这一步最好在ns-3目录下,就是运行waf命名的目录 $ hg clone http://code.nsnam.org/jpelkey3/openflow $ cd openflow进行编译,会提示缺少文件…

OpenFlow基础入门知识

本文进行讨论的是OpenFlow 1.0和OpenFlow 1.3的基本知识 Overview: Openflow 1.0: 安全通道单张流表ipv4 Openflow 1.3: 安全通道多级流表(流水线pipeline)组表测量表ipv6..... 流(flow) …

Openflow流表学习

Openflow流表学习 OpenFlow是一种新型的网络协议,它是控制器和交换机之间的标准协议。自2009年底发布1.0版本后,OpenFlow协议又经历了1.1、1.2、1.3及1.4版本的演进过程,目前使用和支持最多的是1.0和1.3版本。 OpenFlow1.3在1.0版的基础上进…

SDN与OPENFLOW 简介

本文对Openflow的发展、规范、应用和SDN的提出及相关应用做出较为客观全面的介绍。笔者希望通过本文对OpenFlow/SDN做一个初步介绍,以期帮助大家能够进一步深入了解和学习OpenFlow/SDN。 序言:从网络虚拟化说起 云计算的发展,是以虚拟化技术…

OpenFlow协议分析

实验环境:CentOS OpenDayLight-Carbon mininet WireShark 本实验通过wireshark抓包分析openflow1.3协议的各种报文与字段。 抓包 首先安装好实验所需的软件,这里不多赘述,需要的可以点击查看:mininet多方法安装,控制…

openflow简介

openflow交换机包含一些流表,流表负责具体包查找和转发 控制器通过of协议对流表查询和管理 一、流表 流表组成: 包头域、活动计数器、0个或多个执行行动 包头域: 计数器: 可以针对每张表、每个流、每个端口、每个队列来维护。…

SDN-OpenFlow1.0协议分析

目录 OpenFlow1.0代码 OpenFlow交换机流表 包头域 计数器 行动 流表匹配 OpenFlow消息 OpenFlow消息格式 对称消息 建立OpenFlow连接(OFPT_HELLO消息) 报告错误(OFPT_ERROR消息) 获取交换机特性信息(Featu…

OpenFlow概述

OpenFlow简介 通俗的讲,OpenFlow是使用类似于API进程配置网络交换机的协议。OpenFlow的思路很简单,网络设备维护一个FlowTable并且只按照FlowTable进行转发,FlowTable本身的生成、维护、下发完全由外置的Controller来实现,注意这里…

OpenFlow了解

openflow的核心思想是将所有的协议都抽象出来,抽象成公共的flow概念。协议抽象:数据,函数(对数据的处理方式),逻辑(数据与处理的对应关系,函数之间的交互行为与时序) pu…

OpenFlow交换机概述

1 交换机组成 OpenFlow交换机包括一个或多个流表和一个组表,执行分组查找和转发,和到一个外部控制器OpenFlow的信道。 控制器使用OpenFlow的协议,可添加、更新和删除流表中表项,既主动或被动响应数据包。 每个流表项包含匹配字段&…

openflow阅读感悟

一、背景 随着网络的快速发展和普及,设备和协议的复杂性导致了网络实验的困难。当时,几乎没有实际方法可以在足够现实的环境中尝试新的网络协议,来自网络学术、产业界的大多数新想法都未经试用和测试。因此,人们普遍认为网络基础设…

OpenFlow概念

OpenFlow是一种网络通信协议,应用于SDN架构中控制器和转发器之间的通信。软件定义网络SDN的一个核心思想就是“转发、控制分离”,要实现转、控分离,就需要在控制器与转发器之间建立一个通信接口标准,允许控制器直接访问和控制转发…

OpenFlow总结

OpenFlow总结 OpenFlow体系结构OpenFlow端口1.1、物理端口1.2、逻辑端口1.3、预定端口(OpenFlow1.5中文版) OpenFlow流表(FlowTable)2.1、概念2.2、流表结构 OpenFlow通信通道3.1、消息类型3.2 、消息交换 OpenFlow体系结构 Open…

Openflow

1.Openflow是啥 OpenFlow是第一个开放的南向接口协议,也是目前最流行的南向协议。 它提出了控制与转发分离的架构,规定了SDN转发设备的基本组件和功能要求,以及与控制器通信的协议。 2.OpenFlow组件 2.1. OpenFlow交换协议 2.2 OpenFlow网…

[学习笔记]OpenFlow概述(1)

个人学习笔记,出问题请指出下。摘取《图解OpenFLow》 Openflow协议是由斯坦福大学提出,最初的出发点是为了更加轻松地构建用于研究的网络。 Openflow的初期设计思想:无需设计新的硬件,只对现有硬件更新其软件。因此,O…

OpenFlow 协议详解(干货)

OpenFlow是一种新型的网络协议,它是控制器和交换机之间的标准协议。自2009年底发布1.0版本后,OpenFlow协议又经历了1.1、1.2、1.3及1.4版本的演进过程,目前使用和支持最多的是1.0和1.3版本。OpenFlow1.3在1.0版的基础上进一步优化及升级&…