fbx格式研究

article/2025/9/13 11:27:51

Part1fbx简介

Autodesk FBX是Autodesk公司出品的一款用于跨平台的免费三维创作与交换格式的软件,通过FBX用户能访问大多数三维供应商的三维文件。FBX 文件格式支持所有主要的三维数据元素以及二维、音频和视频媒体元素。
FBX对于三维软件的兼容性非常非常强大,几乎所有的三维软件或者游戏引擎全部都支持导入FBX模型,所以FBX格式已然成为新时代的互导利器。

17b29a1a823fcf58ba6d16b0f5838a30.png

fbx有两种文件模型,一种是二进制文件,另外一种是ASCII文件。二进制文件文件大小和加载速度上面具有天然的优势,但是在可读性和易于集成方面不如ASCII文件。本来主要基于ASCII文件格式进行研究。

Part2fbx格式-ASCII

本章通过一系列示例来研究fbx的数据存储方法。这里在3dmax中新建一个正方体,属性如下:
1、系统单位为米
2、长、宽、高为1米
3、场景中位置为(0,1,0)
4、材质为pbr材质,名称为M001
5、Z轴向上 效果图和导出格式如下:

765b6cf44828295fcc46c4b1e1d5fd3e.png 999ab2ab29735075c99cd301d32d0153.png

1全局配置

全局的配置存放在GlobalSettings结构里,通过UpAxis表示向上的坐标轴,其中Y轴向上值为1,若Z轴向上值为2。通过OriginalUnitScaleFactor存放系统单位,值为100表示单位为1米。示例如下

GlobalSettings:  {Version: 1000Properties70:  {P: "UpAxis", "int", "Integer", "",2P: "OriginalUnitScaleFactor", "double", "Number", "",100.00000066}
}

2默认设置

对象的默认属性存储在Object definitions字段。这样就可以不在下面的具体定义中体现默认值了,可以有效地减少存储空间。例如网格体的部分默认属性设置示例如下:

ObjectType: "Model" {Count: 1PropertyTemplate: "FbxNode" {Properties70:  {P: "QuaternionInterpolate", "enum", "", "",0P: "RotationStiffnessX", "double", "Number", "",0P: "RotationStiffnessY", "double", "Number", "",0P: "RotationStiffnessZ", "double", "Number", "",0P: "AxisLen", "double", "Number", "",10P: "PreRotation", "Vector3D", "Vector", "",0,0,0P: "PostRotation", "Vector3D", "Vector", "",0,0,0P: "RotationActive", "bool", "", "",0}}}

3对象定义

对象的定义是整个fbx格式中最核心的单元,这里定义了几何形状、模型、材质等组成模型的必要元素。

Geometry对象

保存了对象的顶点、多边形、法线、UV、材质。

顶点数据格式如下

Vertices: *24 {a: -0.5,-0.5,0,0.5,-0.5,0,-0.5,0.5,0,0.5,0.5,0,-0.5,-0.5,1,0.5,-0.5,1,-0.5,0.5,1,0.5,0.5,1}

这里实际上只有8个顶点,因为每个顶点坐标需要用(x,y,z)三个值来表示。

多边形格式如下:

PolygonVertexIndex: *24 {a: 0,2,3,-2,4,5,7,-7,0,1,5,-5,1,3,7,-6,3,2,6,-8,2,0,4,-7}

这里为了区分模型网格是三角面还是四边面,如果数据每隔三个为负数则为三角面,每隔四个为四边面。
如何将负数的索引值转成有效索引数据呢?
假如n为负数索引值,m = |n|-1 。m为计算后的正确索引值。可以看到我们是每隔四个一个负数,这说明我们是四边形。

另外法线信息存储在LayerElementNormal中,uv信息存储在LayerElementUV中,材质信息存储在LayerElementMaterial中。这些信息与模型关联通过总的Layer来进行。示例如下:

Layer: 0 {Version: 100LayerElement:  {Type: "LayerElementNormal"TypedIndex: 0}LayerElement:  {Type: "LayerElementMaterial"TypedIndex: 0}LayerElement:  {Type: "LayerElementUV"TypedIndex: 0}}

Model对象

Model对象主要用来存储我们模型的平移、旋转、缩放信息。如我们模型在场景中坐标为(0,1,0)通过Lcl Translation字段来存储,示例如下

Model: 2358487033216, "Model::Box001", "Mesh" {Version: 232Properties70:  {P: "InheritType", "enum", "", "",1P: "ScalingMax", "Vector3D", "Vector", "",0,0,0P: "DefaultAttributeIndex", "int", "Integer", "",0P: "Lcl Translation", "Lcl Translation", "", "A",0,1,0P: "MaxHandle", "int", "Integer", "UH",15}Shading: TCulling: "CullingOff"}

