Що таке файл FBX?
FBX, FilmBox, — це популярний формат 3D-файлів, спочатку розроблений Kaydara для MotionBuilder. Він був придбаний Autodesk Inc у 2006 році і зараз є одним із основних форматів обміну 3D, який використовується багатьма інструментами 3D. FBX доступний як у двійковому, так і в форматі ASCII. Формат було створено для забезпечення взаємодії між програмами для створення цифрового контенту. Існує багато інструментів, доступних для конвертації з/у формат файлу FBX.
Формат файлу FBX - Додаткова інформація
FBX є власним форматом, і характеристики його двійкового формату офіційно недоступні. Autodesk надає C++ FBX SDK для читання, запису та перетворення у/з файлу 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 \x00 (чарівний файл, з 2 пробілами в кінці, потім символом NULL).
- Байти 21–22: [0x1A, 0x00]## (невідомо, але всі спостережувані файли показують ці байти).
- Байти 23 - 26: unsigned int, номер версії. 7300 для версії 7.3, наприклад.
Запис об’єкта
За заголовком слідує запис об’єкта, який є повним записом вузла з порожнім ім’ям і порожнім списком властивостей. Він рекурсивно містить усю форму файлу.
Нижній колонтитул
Розділ FBX Footer знаходиться в кінці файлу, вміст якого невідомий.
Формати запису
Записи у файлі FBX класифікуються як:
- Записи вузлів
- Записи власності
Формат запису вузла
Кожен формат запису вузла має назву та має наступний макет пам’яті.
Розмір (байти) | Тип дати | Ім’я |
---|---|---|
4 | UInt32 | Кінцевий зсув |
4 | UInt32 | NumProperties |
4 | UInt32 | PropertyListLen |
1 | UInt8 | NameLen |
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 представляє коди символів, упорядковані в групи, які потребують подібної обробки. Типові коди можна класифікувати за такими типами, і Типовий код може бути одним із кодів символів серед цих типів.
Примітивні типи
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 | Uін32 | Довж |
Довжина |
Рядок не закінчується нулем і цілком може містити символи \0 (це фактично використовується в деяких властивостях FBX).