FBX
FBX是一种流行的3D文件格式,由Kaydara为MotionBuilder开发,于2006年被Autodesk公司收购,是许多3D工具使用的主要3D交换格式之一
FBX有二进制和基于文本(ASCII)文件格式
(1)基于文本的文件结构
基于文本的文件结构是树状结构,带有明确命名的标识符,由按层次结构排列的节点嵌套列表组成
每个节点具有
NodeType标识符(类名) 与元组相关的属性,元组元素是通常的原始数据类型:## float,integer,string ##等。 包含相同格式(递归)的节点的列表
逻辑表示为
NodeType: SomeProperty0a, SomeProperty0b, ... , { NestedNodeType1 : SomeProperty1a, ... NestedNodeType2 : SomeProperty2a, ... , { ... Sub-scope } ... }
标准节点
FBXHeaderExtension:{...}
GlobalSettings: {...}
Documents:{...}
Definitions:{...}
Connections:{...}
...
eg:
; FBX 7.2.0 project file ; Copyright (C) 1997-2010 Autodesk Inc. and/or its licensors. ; All rights reserved. ; ---------------------------------------------------- FBXHeaderExtension: { FBXHeaderVersion: 1003 FBXVersion: 7200 } ; Object properties ;------------------------------------------------------------------ Objects: { Geometry: 1000, "Geometry::", "NurbsCurve" { GeometryVersion: 124 Type: "NurbsCurve" NurbsCurveVersion: 100 Order: 3 Dimension: 3 Form: "Open" Rational: 1 Points: *32 { a: 10,20,0,1, 10,20,10,1, 0,20,10,1, -10,20,10,1, -10,20,0,1, -10,20,-10,1, 0,20,-10,1, 10,22,-10,1 } KnotVector: *11 { a: 0,0,0,0.17,0.33,0.5,0.67,0.83,1,1,1 } } …… Model: 10, "Model::Layer 01", "Null" { } Model: 100, "Model::Object_1", "NurbsCurve" { } …… } ; Object connections ;------------------------------------------------------------------ Connections: { ;Model::Layer 01, Model::RootNode C: "OO",10,0 ;Model::Object_1, Model::Layer 01 C: "OO",100,10 ;Geometry::, Model::Object_1 C: "OO",1000,100 …… }
(2)二进制文件结构
1)标头
文件头信息由27个字节组成
Bytes 0 - 20: Kaydara FBX Binary \x00 (file-magic, ,最后有2个空格,然后是一个NULL终止符). Bytes 21 - 22: [0x1A, 0x00]## (未知,但所有观察到的文件都显示这些字节). Bytes 23 - 26: unsigned int, 版本号。例如,版本7.3的7300.
2)对象记录
对象记录是具有空名称和空属性列表的完整节点记录
它递归包含整个文件格式
记录分为
<1>Node 记录
大小 (Bytes) | 数据类型 | 名称 | 说明 |
---|---|---|---|
4 | UInt32 | EndOffset | 是从文件开头到节点记录结尾的距离 |
4 | UInt32 | NumProperties | 是与节点关联的值元组tuple中的属性数 |
4 | UInt32 | PropertyListLen | 是属性列表的长度 |
1 | UInt8 | NameLen | 是对象名称的长度,以字符为单位 |
NameLength | char | Name | 是对象的名称 |
? | ? | Property[n], where n = 0:PropertyListLen | 是第n 个属性 |
Optional | |||
? | ? | NestedList | 是嵌套列表 |
13 | uint8[] | Null-Record |
<2>Property 记录
大小 (Bytes) | 数据类型 | 名称 |
---|---|---|
1 | char | TypeCode |
? | ? | Data |
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
基于该类型的data是该值的二进制表示形式
数组类型
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)
基于该类型的data更复杂,结构为
大小(字节) | 数据类型 | 名称 |
---|---|---|
4 | Uint32 | 数组长度 |
4 | Uint32 | 编码方式 |
4 | Uint32 | 压缩长度 |
? | ? | 内容 |
特殊类型
S: String
R: raw binary data
这两种TypeCode表示为
大小(字节) | 数据类型 | 名称 |
---|---|---|
4 | Uin32 | 长度 |
长度 |
3)页脚
位于文件末尾