Описание бинарного формата b3D
#
Date: 2018.08 | Version: 0.1 | Авторы: Юрий Гладышенко, Александр ЕвдокимовГлоссарий
integer - тип данных. Целое положительное число, размер в файле 4 байта. В файлах игры не встречаются значения больше 2^16. В integer, например, хранятся количество элементов массива и индексы координат.
float - тип данных, нецелое число, размер в файле 4 байта. Во float, например, хранятся координаты объектов в игре.
string - тип данных, строка, размер которой в файле всегда равен 32 байта.
array - последовательность элементов, всегда предваряется переменной типа integer, содержащей количество элементов.
-TODO-
Ссылки
- Шаблон формата b3D для hex редактора 010 Editor. Открыть B3D.bt
#
Оглавление1. Введение
3. Секции
3.1 Заголовок файла
3.3 Блоки данных
Приложение 1. Типы объектов
Приложение 2. Файлы игры
Приложение 3. Название объектов
#
1. ВведениеЭтот документ описывает структуру формата файла b3D, используемого в игре Дальнобойщики 2 Второе издание (версия 8). Формат b3D содержит описание трехмерных моделей, используемых в игре, параметров освещения игрового уровня, а также некоторых объектов логики игры и данные моделей коллизий.
Все переменные, перечисленные в таблицах, показаны в порядке их следования в файле.
#
2. Общая структура форматаФормат b3D разделен на 3 основные секции (см Табл. 1).
#
Таблица 1. Общая Структура№ | Секция | Ссылки |
---|---|---|
1 | Заголовок файла | См. Таблица 2 |
2 | Список материалов | См. Таблица 3 |
Идентификатор начала секции | См. Таблица 6 | |
3 | Блоки данных | См. Таблица 5 |
Идентификатор конца секции | См. Таблица 6 |
#
3. Секции#
3.1 Заголовок файлаФайл формата b3D начинается с сигнатуры, строки размером 4 байта состоящей из трех символов с завершающим нулем на конце "b3D" (0x62336400). Далее располагается таблица размеров и смещений секций файла. Все значения размеров в таблице уменьшены в 4 раза, это возможно поскольку размеры всех переменных, которые хранятся в b3D файлах, кратны 4ем.
#
Таблица 2. Структура заголовка файла№ | Тип данных | Описание | Значение |
---|---|---|---|
1 | Сигнатура файла | "b3d." | |
2 | integer | [ Размер файла в байтах ] / 4 | |
3 | integer | [ Смещение секции со списком используемых материалов ] / 4 | 6 |
4 | integer | [ Размер секции со списком материалов (1ая секция) ] / 4 | |
5 | integer | [ Смещение секции с блоками данных (третья секция) ] / 4 | |
6 | integer | [ Размер секции с блоками данных (третья секция) в байтах ] / 4 |
#
3.2 Список материаловСписок материалов представляет из себя массив элементов в виде строки, которая содержит название материала (См. Таблица 4). Список начинается с целочисленной переменной хранящей количество материалов (См. Таблица 3). Сами материалы хранятся отдельно в .res файлах (См. Формат RES/RMP).
#
Таблица 3. Общая структура секции списка материалов№ | Тип данных | Описание | Ссылки |
---|---|---|---|
1 | integer | Количество материалов | |
2 | array | Список названий материалов | См. Таблица 4 |
#
Таблица 4. Формат элемента списка материаловРазмер | Тип данных | Описание |
---|---|---|
32 байта | string | Имя материала |
#
3.3 Блоки данных#
3.3.1 Общая структураВ b3D используется единый формат хранения блока данных (См. Таблица 5 ). Блок имеет идентификатор начала (333 в десятичной форме записи) и идентификатором конца блока (555), а также иногда специальный идентификатор 444 (См. Таблица 6 ). После открывающего идентификатора следует заголовок блока, затем параметры блока, а также (при наличии) секция вложенных блоков.
#
Таблица 5. Общая структура блока данных№ | Описание | Ссылки |
---|---|---|
Идентификатор начала блока | См. Таблица 6 | |
1 | Заголовок блока | См. Таблица 7 |
2 | Параметры | См. Пункт 3.3.2. Параметры блоков |
3 | Вложенные блоки данных | См. Таблица 9 |
Идентификатор конца блока | См. Таблица 6 |
Идентификаторы 111 и 222 присутствуют в единичных экземплярах перед секции блоков данных в конце файла b3D соответственно. Идентификаторы 333 и 555 есть перед каждым блоком и в его конце соответственно. Идентификатор 444 присутствует в начале, а также в конце некоторых блоков.
#
Таблица 6. Идентификаторы№ | Описание | Значение в десятичной форме |
---|---|---|
1 | Начало секции с блоками данных | 111 |
2 | Конец секции с блоками данных | 222 |
3 | Начало одного блока | 333 |
4 | Разделитель переключаемых блоков | 444 |
5 | Конец одного блока | 555 |
Заголовок блока содержит два поля: название блока и тип блока. Именование блоков, применяемое в игре, приведено в приложениях.
#
Таблица 7. Заголовок блока данных№ | Тип данных | Описание | Ссылки |
---|---|---|---|
1 | string | Название блока | См. Приложение 3 |
2 | integer | Тип блока | См. Таблица 8 |
Все блоки могут быть разделены на две большие группы: с вложенными блоками и без. Первые содержат в своей структуре дополнительные блоки, вторые не имеют.
#
Таблица 8. Типы блоковНомер блока | Описание | Параметры |
---|---|---|
0 | Пустой блок. | См. Таблица 10 |
1 | Пустой блок. | См. Таблица 11 |
2 | Тип: Групповой блок. | |
4 | Тип: Групповой блок. Содержит вложенные блоки для хранения и отображения информации об объектах инфраструктуры дороги: дорожные знаки, радары, светофоры, фонари. При соприкосновении с моделью автомобиля эти объекты могут быть частично или полностью повреждены. | См. Таблица 13 |
5 | Тип: Групповой блок. Содержит вложенные блоки для хранения и отображения информации об объектах: строения, внешняя и внутренняя модели транспорта, дороги, стоянки, поверхность земли, холмы и скалы, а также модели коллизий этих и других объектов. | См. Таблица 14 |
6 | Тип: Групповой блок. Тоже, что тип 7. Присутствует только в Дальнобойщики 1. | См. Таблица 14 |
7 | Тип: Групповой блок. Содержит информацию о вершинах, а также текстурных координатах модели. Содержит вложенные блоки типа 8 или другие. | |
8 | Тип: Простой блок. Содержит информацию об индексах полигонов и текстурных координат модели. | |
9 | Тип: Групповой блок. Триггер. | |
10 | Тип: Групповой блок. Содержит параметры LOD моделей. | |
12 | Тип: Групповой блок. | |
13 | Тип: Простой блок. Триггер. | |
14 | Тип: Простой блок. Связан с автомобилями. | |
16 | Тип: Простой блок. | |
17 | Тип: Простой блок. | |
18 | Тип: Простой блок. Связывает два блока. | |
19 | Тип: Групповой блок. Блок содержит вложенные блоки для отображения объектов, по которым транспорт может перемещаться: дорога, бездорожье, объекты природы, т.н. комнаты (room). | |
20 | Тип: Одиночный блок. "Плоская" модель коллизии. | |
21 | Тип: Групповой блок. Содержит вложенные блоки для отображения специальных объектов: людей, деревья, ключи, а также объекты освещение. | |
23 | Тип: Простой блок. "Объемная" модель коллизии. | |
24 | Тип: Групповой блок. Содержит матрицу трансформации объектов для перевода координат объекта в координаты пространства игрового мира. | |
25 | Тип: Звуковой объект. | |
28 | Тип: Простой блок. Тоже, что тип 8. | |
29 | Тип: Групповой блок. | |
30 | Тип: Портал. Представляет собой невидимый полигон высотой 120, который соединяет соседние комнаты (room). | |
31 | Тип: Простой блок. | |
33 | Тип: Групповой блок. Блок для хранения данных объектов освещения. | |
34 | Тип: Простой блок. | |
35 | Тип: Простой блок. Тоже, что тип 37. | |
36 | Тип: Простой блок. Тоже, что тип 37. | |
37 | Тип: Групповой блок. Тоже, что тип 8. | |
39 | Тип: Skybox. | |
40 | Тип: Простой блок. Блок для специальных объектов-генераторов, которые создаются динамически при загрузке игры: деревьев ($$treegenerator), свечения объектов ($$dynamicGlow), людей ($$people). |
Вложенные блоки хранятся последовательно, начиная с переменной отображающей их количество.
#
Таблица 9. Вложенные блоки№ | Тип данных | Описание | Ссылка |
---|---|---|---|
1 | integer | Количество блоков | |
2 | array | Блоки |
#
3.3.2 Параметры блоковДалее описываются параметры каждого из типов блоков данных (См. Таблица 5 и Таблица 8).
Блок 0
Самый первый блок в файле. Данный тип блок не хранит в себе вложенных блоков. Не используется в игре, хотя присутствует в файлах.
#
Таблица 10. Блок 0№ | Тип данных/размер | Описание | Значение |
---|---|---|---|
1 | 40 байт | Пустые данные | 0 |
10 | float | Неизвестная переменная | 1 |
11 | 4 байта | Пустые данные | 0 |
Блок 1
В игре Дальнобойщики 2 присутствует только в файле "Common.d3D". Данный тип блок не хранит в себе вложенных блоков. Не используется в игре, хотя присутствует в файлах.
#
Таблица 11. Блок 1№ | Тип данных | Описание | Значение |
---|---|---|---|
1 | string | Название | |
2 | string | Название |
Блок 2
Присутствует только в файлах "Trucks.d3D" ($$$Group_1381_truck), "ce.d3D" (room_ce01), "dq.d3D" (lep12).
#
Таблица 12. Блок 2№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) X,Y,Z | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | float | Неизвестная переменная | 1 |
6 | float | Неизвестная переменная | 0 |
7 | float | Неизвестная переменная | 0 |
8 | float | Неизвестная переменная | 0 |
Вложенные блоки | |||
9 | integer | Количество блоков | |
10 | array | Блоки |
Блок 3
#
Таблица 1. Блок 3№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) X,Y,Z | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
Вложенные блоки | |||
5 | integer | Количество блоков | |
6 | array | Блоки |
Блок 4
#
Таблица 13. Блок 4№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) X,Y,Z | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | string | Название блока типа 24 | |
6 | string | Пусто | |
Вложенные блоки | |||
6 | integer | Количество блоков | |
7 | array | Блоки |
Блок 5
#
Таблица 14. Блок 5№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | string | Название блока/объекта | |
Вложенные блоки | |||
6 | integer | Количество блоков | |
7 | array | Блоки |
Блок 7
#
Таблица 15. Блок 7№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | string | Название блока/объекта | |
6 | integer | Количество вершин | |
7 | array | См. Таблица 16 | |
Вложенные блоки | |||
6 | integer | Количество блоков | |
7 | array | Блоки |
#
Таблица 16.№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты вершины (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
Текстурные координаты | |||
1 | float | U | |
2 | float | V |
Блок 8
#
Таблица 17. Блок 8| № | Тип данных | Описание | Значение |
Блок 9
#
Таблица 18. Блок 9№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | float | Координата X (?) | 0 |
6 | float | Координата Y (?) | 0 |
7 | float | Координата Z (?) | 0 |
8 | float | Расстояние до центра модели от игрока | |
Вложенные блоки | |||
9 | integer | Количество блоков | |
10 | array | Блоки |
Блок 10
Блок 10 используется для задания параметров LOD моделей, а также модели коллизий зданий. Первый блок с индексом 10 будет содержать параметры для первой модели LOD1 (упрощенная модель), второй, вложенный блок будет содержать параметры для второй модели LOD2 (основная модель), в случае модели коллизий первый блок с индексом 10 будет содержать параметры для основной модели (?), вложенным будет блок с индексом 9 для (?).
#
Таблица 19. Блок 10№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | float | Координата X (?) | 0 |
6 | float | Координата Y (?) | 0 |
7 | float | Координата Z (?) | 0 |
8 | float | Расстояние до центра модели от игрока | |
Вложенные блоки | |||
9 | integer | Количество блоков | |
10 | array | Блоки |
Блок 12
#
Таблица 21. Блок 12№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | float | Неизвестная переменная | |
6 | float | Неизвестная переменная | |
7 | float | Неизвестная переменная | |
8 | float | Неизвестная переменная | |
9 | integer | Неизвестная переменная | |
10 | integer | Неизвестная переменная | |
Вложенные блоки | |||
11 | integer | Количество блоков | |
12 | array | Блоки |
Блок 13
#
Таблица 22. Блок 13№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | integer | Неизвестная переменная | |
6 | integer | Неизвестная переменная | |
7 | integer | Количество | |
8 | array | См. Таблица 22 |
#
Таблица 23.№ | Тип данных | Описание | Значение |
---|
Блок 14
#
Таблица. Блок 14№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | integer | Неизвестная переменная | |
6 | integer | Неизвестная переменная | |
7 | float | Неизвестная переменная | |
8 | float | Неизвестная переменная | |
9 | float | Неизвестная переменная | |
10 | float | Неизвестная переменная | |
11 | float | Неизвестная переменная |
Блок 18
#
Таблица. Блок 18№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | string | Название блока/объекта | |
6 | string | Название блока/объекта |
Блок 19
#
Таблица. Блок 19№ | Тип данных | Описание |
---|---|---|
Вложенные блоки | ||
14 | integer | Количество блоков |
15 | array | Блоки |
Блок 20
Содержит параметры геометрии "плоской" модели коллизии.
#
Таблица. Блок 20№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | integer | Количество вершин | |
6 | float | ||
7 | float | ||
8 | integer | ||
9 | array | Массив вершин | |
10 | array |
#
Таблица. Блок 21№ | Тип данных | Описание | Значение |
---|---|---|---|
1 | integer | Неизвестная переменная | |
2 | integer | Неизвестная переменная | |
3 | integer | Неизвестная переменная | |
4 | integer | Неизвестная переменная | |
3 | integer | Неизвестная переменная | |
4 | integer | Неизвестная переменная | |
Вложенные блоки | |||
14 | integer | Количество блоков | |
15 | array | Блоки |
#
Таблица. Блок 24№ | Тип данных | Описание | Значение |
---|---|---|---|
X | |||
1 | float | X | |
2 | float | y | |
3 | float | z | |
Y | |||
4 | float | X | |
5 | float | y | |
6 | float | z | |
Z | |||
7 | float | X | |
8 | float | y | |
9 | float | z | |
Позиция | |||
10 | float | X | |
11 | float | y | |
12 | float | z | |
13 | integer | Неизвестная переменная | 0, 1 |
Вложенные блоки | |||
14 | integer | Количество блоков | |
15 | array | Блоки |
#
Таблица. Блок 25№ | Тип данных | Описание | Значение |
---|---|---|---|
1 | integer | Неизвестная переменная | |
2 | integer | Неизвестная переменная | |
3 | integer | Неизвестная переменная | |
4 | string | Неизвестная переменная | |
5 | integer | Неизвестная переменная | |
6 | integer | Неизвестная переменная | |
7 | float | Неизвестная переменная | |
8 | float | Неизвестная переменная | |
9 | float | Неизвестная переменная | |
10 | float | Неизвестная переменная | |
11 | float | Неизвестная переменная | |
12 | float | Неизвестная переменная | |
13 | float | Неизвестная переменная | |
14 | float | Неизвестная переменная | |
15 | float | Неизвестная переменная |
#
Таблица. Блок 30№ | Тип данных | Описание |
---|---|---|
1 | float | X |
2 | float | Y |
3 | float | Z |
4 | Неизвестная переменная | |
5 | string | Название комнаты, с которой соединяет портал. |
6 | float | X (первая точка полигона) |
7 | float | Y (первая точка полигона) |
8 | float | Z (первая точка полигона) |
9 | float | X (вторая точка полигона) |
10 | float | Y (вторая точка полигона) |
11 | float | Z (вторая точка полигона) |
#
Таблица. Блок 35№ | Тип данных | Описание |
---|---|---|
1 |
#
Таблица. Блок 37№ | Тип данных | Описание |
---|---|---|
1 | float | X |
2 | float | Y |
3 | float | Z |
#
3.3.3 Группировка (иерархия) блоковБлок данных в b3D представляют собой связанную иерархическую структуру, с начальным базовым блоком, объединяющим все последующие вложенные блоки в единый объект игры: трехмерную модель, модель коллизий, объект освещения или объект логики. В зависимости от того, какой объект необходимо сохранить в b3D файле, порядок построения иерархии базовых и вложенных блоков будет отличается, однако общая структура будет сохранятся для одного типа игровых объектов (о типах объектов см. Приложение 1.).
Далее описаны типовые способы группировки блоков, используемые в файлах b3D. Данный порядок не является строгим, поскольку возможны равнозначные комбинации блоков внутри базового блока. Это связано и с тем как игра считывает эти блоки из файла, а также с тем, как логически построены типы блоков, а именно то, что есть (возможно) совпадение функций некоторых типов блоков между собой.
b3D объекты уровня комнаты (room) сохранены в мировых координатах, а строения с которыми можно взаимодействовать (АЗС, СТО и т.д.), хранятся отдельно в локальных координатах. Это дает возможность предполагать, что в игровом редакторе они выступали отдельным объектом, который размещался на карте, привязывался к комнате, необходимость привязки строения к комнате обусловлена алгоритмом оптимизации отрисовки игровых объектов и выбирался его тип (АЗС, СТО и т.д.). В файле b3D эти объекты связываются между собой в иерархии комнаты через специально для этого предназначенный блок 18, содержащий в том числе информацию о матрице трансформации координат объекта.
Другой особенностью группировки объектов в b3D является использование группировки объектов одного типа, когда тип базового и вложенного блока совпадает. Это позволяет создавать иерархию блоков отвечающую, например, за освещение объектов в разное время суток. Таким образом, начальный блок будет содержать параметры освещения днем (или их полного отсутствия), второй блок вечером и последний блок ночью. Аналогичным образом выстраивается иерархия объектов уровня детализации (LOD) и др.
3.3.3.1 Дома, строения.
3.3.3.2 Базы, АЗС, СТО, киоски
- База (Store)
#
Схема группировки блоковБЛОК -> 10 -> [ 33 - 9 - 20 - 37 - 7 ]
#
Элементы№ | Название | Блоки |
---|---|---|
1 | Освещение ночью | 33, 37, 35, 7, 8 |
2 | Геометрия строения | 37, 35, 7, 8 |
3 | События: приближение к складу | 9, 13 |
4 | Уровень детализации (LOD) | 10, 37, 35, 7, 8 |
4 | Модель коллизии | 20 |
3.3.3.3 Элементы освещения
3.3.3.4 Инфраструктура дороги
#
Схема группировки дорожных знаковБЛОК -> 4 -> 37 -> 35
#
Схема группировки светофоровБЛОК -> 4 ->
-> 21 -> 5
-> 37 -> 8
#
Схема группировки радаровБЛОК -> 4 ->
-> 21 -> 37 -> 35
-> 37 -> 8
3.3.3.5 Дороги, бездорожье, стоянки, окружающая среда(вода, горы, болота).
БЛОК -> 19 ->
3.3.3.6 Деревья, люди
3.3.3.7 Специальные объекты
#
Приложение 1. Типы объектов#
Таблица. Строения№ | Тип данных | Описание |
---|---|---|
1 | Дом, строение | |
2 | АЗС | |
3 | База | |
4 | СТО | |
5 | Нефтебаза | |
5 | Информационный киоск |
#
Таблица. Дорожная инфраструктура№ | Тип данных | Описание |
---|---|---|
1 | Дорожный знак | |
2 | Светофор | |
3 | Радар |
#
Таблица. Другое№ | Тип данных | Описание |
---|---|---|
1 | Люди | |
2 | Деревья | |
3 | Свет |
#
Таблица. Транспортное средство№ | Тип данных | Описание |
---|---|---|
1 | Автомобиль | |
2 | Прицеп, Полуприцеп | |
3 | Кабина |
#
Приложение 2. Файлы игры#
Таблица. Файлы .b3D игры№ | Тип данных | Описание |
---|---|---|
1 | ap.b3D | Населенный пункт Южный (Аэропорт) |
2 | ar.b3D | Населенный пункт Залеск () |
3 | dr.b3D | Населенный пункт Кольцо (Гоночная трасса) |
3 | au.b3D | Населенный пункт Ельнино () |