1. FBX概述
FBX是Autodesk公司开发的一种通用3D文件格式,可以在不同的3D软件之间进行交换和共享。FBX文件包含了3D模型的几何形状、材质、动画、灯光、相机和其他相关信息。
如果想在当前流行的 3D 编辑器(如 Maya 和 3DS Max)与 3D 体验引擎(如 Unity、Unreal Engine)之间传输数据,则应使用 FBX 文件格式。这是这个文件格式主要的设计目的。
2. 优缺点
FBX模型具有以下几个方面的优势:
1. 跨平台兼容性:FBX文件可以在不同的3D软件之间进行交换和共享,包括Autodesk Maya、3ds Max、Blender、Unity、Unreal Engine等。这使得开发人员可以在不同的软件之间自由地转换和共享3D模型和场景。
2. 支持多种数据类型:FBX文件支持几何、材质、动画、灯光、相机等多种数据类型,可以完整地保存3D模型和场景的各个方面。这使得开发人员可以在不同的软件之间自由地转换和共享3D模型和场景。
3. 高效的数据压缩:FBX文件使用高效的数据压缩算法,可以将3D模型和场景的数据压缩到较小的文件大小。这使得开发人员可以更快地加载和处理3D模型和场景。
4. 支持多种操作:FBX文件支持多种操作,包括动画、物理模拟、碰撞检测等。这使得开发人员可以在不同的软件之间自由地转换和共享3D模型和场景,并进行各种操作。
5. 可扩展性:FBX文件是一种可扩展的文件格式,可以通过添加自定义属性和元数据来扩展其功能。这使得开发人员可以根据自己的需求来扩展FBX文件的功能。
FBX 格式的最大缺点: 它是一种封闭格式。访问 FBX 文件中数据的唯一官方方法是使用官方 SDK。
3. 模型数据详解
FBX有二进制和ASCII码两种格式,在ASCII码格式下我们可以直接看到里面储存的数据。下面以一个简单的长方体模型为例,介绍模型的每项数据及其含义。
3.1 头部数据
; FBX 7.4.0 project file
; ----------------------------------------------------
FBXHeaderExtension: {
FBXHeaderVersion: 1003
FBXVersion: 7400
CreationTimeStamp: {
Version: 1000
Year: 2023
Month: 6
Day: 13
Hour: 14
Minute: 45
Second: 31
Millisecond: 644
}
Creator: "FBX SDK/FBX Plugins version 2020.3.1"
SceneInfo: "SceneInfo::GlobalInfo", "UserData" {
Type: "UserData"
Version: 100
MetaData: {
Version: 100
Title: ""
Subject: ""
Author: ""
Keywords: ""
Revision: ""
Comment: ""
}
Properties70: {
P: "DocumentUrl", "KString", "Url", "", "C:\Users\xxx\Desktop\tes.fbx"
P: "SrcDocumentUrl", "KString", "Url", "", "C:\Users\xxx\Desktop\tes.fbx"
P: "Original", "Compound", "", ""
P: "Original|ApplicationVendor", "KString", "", "", "Autodesk"
P: "Original|ApplicationName", "KString", "", "", "3ds Max"
P: "Original|ApplicationVersion", "KString", "", "", "2022"
P: "Original|DateTime_GMT", "DateTime", "", "", "13/06/2023 06:45:31.643"
P: "Original|FileName", "KString", "", "", "C:\Users\xxx\Desktop\tes.fbx"
P: "LastSaved", "Compound", "", ""
P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk"
P: "LastSaved|ApplicationName", "KString", "", "", "3ds Max"
P: "LastSaved|ApplicationVersion", "KString", "", "", "2022"
P: "LastSaved|DateTime_GMT", "DateTime", "", "", "13/06/2023 06:45:31.643"
P: "Original|ApplicationActiveProject", "KString", "", "", "C:\Users\xxx\Documents\3ds Max 2022"
}
}
}
这是FBX文件的头部扩展数据,其中包含了以下信息:
- FBXHeaderVersion: FBX文件头部版本号,这里是1003。
- FBXVersion: FBX文件版本号,这里是7400。
- CreationTimeStamp: FBX文件创建时间戳,包括年、月、日、时、分、秒和毫秒。
- Creator: 创建FBX文件的软件和插件版本号。
- SceneInfo: 场景信息,包括全局信息和用户数据。
- Type: 用户数据类型,这里是"UserData"。
- Version: 用户数据版本号,这里是100。
- MetaData: 用户数据的元数据,包括标题、主题、作者、关键字、修订版本和注释。
- Properties70: 用户数据的属性,包括文档URL、源文档URL、原始应用程序供应商、原始应用程序名称、原始应用程序版本、原始日期时间、原始文件名、最后保存的应用程序供应商、最后保存的应用程序名称、最后保存的应用程序版本、最后保存的日期时间和原始应用程序活动项目。
这些数据提供了有关FBX文件的详细信息,包括文件版本、创建时间、创建者、场景信息和用户数据。它们可以帮助开发人员了解FBX文件的来源和属性,以便更好地处理和使用它们。
3.2 全局设置数据
GlobalSettings: {
Version: 1000
Properties70: {
P: "UpAxis", "int", "Integer", "",2
P: "UpAxisSign", "int", "Integer", "",1
P: "FrontAxis", "int", "Integer", "",1
P: "FrontAxisSign", "int", "Integer", "",-1
P: "CoordAxis", "int", "Integer", "",0
P: "CoordAxisSign", "int", "Integer", "",1
P: "OriginalUpAxis", "int", "Integer", "",2
P: "OriginalUpAxisSign", "int", "Integer", "",1
P: "UnitScaleFactor", "double", "Number", "",1
P: "OriginalUnitScaleFactor", "double", "Number", "",2.54
P: "AmbientColor", "ColorRGB", "Color", "",0,0,0
P: "DefaultCamera", "KString", "", "", "Producer Perspective"
P: "TimeMode", "enum", "", "",6
P: "TimeProtocol", "enum", "", "",2
P: "SnapOnFrameMode", "enum", "", "",0
P: "TimeSpanStart", "KTime", "Time", "",0
P: "TimeSpanStop", "KTime", "Time", "",153953860000
P: "CustomFrameRate", "double", "Number", "",-1
P: "TimeMarker", "Compound", "", ""
P: "CurrentTimeMarker", "int", "Integer", "",-1
}
}
这是FBX文件的全局设置数据,其中包含了以下信息:
- Version: 全局设置版本号,这里是1000。
- Properties70: 全局设置的属性,部分类似属性如UpAxis和FrontAxis只介绍一个。
- UpAxis: 上轴属性,表示FBX文件中的上轴方向。这里的值为2,表示上轴方向为Z轴。
- UpAxisSign: 上轴符号属性,表示FBX文件中的上轴方向的符号。这里的值为1,表示上轴方向为正方向。
- CoordAxis: 坐标轴属性,表示FBX文件中的坐标轴方向。这里的值为0,表示坐标轴方向为X、Y、Z轴。
- CoordAxisSign: 坐标轴符号属性,表示FBX文件中的坐标轴方向的符号。这里的值为1,表示坐标轴方向为正方向。
- UnitScaleFactor: 单位比例因子属性,表示FBX文件中的单位比例因子。这里的值为1,表示FBX文件中的距离单位为厘米。
- AmbientColor: 环境颜色属性,表示FBX文件中的环境光颜色。这里的值为0,0,0,表示环境光颜色为黑色。
- DefaultCamera: 默认相机属性,表示FBX文件中的默认相机。这里的值为"Producer Perspective",表示默认相机为FBX生产者透视相机。
- TimeMode: 时间模式属性,表示FBX文件中的时间单位。这里的值为6,表示时间单位为帧。
- TimeProtocol: 时间协议属性,表示FBX文件中的时间协议。这里的值为2,表示时间协议为NTSC。
- SnapOnFrameMode: 帧捕捉模式属性,表示FBX文件中的帧捕捉模式。这里的值为0,表示帧捕捉模式为关闭。
- TimeSpanStart: 时间跨度开始属性,表示FBX文件中的时间跨度开始时间。这里的值为0,表示时间跨度开始时间为0帧。
- TimeSpanStop: 时间跨度结束属性,表示FBX文件中的时间跨度结束时间。这里的值为153953860000,表示时间跨度结束时间为153953860000帧。
- CustomFrameRate: 自定义帧速率属性,表示FBX文件中的自定义帧速率。这里的值为-1,表示没有自定义帧速率。
- TimeMarker: 时间标记属性,表示FBX文件中的时间标记。
这些数据提供了有关FBX文件的全局设置信息,包括坐标轴方向、单位比例因子、时间模式和时间跨度等。它们可以帮助开发人员了解FBX文件的坐标系、单位和时间轴设置,以便更好地处理和使用它们。例如,上轴和前轴属性可以告诉开发人员FBX文件的坐标系方向,单位比例因子可以告诉开发人员FBX文件中的距离单位,时间模式和时间跨度可以告诉开发人员FBX文件中的时间单位和时间范围。
3.3 对象动画层数据
ObjectType: "AnimationLayer" {
Count: 1
PropertyTemplate: "FbxAnimLayer" {
Properties70: {
P: "Weight", "Number", "", "A",100
P: "Mute", "bool", "", "",0
P: "Solo", "bool", "", "",0
P: "Lock", "bool", "", "",0
P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8
P: "BlendMode", "enum", "", "",0
P: "RotationAccumulationMode", "enum", "", "",0
P: "ScaleAccumulationMode", "enum", "", "",0
P: "BlendModeBypass", "ULongLong", "", "",0
}
}
}
这些是动画层对象类型的数据,包括权重、静音、独奏、锁定、颜色、混合模式、旋转累积模式、缩放累积模式和混合模式旁路等属性。以下是每个属性的解释:
- Weight: 权重属性,表示动画层的权重。这里的值为100,表示动画层的权重为100%。
- Mute: 静音属性,表示动画层是否静音。这里的值为0,表示动画层未静音。
- Solo: 独奏属性,表示动画层是否独奏。这里的值为0,表示动画层未独奏。
- Lock: 锁定属性,表示动画层是否锁定。这里的值为0,表示动画层未锁定。
- Color: 颜色属性,表示动画层的颜色。这里的值为0.8,0.8,0.8,表示动画层的颜色为灰色。
- BlendMode: 混合模式属性,表示动画层的混合模式。这里的值为0,表示动画层的混合模式为标准混合模式。
- RotationAccumulationMode: 旋转累积模式属性,表示动画层的旋转累积模式。这里的值为0,表示动画层的旋转累积模式为相加。
- ScaleAccumulationMode: 缩放累积模式属性,表示动画层的缩放累积模式。这里的值为0,表示动画层的缩放累积模式为相加。
- BlendModeBypass: 混合模式旁路属性,表示动画层的混合模式旁路。这里的值为0,表示动画层的混合模式旁路为关闭。
这些属性用于控制动画层的行为和外观。例如,权重属性可以控制动画层在混合动画时的权重,静音属性可以控制动画层是否播放声音,颜色属性可以控制动画层的颜色,混合模式属性可以控制动画层的混合模式等。这些属性可以帮助开发人员控制动画层的行为和外观,以便更好地实现动画效果。
3.4 对象几何数据
Geometry: 2544941990176, "Geometry::", "Mesh" {
Properties70: {
P: "Color", "ColorRGB", "Color", "",0.694117647058824,0.345098039215686,0.105882352941176
}
Vertices: *24 {
a: -5.73998689651489,-20.0938777923584,0,5.73998689651489,-20.0938777923584,0,-5.73998689651489,20.0938777923584,0,5.73998689651489,20.0938777923584,0,-5.73998689651489,-20.0938777923584,10.2069730758667,5.73998689651489,-20.0938777923584,10.2069730758667,-5.73998689651489,20.0938777923584,10.2069730758667,5.73998689651489,20.0938777923584,10.2069730758667
}
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
}
Edges: *12 {
a: 0,1,2,3,4,5,6,7,9,11,13,17
}
GeometryVersion: 124
LayerElementNormal: 0 {
Version: 102
Name: ""
MappingInformationType: "ByPolygonVertex"
ReferenceInformationType: "Direct"
Normals: *72 {
a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0
}
NormalsW: *24 {
a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
}
}
LayerElementUV: 0 {
Version: 101
Name: "UVChannel_1"
MappingInformationType: "ByPolygonVertex"
ReferenceInformationType: "IndexToDirect"
UV: *48 {
a: 1,0,0,0,1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1
}
UVIndex: *24 {
a: 0,2,3,1,4,5,7,6,8,9,11,10,12,13,15,14,16,17,19,18,20,21,23,22
}
}
Layer: 0 {
Version: 100
LayerElement: {
Type: "LayerElementNormal"
TypedIndex: 0
}
LayerElement: {
Type: "LayerElementUV"
TypedIndex: 0
}
}
}
这是FBX文件中的几何体对象类型数据,包括顶点、多边形顶点索引、边、法线、UV等属性。以下是每个属性的解释:
- Vertices: 顶点属性,表示几何体的顶点坐标。这里的值为三维数据集的8个顶点(3个值代表一个顶点三维坐标)。
- PolygonVertexIndex: 多边形顶点索引属性,表示几何体的多边形顶点索引。这里的值为24个多边形顶点索引。其中的负值代表多边形结束,每隔3个出现负值代表是个三角形面,每隔4个出现负值代表是四边形面。
- Edges: 边属性,表示几何体的边。这里的值为12个边。
- LayerElementNormal: 法线属性,表示几何体的法线。
- Normals:法线向量。这里的72是6个四边形的每个四边形顶点的24个法线(3个值代表一个法向量)。
- NormalsW:法线权重。
- LayerElementUV: UV属性,表示几何体的UV坐标。
- Name: 名称属性,表示UV属性的名称。这里的值为"UVChannel_1"。
- MappingInformationType: 映射信息类型属性,表示UV坐标的映射方式。这里的值为"ByPolygonVertex",表示每个多边形顶点都有一个对应的UV坐标。
- ReferenceInformationType: 引用信息类型属性,表示UV坐标的索引方式。这里的值为"IndexToDirect",表示UV坐标使用索引方式。
- UV: UV坐标属性,表示几何体的UV坐标。这里的值为24个多边形顶点的48个UV坐标(2个值代表一个顶点二维坐标)。
- UVIndex: UV索引属性,表示几何体的UV坐标索引。这里的值为24个UV索引,与多边形顶点索引对应。
- Layer: 层属性,表示几何体的层。这里的值表示模型包含法线和UV的层。
着重解释下部分重要属性:
在FBX模型中,PolygonVertexIndex是一个数组,它存储了多边形的顶点索引。具体来说,它指定了每个多边形的顶点在顶点数组中的索引位置。例如,如果一个三角形有三个顶点,那么PolygonVertexIndex数组中将有三个值,分别表示这三个顶点在顶点数组中的索引位置。这个数组的作用是帮助3D渲染引擎正确地绘制多边形,因为它告诉引擎哪些顶点应该连接在一起形成多边形。
MappingInformationType属性表示UV坐标、法线等属性的映射方式。常见的属性值设置有以下几种:
"ByControlPoint": 按控制点映射,即每个控制点都有一个对应的属性值。
"ByPolygonVertex": 按多边形顶点映射,即每个多边形顶点都有一个对应的属性值。
"ByPolygon": 按多边形映射,即每个多边形都有一个对应的属性值。
"ByEdge": 按边映射,即每个边都有一个对应的属性值。
"AllSame": 所有属性值相同。
其中,"ByControlPoint"和"ByPolygonVertex"是最常用的两种映射方式。"ByControlPoint"适用于需要对控制点进行操作的情况,如平滑法线计算;"ByPolygonVertex"适用于需要对多边形顶点进行操作的情况,如纹理映射。
ReferenceInformationType属性表示UV坐标、法线等属性的索引方式。常见的属性值设置有以下几种:
"Direct": 直接索引,即每个属性值都直接存储在属性数组中。
"IndexToDirect": 索引到直接,即每个属性值都通过索引引用属性数组中的值。
其中,"Direct"适用于属性值数量较少的情况,可以直接存储在属性数组中;"IndexToDirect"适用于属性值数量较多的情况,可以通过索引引用属性数组中的值,节省存储空间。
需要注意的是,不同的属性类型可能支持不同的ReferenceInformationType属性值。例如,法线属性只支持"Direct"索引方式,而UV属性通常使用"IndexToDirect"索引方式。
3.5 其他重要属性
其余部分中也有着一些重要属性,下面简略介绍下:
- Shading: 着色属性,表示模型对象的着色方式。这里的值为"T",表示使用纹理着色。
- Culling: 背面剔除属性,表示模型对象的背面剔除方式。这里的值为"CullingOff",表示不进行背面剔除。
- Lcl Translation:表示模型对象的平移属性。Lcl是Local的缩写,表示该属性是相对于模型对象的本地坐标系而言的。与之类似的还有Lcl Rotation、Lcl Scaling分别代表模型相对于本地坐标系的旋转和缩放属性。
- Geometric Translation:表示整个场景或模型对象的平移属性,与Lcl Translation属性不同,它是相对于FBX文件的全局坐标系而言的。与之类似的还有Geometric Rotation、Geometric Scaling。