FBX文件结构解读【文本格式】

FBX 格式几乎受到所有 3D 引擎的支持,是 Autodesk 开发的 3D 模型的专有格式。它支持顶点、索引、法线、UV坐标、材质和动画。

FBX还支持许多其他类型的信息,但它们对游戏引擎几乎没有用处。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

有两种可行的方法可以将 FBX 文件支持集成到引擎中:

  • 使用 Autodesk 官方的 FBX SDK,它允许导入和导出 FBX 文件或具有相同用途的其他库。 SDK 公开了两个接口,一个是 C++ 接口,另一个是 Python 接口。
  • 编写自定义 FBX 解析器,避免对其他库的依赖。

第一种方法很简单:只需下载 SDK 并按照文档进行操作即可。 请注意,FBX SDK 的使用并不像人们想象的那么简单。

我将在本文中介绍 FBX 文件的结构。 对它的理解允许我们编写一个自定义的、轻量级的解析器。 有关自定义 FBX 解析器的示例,你可以查找 Blender 的 FBX 导入器/导出器插件。

然而,由于该格式是专有的,因此该格式的公共规范不可用。 尽管如此,FBX SDK 仍包含一些标头,部分揭示了格式的布局。

格式可以是 ASCII(文本文件,人类可读)或二进制形式。

因此,从第一个表示更容易推断出格式的结构是什么,以及我们需要的信息(几何、材质等)在哪里。

首先,我将展示如何从 FBX ASCII 文件获取基本几何信息。 如果你在实际实现方面需要帮助(此处未涵盖),请随时询问我,我将尽最大努力通过伪代码甚至 C 语言帮助你。如果你解析FBX的目的是为了转换为其他格式,那么可以直接使用NSDT 3DConvert这个强大的 在线3D格式转换工具,支持FBX、GLTF、GLB、OBJ、DAE、STL、PLY等数十种3D格式:

在这里插入图片描述

1、FBX文件结构

这是一个 示例 FBX 文件。

首先要注意的是,有些行以分号开头:这些是注释,在读取文件时必须忽略。

在初始注释之后,找到了标识符 FBXHeaderExtension。 这是文件结构的第一个主节点。 FBX 文件格式确实是遵循以下方案的树结构:

在这里插入图片描述

每个节点或子节点都可以有自己的特定属性。 属性也可以在主节点之外找到,但通常可以忽略。 一般来说,节点的基本结构如下:

node name: eventual_properties {  <---- beginning of nodeNode_Property_1: valueNode_Property_2: valueSubnode1 :  {   <---- beginning of subnodeSubnode_Property_1: value[…]}   <---- end of subnodeNode_Property_3: value[…]
} <---- end of node

这是在示例文件中找到的一个节点(第一个):

FBXHeaderExtension:  { <---- beginning of nodeFBXHeaderVersion: 1003 <---- node propertyFBXVersion: 6100CreationTimeStamp:  { <---- beginning of subnode (1)Version: 1000  <---- subnode propertyYear: 2014Month: 03Day: 20Hour: 17Minute: 38Second: 29Millisecond: 0} <---- end of subnode (1)Creator: "FBX SDK/FBX Plugins build 20070228"OtherFlags:  { <---- beginning of subnode (2)FlagPLE: 0} <---- end of subnode (2)
}

理解结构是编写高效解析器的基础。

在第一个节点中,我们找到两个属性(FBXHeaderVersion 和 FBXVersion),其值是格式版本。 在本例中为 6.1 版本。 其他信息可以忽略,除非还想读取创建日期 (CreationTimeStamp)。

2、FBX对象节点

最重要的节点肯定是对象节点。

对象节点包含模型的顶点、索引、法线、UV 坐标和材质。 它的结构如下:

