ファイル構造

FBX バイナリ形式のデータは、先頭から順に以下のような構造になっている。

内容サイズ補足
マジックナンバー23 bytes
FBX バージョン4 bytes
トップレベルノード(可変、0個以上)可変サイズ
ノード終了マーカー13 or 25 bytesFBX 7.4 までは13バイト、 FBX 7.5 以降は25バイト
フッタ116 bytes
パディング0 〜 15 bytesコンテンツの本体。可変サイズ
フッタ24 bytes全て 0x00
FBX バージョン4 bytesヘッダでの FBX バージョンと同内容
フッタ3120 bytes全て 0x00
フッタ416 bytes

パディングが適切なサイズで挿入されていれば、ファイル全体は必ず16の倍数の長さを持つ。

マジックナンバー

FBX バイナリ形式は、ファイル先頭に23バイトのマジックバイナリ [4b 61 79 64 61 72 61 20 46 42 58 20 42 69 6e 61 72 79 20 20 00 1a 00] を持つ。 文字列で表現すると Kaydara FBX Binary \x00\x1a\x00 のようになるため、印字可能ではないが ASCII の範囲内で表現できる。 (Binary のあとに半角空白 \x20 が2つ続くことに留意せよ。)

$ hexdump -C sample-74.fbx --length 23
00000000  4b 61 79 64 61 72 61 20  46 42 58 20 42 69 6e 61  |Kaydara FBX Bina|
00000010  72 79 20 20 00 1a 00                              |ry  ...|
00000017
$

なお Blender の開発者による情報では、最初の21バイトをマジックバイナリ、次の2バイト ([1a 00]) を不明な情報としている。 どのような理由でこう解釈したかは不明だが、実用上は最初の23バイトをまとめてマジックバイナリであると解釈して問題ない。

FBX バージョン

マジックナンバーに続けて、 FBX バージョンが4バイトの整数 (u32 型)で表現される。

$ : 以下は FBX 7.4 のファイルの例
$ hexdump -C sample-74.fbx --skip 23 --length 4
00000017  e8 1c 00 00                                       |....|
0000001b
$

バージョンと値の対応は以下のようになっている。

バージョン値 (10進数)バイナリ表現
7.37300[84 1c 00 00]
7.47400[e8 1c 00 00]
7.57500[4c 1d 00 00]

バージョン x.y は 1000 × x + 100 × y で表現されているようである。 100未満の桁が利用されている例は見たことがないため、使われているかは不明。

トップレベルノード

ノードを0個以上並べたもの。 この個数や長さを先頭から読んで事前に知ることはできない。

ノードについては『ノード』節で解説する。

ノード終了マーカー

FBX 7.4 までは13バイトの、 FBX 7.5 以降では25バイトの 0x00 を並べたもの。 これはトップレベルノード(の列)の終了を意味するマーカーである。

このマーカーはファイル中に明示されない暗黙のルートノードの終了マーカーとして捉えることができる。 詳細は『ノード』節で解説する。

フッタ1

16バイトのデータ。 値についても用途についても詳細は不明だが、規則性が見られる。

このフッタの値は、以下のようなビットパターンを持っている。 (x の部分は 0 から f までの任意の4ビット。)

fx bx ax 0x dx cx dx 6x bx 7x fx 8x 1x fx 2x 7x

すべてのバイトについて上位4ビットが固定されているのが特徴的である。 実際に観測した例としては、以下のようなデータがある。 (なお、ここでは FBX SDK から出力された可能性の高いデータのみを挙げる。)

FBX 7.4:

fa bc ae 0a d7 ca d3 66 b6 75 f8 86 1a fe 2a 78
fa bc a8 0c d6 c0 dc 60 b7 7c f4 86 1f f7 26 78
fa bc a9 0b d0 c0 dd 67 b1 7c f4 86 1f f7 26 78

FBX 7.3:

fa bc aa 0c d4 c0 dd 65 b1 78 f1 82 1a f3 23 7c
fa bc ab 0f d6 c0 dc 66 b3 78 f1 82 1a f3 23 7c

上位2バイトの [fa bc] や、末尾バイトの [78][7c] などを見るに、下位4ビットについても完全な乱数ではなく何らかの規則が存在する可能性は高い。

このフッタを読み飛ばしても、データの解釈に支障はない。

パディング

次のデータであるフッタ2の開始を16バイト境界で整列するためのパディング。 0〜15バイトで可変長。

Blender 2.72b の FBX プラグインは、このパディングを誤った長さで出力することがある。

フッタ2

4バイトの 0x00 である。 用途や意味は不明。

正しくパディング が挿入されていれば、16の倍数位置から始まる。

FBX バージョン

ヘッダ部分の FBX バージョンと全く同じ4バイトのデータ。

フッタ3

120バイトの 0x00 である。 用途や意味は不明。

フッタ4

16バイトの固定データ。 内容は [f8 5a 8c 6a de f5 d9 7e ec e9 0c e3 75 8f 29 0b] である。