FBX,FilmBox,是一种流行的3D文件格式,最初由Kaydara为MotionBuilder开发。2006年被Autodesk Inc收购,现已成为许多3D工具所采用的主要3D交换格式之一。FBX 提供二进制和 ASCII 两种格式。该格式的建立旨在实现数字内容创作应用之间的互操作性。有许多工具可用于从FBX文件格式转换或转换。
免费获取fbx格式文件模型

FBX 文件格式 - 更多信息

FBX是一种专有格式,其二进制文件格式的具体规范尚未公开。Autodesk 提供了 C++ FBX SDK,用于读取、写入和从 FBX 文件转换。Blender软件中也提供了一个不使用FBX SDK的Python导入导出脚本。

基于文本的文件结构

基于文本的文件结构是一种树状结构,带有明确命名的标识符。它由一个层级排列的嵌套节点列表组成,每个节点具有:
  • 一个 NodeType 标识符(类名)
  • 与之关联的属性元组,元组元素是常见的原始数据类型:##float、整数、字符串##等。
  • 一个包含相同格式(递归)节点的列表。
这些可以用逻辑方式表示如下:
NodeType: SomeProperty0a, SomeProperty0b, ... , {

 NestedNodeType1 : SomeProperty1a, ...
 NestedNodeType2 : SomeProperty2a, ... , {
 ... Sub-scope
 }

 ...
}
一些标准节点被定义为隐式列表,每个项目由嵌套列表组成。任何打算访问FBX几何的应用程序都必须解析这些内容并赋予其有用的意义。基于文本的FBX文件示例如下:
; FBX ...
; Copyright (C) 1997-2008 ...
; All rights reserved.
; ----------------------------------------------------
FBXHeaderExtension: {
    FBXHeaderVersion: 1003
    FBXVersion: 6000
    CurrentCameraResolution: {
        CameraName: "Model::Producer Perspective"
        CameraResolutionMode: "Window Size"
        CameraResolutionW: 1
        CameraResolutionH: 1
    }
    CreationTimeStamp: {
    ...
    }
}
;Object definitions
;------------------------------------------------------------------
Definitions: {
    Count: 2
    ObjectType: "Model" {
    Count: 2
    }
}
...

FBX文件的二进制文件结构

如前所述,FBX文件格式规范对FBX不公开。由于Blender Foundation实现FBX文件格式时未使用公司提供的SDK,因此关于二进制文件格式的一些细节作为实现的一部分可以获得二进制文件结构的顺序如下:
  • 头部
  • 对象记录
  • 页脚

FBX头部

文件头信息由27字节组成。
  • 字节 0 - 20:Kaydara FBX 二进制 \x00(文件魔法,末尾有 2 个空格,然后是 NULL 终止符)。
  • 字节21 - 22:[0x1A,0x00]##(未知,但所有观察到的文件都显示这些字节)。
  • 字节23 - 26:未签名的int,版本号。比如7.3版本的7300。

对象记录

Header 后面是一个对象记录,该记录是完整节点记录,空名和空属性列表。它递归地包含整个文件形成过程。

页脚

FBX 页脚部分位于文件末尾,而文件内容未知。

唱片格式

FBX文件中的记录被分类为:
  • 节点记录
  • 房产记录

节点记录格式

每个节点记录格式都有名称,并具有以下内存布局。
大小(字节)日期类型名称
4UInt32端偏移
4UInt32NumProperties
4UInt32PropertyListLen
1UInt8名字伦
名称长度查尔名称
??Property[n],其中 n = 0:PropertyListLen
可选
??嵌套列表
13uint8[]空档
其中:
  • EndOffset是文件起始点到节点记录结束点的距离(即下一笔的第一个字节)。这可以用来轻松跳过未知或不必要的记录。
  • NumProperties是与该节点关联的值元组中的属性数量。嵌套列表作为最后一个元素不计入属性。
  • PropertyListLen是财产列表的长度。这是存储 ##NumProperties## 属性所需的大小,具体取决于属性的数据类型。
  • NameLen是对象名称的长度,单位为字符。唯一出现0的似乎是列表的顶层。
  • Name是该对象的名称。没有零终端。
  • Property[n]是第n个性质。关于格式,请参见属性“记录格式”部分。属性按顺序写入,没有填充。
  • NestedList是嵌套列表,其存在由末尾的NULL-记录表示。
通过检查是否还有字节直到到达结束偏移量来确定嵌套列表条目的存在。如果是这样,下一个对象记录应紧接着最后一个属性读取。对象记录随后跟随13个零字节,这些字节随后与结束偏移量结合。NULL条目的或要求尚不清楚,可能指向某种格式特征。

房产记录格式

属性记录包含节点中属性的详细信息。属性记录的内存布局如下:
大小(字节)数据类型名称
1查尔TypeCode
??数据
TypeCode 表示以组形式排列的字符码,需要类似的处理。TypeCode 可以分为以下几类类型,TypeCode 可以是这些类型中的字符代码之一。

原始类型

Y: 2 byte signed Integer
C: 1 bit boolean (1: true, 0: false) encoded as the LSB of a 1 Byte value.
I: 4 byte signed Integer
F: 4 byte single-precision IEEE 754 number
D: 8 byte double-precision IEEE 754 number
L: 8 byte signed Integer
原始标量类型记录中的数据正是该值的二进制表示,按小端序字节顺序表示。

数组类型

f: Array of 4 byte single-precision IEEE 754 number
d: Array of 8 byte double-precision IEEE 754 number
l: Array of 8 byte signed Integer
i: Array of 4 byte signed Integer
b: Array of 1 byte Booleans (always 0 or 1)
数组类型的数据更为复杂,结构如下。
大小(字节)数据类型名称
4Uint32数组长度
4Uint32编码
4Uint32压缩长度
??目录

特殊类型

以下是特殊类型类型代码。
S: String
R: raw binary data
这两个类型代码的表示方式如下:
大小(字节)数据类型名称
4Uin32长度
长度
该字符串不是零终结的,且可能包含 \0 字符(这实际上用于某些 FBX 属性)。