Objects:  { <---- beginning of node ObjectsModel: “model name”, “Mesh” { <---- beginning of node of the model[…]Vertices: […]       <---- verticesPolygonVertexIndex: […]  <---- indicesLayerElementNormal: { }  <---- node of the normalsLayerElementUV: { }  <---- node of the UV coords} <---- end of node of the modelMaterial: “material name”, “” { } <---- node of the material[…]
} <---- end of node Objects

3、FBX顶点

正如我们所见,顶点可以在模型子节点的“Vertex”属性中找到。

语法如下:

Vertices: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, […]

每个顶点都有三个空间坐标 (x,y,z),用逗号分隔(也将一个顶点与另一个顶点分开)。 坐标显然是用十进制形式表示的,带有点。

示例如下:

Vertices: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400

构成模型的顶点将是:

v1(0.000000,0.104800,39.291698)v2(00.000000,0.043400,-44.424301)v3(0.000000,38.654301,-41.818802)v4(0.000000,39.455002,44.424400)

4、FBX多边形的顶点索引

索引可以在 PolygonVertexIndex 属性下找到。

FBX 文件可以导出三边多边形(三角形)或更多。 大多数文件导出四边形多边形(四边形)。 语法和顶点类似,但是有一点需要注意:

PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[…] <—- triangles syntaxPolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, […] <—- quads syntax

组成多边形的索引是按顺序排列的,负索引意味着它是多边形的最后一个索引。 该指数需要设为正数,然后你必须从中减去 1!

[如果你想知道为什么,那是因为原始索引与 -1 进行了异或。 例如索引 3 变为 -4]

示例如下:

PolygonVertexIndex: 8,7,3,-7,4,8,7,-3,0,5,8,-5

组成模型的多边形将是:

p1(8,7,3,6)p2(4,8,7,2)p3(0,5,8,4)

请注意表示多边形末端的索引已设为正数,然后从中减去 1。

提醒:显卡不喜欢四边形,因此在显示模型之前必须将每个具有四个边的多边形分成两个三角形。

5、FBX法线

法线可以在 Normals 属性的子节点 LayerElementNormal(它又是 Model 的子节点)下找到。 语法与其中一个顶点相同,即一系列 (x,y,z) 坐标。

Normals: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, […]

你需要注意 MappingInformationType 属性,它可以具有以下值:

  • ByPolygon:按多边形处理,这意味着模型的每个多边形都有一个法线。
  • ByPolygonVertex:按多边形顶点处理,这意味着模型的每个多边形的每个顶点都有一个法线。例如,如果模型有 8 个顶点组成四个四边形,则将有 16 个法线(1 个法线 * 4 个多边形 * 4 个多边形顶点)。 请注意,通常游戏引擎需要顶点仅定义一个法线。 因此,如果你发现一个顶点具有多个法线,可以忽略第一个法线之后找到的法线,或者计算所有法线的平均值(法线平滑)。
  • ByVertex:按顶点处理,这意味着模型的每个顶点都有一个法线。有时也称为 ByVertice,如 Blender 导出器所写。我认为作者是西班牙人。
  • ByEdge:按边处理,这意味着模型的每个边都有一个法线(罕见)
  • AllSame:这意味着模型的每个顶点都有相同的法线,这对于大多数模型来说很少见或不可能。

另一个重要的属性是 ReferenceInformationType 属性,它可以具有以下值:

  • Direct:表示法线是有序的。
  • IndexToDirect(或旧版本 FBX 格式的索引):表示法线的顺序由 NormalsIndex 属性给出。

以下是一个可能比文字更清楚的图形示例。 示例模型是一个位于 X 轴和 Y 轴上的平面(因此所有顶点的 Z 坐标将为 0),由 9 个顶点和 4 个多边形(四边形)组成。 示例图是从顶部看到的平面视图。
在这里插入图片描述

6、FBX UV坐标

UV 坐标可以在 UV 属性中的子节点 LayerElementUV(它又是 Model 的子节点)下找到。 语法类似于顶点和法线的语法,但当然会有两个坐标而不是三个。

