.FBX вариант №
FBX, FilmBox — популярный формат 3D-файлов, изначально разработанный Кайдарой для 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 пробелами в конце, затем нулевой терминатор).
- Байты 21 - 22: [0x1A, 0x00]## (неизвестно, но все наблюдаемые файлы показывают эти байты).
- Байты 23 - 26: целое число без знака, номер версии. 7300 для версии 7.3 например.
Запись объекта
За заголовком следует запись объекта, которая представляет собой запись полного узла с пустым именем и пустым списком свойств. Он рекурсивно содержит все формирование файла.
Нижний колонтитул
Раздел нижнего колонтитула FBX находится в конце файла, содержимое которого неизвестно.
Форматы записи
Записи в файле FBX классифицируются как:
- Записи узла
- Записи о собственности
Формат записи узла
Каждый формат записи узла имеет имя и имеет следующую структуру памяти.
Размер (байты) | Тип даты | Имя |
---|---|---|
4 | UInt32 | Смещение конца |
4 | UInt32 | NumProperties |
4 | UInt32 | PropertyListLen |
1 | UInt8 | ИмяДлен |
NameLength | char | Имя |
? | ? | Property[n], где n = 0:PropertyListLen |
Необязательно | ||
? | ? | Вложенный список |
13 | uint8[] | Нулевая запись |
куда:
EndOffset
— это расстояние от начала файла до конца записи узла (т. е. первый байт того, что следует за ним). Это можно использовать для простого пропуска неизвестных или ненужных записей.NumProperties
— это количество свойств в кортеже значений, связанном с узлом. Вложенный список как последний элемент не считается свойством.PropertyListLen
— это длина списка свойств. Это размер, необходимый для хранения свойств ##NumProperties##, который зависит от типа данных свойств.NameLen
— длина имени объекта в символах. Единственный случай, когда это 0, кажется, это списки верхнего уровня.- «Имя» — это имя объекта. Нулевого завершения нет.
Property[n]
— n-ое свойство. Информацию о формате см. в разделе «Формат записи». Свойства записываются последовательно и без заполнения.NestedList
— вложенный список, наличие которого обозначается NULL-записью в самом конце.
Существование записи вложенного списка можно определить, проверив, остались ли байты до достижения EndOffset. Если это так, следующая запись объекта должна считываться сразу после последнего свойства. Затем запись объекта следует за 13 нулевыми байтами, которые затем объединяются с EndOffset. Назначение или требование записи NULL неизвестно и может указывать на некоторую особенность формата.
Формат записи свойства
Запись свойства содержит сведения о свойствах, которые являются частью Node. Запись свойства имеет следующую структуру памяти:
Размер (байты) | Тип данных | Имя |
---|---|---|
1 | char | ТипКод |
? | ? | Данные |
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 | Сжатая длина |
? | ? | Содержание |
Специальные типы
Ниже приведены коды типов специальных типов.
S: String
R: raw binary data
Оба этих TypeCode представлены следующим образом:
Размер (байты) | Тип данных | Имя |
---|---|---|
4 | Uin32 | Длина |
Длина |
Строка не завершается нулем и вполне может содержать символы \0 (на самом деле это используется в некоторых свойствах FBX).