当前位置: 首页 > news >正文

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

相关文章:

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

FBX 格式几乎受到所有 3D 引擎的支持&#xff0c;是 Autodesk 开发的 3D 模型的专有格式。它支持顶点、索引、法线、UV坐标、材质和动画。 FBX还支持许多其他类型的信息&#xff0c;但它们对游戏引擎几乎没有用处。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 有两种…...

JS基础语法

JS是一门面向对象的编程语言&#xff0c;运行在客户端的脚本语言&#xff0c;可以基于Node.js进行服务器端编程 JS的作用: 表单动态校验网页特效服务端开发 浏览器执行JS&#xff1a; 浏览器分为两部分&#xff1a;渲染引擎和JS引擎 渲染引擎用来解析HTML和CSS&#xff0c;…...

【Zabbix监控一】zabbix的原理与安装

利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控数据 ●可以回溯寻找事故发生时系统的问题和报警情况 总结&#xff1a;zabbix主要功能 监控&#xff0c;cpu负载&#xff0c;内存使用&a…...

图的十字链表存储结构

1.其实就是邻接表和逆邻接表的结合&#xff0c;说明白点&#xff0c;就是用箭头表示出弧头&#xff0c;弧尾&#xff0c;以及他们之间的关系 2.顶点结构 3.弧结构 3.这样根据上面的结点十字链表结构就很好分析了...

精华回顾:Web3 前沿创新者在 DESTINATION MOON 共话未来

9 月 17 日&#xff0c;由 TinTinLand 主办的「DESTINATION MOON: Web3 Dev Summit Shanghai 2023」线下活动在上海黄浦如约而至。 本次 DESTINATION MOON 活动作为 2023 上海区块链国际周的 Side Event&#xff0c;设立了 4 场主题演讲与 3 个圆桌讨论&#xff0c;聚集了诸多…...

【RPC】gRPC 安装及使用

本文记录下 Mac 安装 gRPC 的过程。 参考&#xff1a;官网 1. gRPC 安装 gRPC 安装步骤如下&#xff1a; 克隆 grpc 代码 git clone --recurse-submodules -b v1.58.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc注意&#xff1a;不要直接 git clone http…...

Pygame中Sprite类的使用3

在Pygame中Sprite类的使用2_棉猴的博客-CSDN博客中提到了通过派生自pygame.sprite.Sprite类的自定义类Zombie&#xff0c;可以实现一个僵尸的移动。可以通过pygame.sprite.Group类实现对多个Zombie类实例的管理&#xff0c;即可以实现多个僵尸的移动。 1 pygame.sprite.Group类…...

23年下考前须知-软考中级信息安全工程师

信息安全工程师主要涉及计算机信息安全方面&#xff0c;在计算机软硬件、网络、应用相关领域从事安全系统设计、安全产品开发、产品集成、信息系统安全检测与审计等方面工作&#xff0c;服务单位可以是国家机关、企事业单位及科研教学单位等。 一、考试报名时间 信安考试一年…...

关于表单快速开发低代码技术平台的内容介绍

运用什么样的表单快速开发软件平台可以实现高效率创收&#xff1f;随着科技的进步和飞速发展&#xff0c;专业的低代码技术平台已经走入了很多企业的办公职场中&#xff0c;它们灵活、轻量级、优质、高效、易维护等优势特点&#xff0c;可以高效助力广大企业提质增效&#xff0…...

比特币 ZK 赏金系列:第 1 部分——支付解密密钥

以前&#xff0c;我们使用零知识赏金 (ZKB) 来支付比特币上的数独解决方案。在本系列中&#xff0c;我们将使用 ZKB 来解决范围更广的更实际的问题。 在第 1 部分中&#xff0c;我们应用 ZKB 来支付解密密钥。假设 Alice 使用对称密钥 K 加密她的文件。为了安全起见&#xff0…...

【Python深度学习】深度学习中框架和模型的区别

深度学习是人工智能领域的一股强大力量&#xff0c;它的快速发展离不开深度学习框架和模型的进步。本文将介绍深度学习框架和模型的基本概念、它们之间的联系与区别&#xff0c;以及如何根据项目需求选择合适的框架和模型。 一、深度学习框架 深度学习框架是进行深度学习研究和…...

MyBatis面试题(二)