UV: u1, v1, u2, v2, […]

你仍然需要注意 MappingInformationType 和 ReferenceInformationType 属性! 这两个属性可以具有的值与法线的值相同,因此适用相同的规则。 索引属性(如果有,即定义了 IndexToDirect)是 UVIndex。


原文链接:FBX文件结构解读 — BimAnt

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

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

相关文章

9.基于粤嵌gec6818开发板小游戏2048的算法实现

2048源码&#xff1a; 感兴趣的可以去了解一下2048优化算法&#xff1a; 基于蒙特卡罗树搜索的_2048_游戏优化算法_刘子正 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #incl…

程序员自由创业周记#12:999%

下载量涨了999% 在此之前&#xff0c;我的Apple开发账号上只有一个产品-学伟扫描&#xff0c;因为没有推广&#xff0c;只靠自然流量&#xff0c;每天的下载量寥寥无几&#xff0c;这种稳定无人问津的状态断断续续保持了4年。 之前的周记里介绍了最近在做创业的第二个项目-学伟…

PHP 如何创建一个 composer 包 并在 项目中使用自己的 composer sdk 包

第一步创建一个composer SDK项目 创建一个 composer.json文件或使用 命令 &#xff08;如果不清楚怎么弄 直接跳过即可&#xff0c;一般都会默认配置&#xff09; composer init这是生成的composer.json文件 将自己要使用的包添加到 require 中&#xff0c;如果没有require则…

mac安装运行superset及踩坑解决过程

介绍 Apache Superset 是一个现代的企业级商业智能 Web 应用程序。它快速、轻量、直观&#xff0c;并加载了各种选项&#xff0c;使所有技能的用户都可以轻松探索和可视化他们的数据&#xff0c;从简单的饼图到高度详细的 Deck.gl 地理空间图表。 安装 首先安装自制homebrew安…

1. PCIE基础入门知识

GT/s 是"每秒十亿次传输" 时间版本速率2003Pcie 1.02.5GT/s2006PCIE 2.05GT/s2010PCIE 3.08GT/s2017PCIE 4.016GT/s 高速接口&#xff1a;雷电接口&#xff08;PCIEx4接口 &#xff09; PCIE接口 工作模式&#xff1a;Endpoint 和 Root Port。 Endpoint&#xff0…

Si314 低功耗 14 通道电容触摸传感器,软硬件兼容替代GTX314L

Si314 是一款具有自动灵敏度校准功能的 14 通道电容传感器&#xff0c;其工作电压范围为 1.8~5.5V。 Si314 设置休眠模式来节省功耗&#xff0c;此时&#xff0c;功耗电流为 10uA3.3V。Si314 各个感应通道可实现独立使能、校准、灵敏度调节&#xff0c;可以确保可靠性&#xff…

Terminnal will be login out after 20 second

锐捷交换机&#xff0c;命令敲着敲着 &#xff0c;就提示20秒后将中断 &#xff0c;show ip ssh 查看也一下也没有什么特殊的。 于是查看了一下VTY下的配置 absolute-timeout 5 ,这句话是什么意思呢 &#xff1f; 5分钟强制退出 &#xff01; 改进方法&#xff1a; (config)#…

14:00面试,14:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

Revopoint的3D输出格式及转换工具

在 CES 展会期间&#xff0c;许多参观者向我们询问与我们的 3D 扫描仪相关的问题。 最常见的问题包括我们的扫描仪导出的文件格式&#xff0c;以及该文件是否与 3D 打印机兼容&#xff1f; 因此&#xff0c;我们决定回答这些问题&#xff0c;并在本文中对常见的 3D 文件格式进行…

vuejs - - - - - 使用code编辑器codemirror

使用code编辑器codemirror 0. 效果图1. 依赖安装2. 组件封装3. 组件使用 0. 效果图 列表实现参考: 列表实现代码 1. 依赖安装 npm install codemirror codemirror-editor-vue3 jsonlint-mod 2. 组件封装 code-mirror-editor.vue <template><VueCodeMirrorclas…

