Какво е FBX файл?
FBX, FilmBox, е популярен 3D файлов формат, който първоначално е разработен от Kaydara за MotionBuilder. Беше придобит от Autodesk Inc през 2006 г. и сега е един от основните 3D формати за обмен, използвани от много 3D инструменти. FBX се предлага както в двоичен, така и в ASCII файлов формат. Форматът е създаден, за да осигури оперативна съвместимост между приложенията за създаване на цифрово съдържание. Има много налични инструменти за конвертиране от/към FBX файлов формат.
FBX файлов формат - повече информация
FBX е патентован формат и спецификациите за неговия двоичен файлов формат не са налични официално. C++ FBX SDK се предоставя от Autodesk за четене, запис и конвертиране към/от FBX файл. Скрипт за импортиране и експортиране на Python за FBX също е наличен в софтуера на Blender, който не използва FBX SDK.
Текстово-базирана файлова структура
Текстовата файлова структура е дървовидна, документирана с ясно обозначени идентификатори. Състои се от вложен списък от възли, подредени в йерархия, където всеки възел има:
- Идентификатор NodeType (име на клас)
- Кортеж от свойства, свързани с него, елементите на кортежа са обичайните примитивни типове данни: ##float, integer, string## и т.н.
- Списък, който съдържа възли в същия формат (рекурсивно).
Те могат да бъдат представени логически, както следва:
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 Binary \x00 (файл-магия, с 2 интервала в края, след това NULL терминатор).
- Байтове 21 - 22: [0x1A, 0x00]## (неизвестно, но всички наблюдавани файлове показват тези байтове).
- Байтове 23 - 26: unsigned int, номерът на версията. 7300 за версия 7.3 например.
Запис на обект
Заглавката е последвана от запис на обект, който е пълен запис на възел с празно име и празен списък със свойства. Той съдържа рекурсивно цялата формация на файла.
Долен колонтитул
Разделът FBX Footer се намира в края на файла, чието съдържание е неизвестно.
Формати на запис
Записите във FBX файл се категоризират като:
- Записи на възли
- Имотни записи
Формат на запис на възел
Всеки формат на запис на възел е наименуван и има следното оформление на паметта.
Размер (байтове) | Тип дата | Име |
---|---|---|
4 | UInt32 | Крайно отместване |
4 | UInt32 | Брой свойства |
4 | UInt32 | PropertyListLen |
1 | UInt8 | ИмеLen |
NameLength | char | Име |
? | ? | Свойство[n], където n = 0:PropertyListLen |
По избор | ||
? | ? | Вложен списък |
13 | uint8[] | Нулев запис |
където:
EndOffset
е разстоянието от началото на файла до края на записа на възела (т.е. първият байт от това, което следва). Това може да се използва за лесно прескачане на неизвестни или незадължителни записи.NumProperties
е броят на свойствата в кортежа със стойности, свързан с възела. Вложен списък като последен елемент не се брои като собственост.PropertyListLen
е дължината на списъка със свойства. Това е размерът, необходим за съхраняване на ##NumProperties## свойства, който зависи от типа данни на свойствата.NameLen
е дължината на името на обекта в знаци. Единственият случай, когато това е 0, изглежда са списъците от най-високо ниво.Име
е името на обекта. Няма нулево прекъсване.Property[n]
е n-то свойство. За формата вижте свойството на раздел Формат на запис. Свойствата се записват последователно и без подпълване.NestedList
е вложен списък, чието присъствие се обозначава с NULL–запис в самия край.
Съществуването на вложен запис в списък може да се определи чрез проверка дали има останали байтове до достигане на EndOffset. Ако е така, следващият запис на обект трябва да се чете директно след последното свойство. След това записът на обекта следва 13 нула байта, които след това се комбинират с EndOffset. Целта или изискването на записа NULL не е известна и може да сочи към някаква характеристика на формата.
Формат на запис на собственост
Запис на свойство съдържа подробности за свойства, които са част от Node. Запис на свойство има следното оформление на паметта:
Размер (байтове) | Тип данни | Име |
---|---|---|
1 | знак | Код на типа |
? | ? | Данни |
TypeCode представляват кодове на символи, които са подредени в групи, които изискват подобно боравене. TypeCodes могат да бъдат категоризирани в следните типове и 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)
Данните за тип масив са по-сложни и са в следната структура.
Размер (байтове) | Тип данни | Име |
---|---|---|
4 | Uint32 | Дължина на масива |
4 | Uint32 | Кодиране |
4 | Uint32 | CompressedLength |
? | ? | Съдържание |
Специални типове
Следват кодовете на специалните типове.
S: String
R: raw binary data
И двата кода на типа са представени по следния начин:
Размер (байтове) | Тип данни | Име |
---|---|---|
4 | Uin32 | Дължина |
Дължина |
Низът не е завършен с нула и може да съдържа символи \0 (това всъщност се използва в някои свойства на FBX).