文章目录 前言一、MyBatis 与 Hibernate 有哪些不同&#xff1f;二、MyBatis 的好处是什么&#xff1f;三、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系&#xff1f;四、什么是 MyBatis 的接口绑定,有什么好处&#xff1f;五、接口绑定有几种实现方式,…...

Android之MediaMetricsService实现本质(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...

Flutter超好用的路由库-fluro

文章目录 fluro的介绍fluro简介安装和导入路由配置导航到路由参数传递 fluro的典型使用创建路由管理类代码解释例子小结 初始化路由导航到路由 总结 fluro的介绍 fluro简介 fluro是一个流行的Flutter插件&#xff0c;用于实现高级路由管理。它提供了灵活的路由配置和导航功能…...

约数个数(蓝桥杯)

约数个数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 答案&#xff1a;96 1200000 有多少个约数&#xff08;只计算正约数&#xff09;。 约数&#xff0c;又称因数。整数a除以整数b(b≠0) 除得的商正好是整…...

越狱(快速幂C++)

题目 监狱有连续编号为 11 到 n 的 n 个房间&#xff0c;每个房间关押一个犯人。 有 m 种宗教&#xff0c;每个犯人可能信仰其中一种。 不存在没有信仰的犯人。 如果相邻房间的犯人信仰的宗教相同&#xff0c;就可能发生越狱。 求有多少种状态可能发生越狱。 输入格式 共…...

电脑入门:怎么进入路由器设置

怎么进入路由器设置 在浏览器地址栏上输入路由器的出厂默认IP地址(192.168.0.1)后按回车。在登录窗口中输入说明书上的密码,点击“Log in”按钮进入宽带路由器管理设置界面。 管理设置界面分为左右栏,左栏是主菜单,右边则是与之对应的设置内容。 请根据自己接…...

Vue3大屏项目实现数字跳动的效果

一、vue-count-to组件&#xff1a; 1、安装&#xff1a; npm install vue3-count-to --save 2、使用&#xff1a; <template><BaseCountTo:startVal"startVal":endVal"endVal":duration"duration":decimals"decimals":pr…...

MATLAB打开历史命令窗口并保持

版本&#xff1a;matlab 2021a 方法&#xff1a;菜单栏 主页 - 布局 - 命令历史记录 - 停靠...

等差数列和等比数列 常用公式

等差数列 定义 通项公式 &#xff0c; 公差 &#xff0c; 前n项和公式 中项公式 下标&#xff1a;mnpq&#xff0c;则 等比数列 定义 通项公式 &#xff0c; 公比 &#xff0c; 前n项和公式 &#xff0c; 中项公式 下标&#xff1a;mnpq&#xff0c;则...

基于SpringBoot+Vue的MOBA类游戏攻略分享平台

1 简介 MOBA类游戏攻略分享平台&#xff0c;为用户随时随地查看游戏攻略信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管理员管理MOBA类游戏攻略信息的方式方法&#xff0c;更提供了其他想要了解MOBA类游戏攻略信息及运作情况以及挑选方便快捷的可靠渠道。相比于传…...

基于异常上线场景的实时拦截与问题分发策略

作者 | 彭阳 导读 性能中台负责MEG端研发数据的接入、传输、管理、应用等各个环节。为了应对移动应用领域中端技术的快速迭代和线上突增问题的挑战&#xff0c;中台提出了实时拦截与问题的分发机制&#xff0c;旨在在端上线的不同阶段及时发现并拦截异常上线&#xff0c;最大程…...

MySQL常见面试题(一)

&#x1f600;前言 在数据库管理系统中&#xff0c;存储引擎起着核心的角色&#xff0c;它决定了数据管理和存储的方式。MySQL作为一个领先的开源关系型数据库管理系统&#xff0c;提供了多种存储引擎来满足不同的需求和优化不同的应用。除了选择合适的存储引擎&#xff0c;数据…...

webpack:详解entry和output一些重要API的使用

文章目录 contextentry单个入口多个入口entry相关API例一例二例三 outputoutput.assetModuleFilenameoutput.chunkFilenameoutput.clean【5.20.0版本支持】output.filename【重要】output.globalObjectoutput.library【重要】output.library.nameoutput.library.type【重要】ou…...

Spring后处理器-BeanPostProcessor

Spring后处理器-BeanPostProcessor Bean被实例化后&#xff0c;到最终缓存到名为singletonObjects单例池之前&#xff0c;中间会经过bean的初始化过程&#xff08;&#xff08;该后处理器的执行时机&#xff09;&#xff09;&#xff0c;例如&#xff1a;属性的填充、初始化方…...

每日一题~修剪二叉树

原题链接&#xff1a;669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 由题可知&#xff0c;我们要将原来的二叉搜索树调整为值在 low~high 之间的新二叉搜索树&#xff0c;接下来我们分析一下针对不同的节点的处理方…...

图像形态学操作(连通性、腐蚀、膨胀)

相关概念 形态学操作-腐蚀 参数&#xff1a; img: 要处理的图像kernal :核结构iteration &#xff1a;腐蚀的次数&#xff0c;默认是1 形态学操作-膨胀 参数&#xff1a; img : 要处理的图像kernal : 核结构iteration : 膨胀的次数&#xff0c;默认为1 import cv2 as cv im…...

中国这么多 Java 开发者,应该诞生出生态级应用开发框架

1、必须要有&#xff0c;不然就永远不会有 应用开发框架&#xff0c;虽然没有芯片、操作系统、数据库、编程语言这些重要。但是最终呈现在用户面前的&#xff0c;总是有软件部分。而软件系统开发&#xff0c;一般都需要应用开发框架&#xff0c;它是软件系统的基础性部件之一。…...

仿猫扑盒子引流神器试看神马视频-红包打卡签到领金

特点1&#xff1a;站内发红包&#xff0c;抢红包 特点2&#xff1a;会员可上传视频 特点3&#xff1a;设置每天免费试看次数…..具体看演示站点&#xff0c;为准 支付在后台上传收款二维码即可&#xff0c;支持微信和支付宝。前台提交订单后台管理员审核 环境&#xff1a;宝…...

WhatsApp自动营销软件是真实的吗?对做外贸有帮助吗?

出海营销少不了的就是依靠海外平台&#xff0c;WhatsApp作为许多海外国家和地区最受欢迎的聊天应用程序&#xff0c;活跃用户占到了全球人口的四分之一&#xff0c;有些地区比如欧洲、美洲&#xff0c;用户渗透率超过了80%&#xff0c;对海外营销的企业来说是不可缺少的销售工具…...

做网站有一个火箭回顶部/免费模板素材网站

zabbix-server安装的详细步骤可参考&#xff1a;https://blog.51cto.com/13632824/2084412 比较详细&#xff0c;适合新手入门。 zabbix-agent客户端的安装&#xff1a; 这里的客户端依然采用RPM方式安装 [rootlocalhost ~]# rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/…...

杭州计算机公司排名/seo知名公司

题解 九条可怜还有那么善良的一面&#xff1f;&#xff1f;&#xff1f; 显然有些数在这个区间里没有数是它的约数&#xff0c;它们其中的最后一个取的一定就是\(t(p)\)的值 这样我们只需要枚举\(t(p)\)的值&#xff0c;这个值就是“没有任何数是自己的约数”最后出现的位置 假…...

高端网站建站 北京/冯耀宗seo

首先我们分享项目到GitHub上在菜单上选择VCS&#xff0c;在下拉列表中选择Import into Version Control&#xff0c;再选择Share project on Github输入仓库的描述信息&#xff0c;点击Share选择要提交的文件&#xff0c;忽略不需要提交的文件&#xff0c;填写注释&#xff0c;…...

网站高速下载如何做/百度推广助手app

很多时候&#xff0c;我们执行页面上某个URL请求的时候&#xff0c;需要有等待的时间。如果是直接的页面跳转&#xff0c;浏览器会有缓冲进度展示&#xff0c;但是如果是AJAX&#xff0c;我觉得应该自己加上进度条&#xff0c;等待数据全部接收到之后&#xff0c;进度条消失&am…...

免费建站网站一级123456/苏州做网站的专业公司

【题目描述】 有两堆石子,两个人轮流去取。每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍&#xff0c;最后谁能够把一堆石子取空谁就算赢。 比如初始的时候两堆石子的数目是25和7。 25 7 --> 11 7 --> 4 7 --> 4 3 --> 1…...

中英文网站源码php/上海有什么seo公司

集成第三方融云的时候出现了这个错误&#xff0c;主要是之前的依赖过多&#xff0c;有的冲突了&#xff0c;总之就是很无奈&#xff1a; 下面来看看如何处理&#xff1a; 1、在app: build.gradle中添加以下配置 android {defaultConfig {...multiDexEnabled true}dexOptions…...