Material对象

材质对象通过Material来标识,这里我们存储的是pbr此安置,定义示例如下:

Material: 2356630663440, "Material::M001", "" {Version: 102ShadingModel: "unknown"MultiLayer: 0Properties70:  {P: "SpecularColor", "ColorRGB", "Color", "",1,1,1P: "SpecularFactor", "double", "Number", "",2P: "ShininessExponent", "double", "Number", "",1024P: "TransparencyFactor", "double", "Number", "",0P: "EmissiveColor", "ColorRGB", "Color", "",0,0,0P: "EmissiveFactor", "double", "Number", "",0P: "3dsMax", "Compound", "", ""P: "3dsMax|ClassIDa", "int", "Integer", "",2121471519}}

对象关联

通过Connections字段来实现Geometry对象、Model对象、Material对象以及父子节点的关联。示例如下:

Connections:  {;Model::Box001, Model::RootNodeC: "OO",2358487033216,0;Geometry::, Model::Box001C: "OO",2358344616656,2358487033216;Material::M001, Model::Box001C: "OO",2356630663440,2358487033216}

对象的关联分为四种类型:

● OO: Object (source) to Object (destination).
● OP: Object (source) to Property (destination).
● PO: Property (source) to Object (destination).
● PP: Property (source) to Property (destination).

子节点往往通过source来表示。材质和几何体也通过source来表示,我们这里有3个连接,分别代表:
1 、Box001的父节点是RootNode
2 、Box001的几何体是id为2358344616656的几何体
3 、Box001的材质是M001材质

Part3总结

本文主要介绍了fbx的网格体、材质、uv相关的存储方法,并未涉及动画、骨骼等存储。下一篇介绍如何通过python来处理fbx数据。

欢迎关注公众号加技术交流群。

1e983537ab75d5d1d7fd49894781998f.png


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

相关文章

matlab 画图的颜色

plot函数代表不同颜色的标示符一共有八种: y:黄色;k:黑色;w:白色;b:蓝色;g:绿色;r:红色;c:亮青色&#xff1b…

Matlab画图线型、符号及颜色汇总