Nginx location 精准匹配URL = /

Location是什么&#xff1f; Location是Nginx中的块级指令(block directive)&#xff0c;通过配置Location指令块&#xff0c;可以决定客户端发过来的请求URI如何处理&#xff08;是映射到本地文件还是转发出去&#xff09;及被哪个location处理。 匹配模式 分为两种模式&…

Vim编辑器使用入门

目录 一、Vim 编辑器基础操作 二、Vim 编辑器进阶操作 三、Vim 编辑器高级操作 四、Vim 编辑器文件操作 五、Vim 编辑器文件管理 六、Vim 编辑器进阶技巧 七、Vim 编辑器增强功能 Vim的三种工作模式 一、Vim 编辑器基础操作 1.移动光标 - 光标的移动控制 移动光标有两…

计算机网络常见面试题

目录 一、谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 答&#xff1a;OSI七层模型主要分为&#xff1a; TCP/IP四层协议&#xff1a; 二、谈谈TCP协议的3次握手过程&#xff1f; 三、TCP协议为什么要3次握手&#xff1f;2次&#xff0c;4次不行吗&#xff1f; …

微信这样的加人方式,既安全又解放双手

在当今竞争激烈的市场环境下&#xff0c;如何高效地管理和运营私域流量成为企业发展的关键。 1.批量自动化加好友的优势 &#xff08;1&#xff09;提高效率&#xff1a;批量自动化添加好友功能可以帮助企业添加大量潜在客户或目标客户。相比手动逐个添加好友&#xff0c;自动…

嵌入式Linux驱动开发(I2C专题)(七)

使用GPIO操作I2C设备_IMX6ULL 参考资料&#xff1a; Linux文档 Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yamlLinux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt Linux驱动源码 Linux-5.4\drivers\i2c\busses\i2c-gpio.cLinux-4.9.88\driv…

spring boot 时间格式化输出

目录标题 一、spring boot 序列化二、 JsonFormat(pattern "yyyy-MM-dd HH:mm:ss")和JSONField(format "yyyy-MM-dd HH:mm:ss")区别三、在实体类中序列化时间&#xff08;格式化输出&#xff09;&#xff08;一&#xff09;使用JsonFormat&#xff08;二…

【校招VIP】产品基础知识之学习渠道

考点介绍&#xff1a; 产品经理是一项复合型的工作&#xff0c;需要学习掌握的知识很多&#xff0c;能否通过学习掌握并构建一套属于自己的产品知识体系&#xff0c;是成为一名优秀产品经理的重要条件。系统化学习方法&#xff0c;可以分为以下6个步骤&#xff1a; 1、明确的学…

robotframework在Jenkins执行踩坑

1. Groovy Template file [robot_results.groovy] was not found in $JENKINS_HOME/email_template 1.需要在managed files 添加robot_results.groovy。这个名字需要和配置在构建项目里default content一致&#xff08;Extended E-mail Notification默认设置里Default Content…

如何利用物联网技术打造新型智能餐饮连锁店

中国是美食大国&#xff0c;餐饮美食的消费需求庞大&#xff0c;随着餐饮产业的标准化、规模化发展&#xff0c;餐饮店的连锁化率在持续上升&#xff0c;许多餐饮知名品牌都开设了成百上千家连锁店。随着餐饮连锁店数量的增加&#xff0c;对品牌店铺的管理和运营难度也日益增长…

【C语言】字符函数和字符串函数(含模拟)

前言&#xff1a; 在做OJ题或阅读代码时或多或少会遇到一些字符函数和字符串函数&#xff0c; 如果不认识或不熟悉就会造成不便&#xff0c; 本篇文章主要是为了这方面而存在&#xff0c; 此篇介绍各个字符串的功能与使用方法&#xff0c; 下一篇会讲解如何模拟这些函数 重点&a…