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)頁腳
位於文件末尾