【1】线型、标记符、颜色的说明 【2】对于坐标轴的注释内容xlabel,ylabel的属性说明 figure,plot(Seg1,SS1_QJ1,k);hold onplot(Seg1,SS1_QJ1,ks)plot(Seg1,Q1*ones(length(Seg1)),r)xlabel(\bf{安装角}(),FontSize,10.508) %\bf是加粗的意思%xlabel(\fontsize{10.508}\fontn…

matlab绘图颜色RGB

一.1.MATLAB中颜色数值 二.常用颜色

matlab中的颜色,Matlab里面除了常用的还有哪些颜色?已知的颜色不够怎么办?

我这里有个自己写的函数,支持64个色 %% H:取色函数 % INTRODUCTORY TEXT %标题综述************************ %调用默认色图可实现64色的选取 %输入**************************** %①所选颜色个数 %输出**************************** %①待用颜色的RGB矩阵 %调用流程…

Matlab中绘制颜色渐变曲线

大家在文章中是否看见过各类颜色渐变的曲线呢?今天小编就教大家在matlab中如何绘制这类颜色渐变的曲线。 一、scatter3函数 这个函数是大家最常想到的函数,具体用法就看其帮助文档,小编就给出一段示例代码: % Matlab% data z …

matlab画图配色RGB+线性

转载自https://blog.csdn.net/a_cherry_blossoms/article/details/115185831 画图的线型和符号该博主链接中可以找到:https://blog.csdn.net/weixin_45634606/article/details/104422695 1.使用matlab画图时,怎样才能调出顺眼的颜色呢?反正我…

matlab中surf怎么改变颜色_MATLAB作图

未完,之后将逐渐更新 %%2D作图 1、极坐标转直角坐标 1.1直接用公式 利用极坐标转直接坐标公式 thet=0:2*pi/100:2*pi; rho=1; x=rho.*cos(thet); y=rho.*sin(thet); plot(x,y); 1.2 用pol2cart [x,y]=pol2cart(thet,rho);相当于1.1中第三第四行代码 同理直角坐标转极坐标用car…

Matlab 绘图 曲线颜色自定义

Matlab 绘图 曲线颜色自定义 同时组合图内间距小 确定绘制曲线的RGB颜色根据RGB颜色将其除以255归一化到0-1,plot中选择属性’color’为RGB值即可。示例如下 rn 2; % The number of rows cn 2; % The number of columns% color1 [34 139 34]; % color2 [255…

matlab 中曲线颜色,matlab曲线颜色样式设置

满意答案 南渡江ndj 2013.09.03 采纳率:43% 等级:12 已帮助:19801人 你好 这是我总结的画图资料 比如画一条蓝色的x号线 plot(x,y,bg) 画图: 线形:-实线 -. 点划线 --长虚线 :短虚线 符号 颜色 符号 线形 b 蓝 . 点 c 青 。 圈 g 绿 标记 k 黑 - 实线 m 紫红 * 星号 r 红…

MATLAB画图颜色渐变

原文(https://wenku.baidu.com/view/bf87a9d5804d2b160a4ec03f.html) 1 渐变 1.1 t[linspace(0,2*pi) nan]; xsin(t);ycos(2*t);zsqrt(t);%所要绘制的曲线方程 patch(x,y,z,z,edgecolor,flat,facecolor,none) view(3);grid on;colorbar 1.2 x-200…

[Matlab]绘图颜色

[Matlab]绘图颜色 修改或规定Matlab中几何图形的颜色,对颜色可以有四种描述方法,分别是:颜色名称、短名称、RGB三元组、十六进制颜色代码。 Matlab中较美观的颜色(RGB三元组) %% 适用于Matlab的RGB颜色 [0.00,0.45,0.74] //蓝 [0.85,0.33,…

matlab画图的参数,Matlab 画图plot参数 颜色 类型

this.p{ m:2, b:2, loftPermalink:, id:fks_094074086082083066081094082095081081081071087084083068, blogTitle:Matlab 画图plot参数 颜色 类型, blogAbstract:绘图参数 y 黄 - 实线 . 点 < 小于号 m 紫 &#xff1a;点线 o 圆 s 正方形 c 青 -. 点…

matlab画图中颜色渐变

最近又开始用matlab画图了&#xff0c;以前配色一直用colormap&#xff0c;用过自带的配色&#xff0c;比如et, hsv, autumn, bone等&#xff0c;也自己定义过mycolormap。现在开始用m_map配色了&#xff0c;爽心悦目&#xff0c;感觉很不错&#xff01;强烈推荐下m_map工具箱官…

Matlab | 画图线型及颜色符号汇总

这里写目录标题 线条的主要属性Color: 颜色LineStyle: 线型LineWidth: 线宽Marker: 标记点的形状MarkerFaceColor: 标记点填充颜色MarkerEdgeColor: 标记点边缘颜色MarkerSize: 标记点大小 matlab 中 线条的主要属性 Color: 颜色 颜色rgbcmykw说明红色绿色蓝色青绿色洋红色黄…

Matlab画图颜色设置

注意&#xff1a;MATLAB中调色板色彩强度[0,1]&#xff0c;0代表最暗&#xff0c;1代表最亮。 常用颜色的RGB值 -------------------------------------------- 颜色 R G B 颜色 R G B -------------------------------------------- 黑 …

oracle 按旬统计并且每月小计 行转列 PIVOT函数 与分组小计 ROLLUP 函数

数据库版本:oralce 11g 表名WM_TD_WATER_DAILY 结构如下,我把没用到的字段隐藏了,全放出来不太好哈. MONITOR_ID为BI_TB_MONITOR_BI的ID ,用于关联站点名称(SHORT_NAME). 业务需求 :现有日水量表,每条数据记录着一天的用水量,bi_tb_monitor_bi中有一下九个站点 全部SQL如下…

rollup分析函数

表的初始数据&#xff1a; 使用rollup进行汇总之后的数据&#xff1a; select t.first_name,sum(t.salary) from t_test1 tgroup by rollup(t.first_name) 可以改写为&#xff1a; select nvl(t.first_name,total),sum(t.salary) from t_test1 tgroup by rollup(t.first_name…

达梦cube和rollup函数使用

在使用前需要安装达梦数据库&#xff0c;并创建示例库DMHR ● ROLLUP ● 比如获取公司各城市每个部门员工人数分布和薪资分布情况&#xff0c;使用group by rollup的sql样例参考如下&#xff1a; 从结果集中可以看出group by rollup聚合了城市和部门组合&#xff0c;城市组合…

with rollup函数做合计以及行转列

MySQL-with rollup函数运用 _20160930 在博客里http://www.cnblogs.com/Mr-Cxy/p/5898839.html提到了行转列&#xff0c;(http://blog.csdn.net/ybygjy/article/details/41557425)行转列 列转行都有 如果想在下面这个表下面添加一行 总计 数据行SQL代码怎么实现 并且根据9月金…

mysql有rollup函数_MySQL 聚合函数(二)Group By的修饰符——ROLLUP

一、ROLLUP 修饰符的意义 GROUP BY子句允许添加WITH ROLLUP修饰符,该修饰符可以对分组后各组的某个列的结果值进行汇总,并在结果中输出,即提供更高一级的聚合操作。 因此,ROLLUP使您能够使用单个查询在多个分析级别回答问题。例如,ROLLUP可用于为OLAP(在线分析处理)操作提…