-
Notifications
You must be signed in to change notification settings - Fork 7
b3D File Format Rus
Глоссарий
integer - тип данных. Целое положительное число, размер в файле 4 байта. В файлах игры не встречаются значения больше 2^16. В integer, например, хранятся количество элементов массива и индексы координат.
float - тип данных, нецелое число, размер в файле 4 байта. Во float, например, хранятся координаты объектов в игре.
string - тип данных, строка, размер которой в файле всегда равен 32 байта.
array - последовательность элементов, всегда предваряется переменной типа integer, содержащей количество элементов.
-TODO-
1. Структура блоков данных.
2. Группировка блоков.
3. Приложения.
Ссылки
- Шаблон формата b3D для hex редактора 010 Editor. Открыть B3D.bt
1. Введение
3. Секции
3.1 Заголовок файла
3.3 Блоки данных
Приложение 1. Типы объектов
Приложение 2. Файлы игры
Приложение 3. Название объектов
Этот документ описывает структуру формата файла b3D, используемого в игре Дальнобойщики 2 Второе издание (версия 8). Формат b3D содержит описание трехмерных моделей, используемых в игре, параметров освещения игрового уровня, а также некоторых объектов логики игры и данные моделей коллизий.
Все переменные, перечисленные в таблицах, показаны в порядке их следования в файле.
Формат b3D разделен на 3 основные секции (см Табл. 1).
№ | Секция | Ссылки |
---|---|---|
1 | Заголовок файла | См. Таблица 2 |
2 | Список материалов | См. Таблица 3 |
Идентификатор начала секции | См. Таблица 6 | |
3 | Блоки данных | См. Таблица 5 |
Идентификатор конца секции | См. Таблица 6 |
Файл формата b3D начинается с сигнатуры, строки размером 4 байта состоящей из трех символов с завершающим нулем на конце "b3D" (0x62336400). Далее располагается таблица размеров и смещений секций файла. Все значения размеров в таблице уменьшены в 4 раза, это возможно поскольку размеры всех переменных, которые хранятся в b3D файлах, кратны 4ем.
№ | Тип данных | Описание | Значение |
---|---|---|---|
1 | Сигнатура файла | "b3d." | |
2 | integer | [ Размер файла в байтах ] / 4 | |
3 | integer | [ Смещение секции со списком используемых материалов ] / 4 | 6 |
4 | integer | [ Размер секции со списком материалов (1ая секция) ] / 4 | |
5 | integer | [ Смещение секции с блоками данных (третья секция) ] / 4 | |
6 | integer | [ Размер секции с блоками данных (третья секция) в байтах ] / 4 |
Список материалов представляет из себя массив элементов в виде строки, которая содержит название материала (См. Таблица 4). Список начинается с целочисленной переменной хранящей количество материалов (См. Таблица 3). Сами материалы хранятся отдельно в .res файлах (См. Формат RES/RMP).
№ | Тип данных | Описание | Ссылки |
---|---|---|---|
1 | integer | Количество материалов | |
2 | array | Список названий материалов | См. Таблица 4 |
Размер | Тип данных | Описание |
---|---|---|
32 байта | string | Имя материала |
В b3D используется единый формат хранения блока данных (См. Таблица 5 ). Блок имеет идентификатор начала (333 в десятичной форме записи) и идентификатором конца блока (555), а также иногда специальный идентификатор 444 (См. Таблица 6 ). После открывающего идентификатора следует заголовок блока, затем параметры блока, а также (при наличии) секция вложенных блоков.
№ | Описание | Ссылки |
---|---|---|
Идентификатор начала блока | См. Таблица 6 | |
1 | Заголовок блока | См. Таблица 7 |
2 | Параметры | См. Пункт 3.3.2. Параметры блоков |
3 | Вложенные блоки данных | См. Таблица 9 |
Идентификатор конца блока | См. Таблица 6 |
Идентификаторы 111 и 222 присутствуют в единичных экземплярах перед секции блоков данных в конце файла b3D соответственно. Идентификаторы 333 и 555 есть перед каждым блоком и в его конце соответственно. Идентификатор 444 присутствует в начале, а также в конце некоторых блоков.
№ | Описание | Значение в десятичной форме |
---|---|---|
1 | Начало секции с блоками данных | 111 |
2 | Конец секции с блоками данных | 222 |
3 | Начало одного блока | 333 |
4 | Разделитель переключаемых блоков | 444 |
5 | Конец одного блока | 555 |
Заголовок блока содержит два поля: название блока и тип блока. Именование блоков, применяемое в игре, приведено в приложениях.
№ | Тип данных | Описание | Ссылки |
---|---|---|---|
1 | string | Название блока | См. Приложение 3 |
2 | integer | Тип блока | См. Таблица 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). |
Вложенные блоки хранятся последовательно, начиная с переменной отображающей их количество.
№ | Тип данных | Описание | Ссылка |
---|---|---|---|
1 | integer | Количество блоков | |
2 | array | Блоки | См. Таблица 5 |
Далее описываются параметры каждого из типов блоков данных (См. Таблица 5 и Таблица 8).
Блок 0
Самый первый блок в файле. Данный тип блок не хранит в себе вложенных блоков. Не используется в игре, хотя присутствует в файлах.
№ | Тип данных/размер | Описание | Значение |
---|---|---|---|
1 | 40 байт | Пустые данные | 0 |
10 | float | Неизвестная переменная | 1 |
11 | 4 байта | Пустые данные | 0 |
Блок 1
В игре Дальнобойщики 2 присутствует только в файле "Common.d3D". Данный тип блок не хранит в себе вложенных блоков. Не используется в игре, хотя присутствует в файлах.
№ | Тип данных | Описание | Значение |
---|---|---|---|
1 | string | Название | |
2 | string | Название |
Блок 2
Присутствует только в файлах "Trucks.d3D" ($$$Group_1381_truck), "ce.d3D" (room_ce01), "dq.d3D" (lep12).
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) 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
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) X,Y,Z | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
Вложенные блоки | |||
5 | integer | Количество блоков | |
6 | array | Блоки |
Блок 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
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | string | Название блока/объекта | |
Вложенные блоки | |||
6 | integer | Количество блоков | |
7 | array | Блоки |
Блок 7
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | string | Название блока/объекта | |
6 | integer | Количество вершин | |
7 | array | См. Таблица 16 | |
Вложенные блоки | |||
6 | integer | Количество блоков | |
7 | array | Блоки |
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты вершины (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
Текстурные координаты | |||
1 | float | U | |
2 | float | V |
Блок 8
| № | Тип данных | Описание | Значение |
Блок 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 для (?).
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
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
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
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
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | integer | Неизвестная переменная | |
6 | integer | Неизвестная переменная | |
7 | integer | Количество | |
8 | array | См. Таблица 22 |
№ | Тип данных | Описание | Значение |
---|
Блок 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
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | string | Название блока/объекта | |
6 | string | Название блока/объекта |
Блок 19
№ | Тип данных | Описание |
---|---|---|
Вложенные блоки | ||
14 | integer | Количество блоков |
15 | array | Блоки |
Блок 20
Содержит параметры геометрии "плоской" модели коллизии.
№ | Тип данных | Описание | Значение |
---|---|---|---|
Координаты центра объекта (локальное пространство) | |||
1 | float | X | |
2 | float | Y | |
3 | float | Z | |
4 | float | Радиус ограничивающей сферы | |
5 | integer | Количество вершин | |
6 | float | ||
7 | float | ||
8 | integer | ||
9 | array | Массив вершин | |
10 | array |
№ | Тип данных | Описание | Значение |
---|---|---|---|
1 | integer | Неизвестная переменная | |
2 | integer | Неизвестная переменная | |
3 | integer | Неизвестная переменная | |
4 | integer | Неизвестная переменная | |
3 | integer | Неизвестная переменная | |
4 | integer | Неизвестная переменная | |
Вложенные блоки | |||
14 | integer | Количество блоков | |
15 | array | Блоки |
№ | Тип данных | Описание | Значение |
---|---|---|---|
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 | Блоки |
№ | Тип данных | Описание | Значение |
---|---|---|---|
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 | Неизвестная переменная |
№ | Тип данных | Описание |
---|---|---|
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 (вторая точка полигона) |
№ | Тип данных | Описание |
---|---|---|
1 |
№ | Тип данных | Описание |
---|---|---|
1 | float | X |
2 | float | Y |
3 | float | Z |
Блок данных в 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 | Дом, строение | |
2 | АЗС | |
3 | База | |
4 | СТО | |
5 | Нефтебаза | |
5 | Информационный киоск |
№ | Тип данных | Описание |
---|---|---|
1 | Дорожный знак | |
2 | Светофор | |
3 | Радар |
№ | Тип данных | Описание |
---|---|---|
1 | Люди | |
2 | Деревья | |
3 | Свет |
№ | Тип данных | Описание |
---|---|---|
1 | Автомобиль | |
2 | Прицеп, Полуприцеп | |
3 | Кабина |
№ | Тип данных | Описание |
---|---|---|
1 | ap.b3D | Населенный пункт Южный (Аэропорт) |
2 | ar.b3D | Населенный пункт Залеск () |
3 | dr.b3D | Населенный пункт Кольцо (Гоночная трасса) |
3 | au.b3D | Населенный пункт Ельнино () |