B3D (формат файлов)
Описание формата *.b3d игр Дальнобойщики: Путь к победе и Дальнобойщики 2. Данный формат представляет собой трёхмерную сцену с различными типами объектов: контейнерами, переключателями, триггерами, источниками освещения, геометрией и т.п.[1]. Инструменты для работы с B3D представлены на странице с утилитами. Сам формат, предположительно, создан в первой половине 90-х годов ХХ века.
Содержание
- 1 Общее описание структуры файла
- 2 Структуры и описания объектов
- 2.1 Некоторые используемые структуры
- 2.2 Блок (00)
- 2.3 Обозреватель (01)
- 2.4 Контейнер (02)
- 2.5 Контейнер (03)
- 2.6 Контейнер (04)
- 2.7 Контейнер (05)
- 2.8 Блок типа 06
- 2.9 Блок вершин (07)
- 2.10 Блок геометрии (08)
- 2.11 Контейнер (09)
- 2.12 Контейнер-переключатель LOD (10)
- 2.13 Контейнер (11)
- 2.14 Плоскость коллизии (12)
- 2.15 Блок типа 13
- 2.16 Блок типа 14
- 2.17 Блок типа 15
- 2.18 Блок типа 16
- 2.19 Блок типа 17
- 2.20 Блок-связка (18)
- 2.21 Контейнер комнаты (19)
- 2.22 Ломанная линия коллизии (20)
- 2.23 Контейнер-переключатель (21)
- 2.24 Геометрия коллизии (23)
- 2.25 Локатор-контейнер (24)
- 2.26 Звуковой объект (25)
- 2.27 Блок типа 26
- 2.28 Блок типа 27
- 2.29 Блок типа 28
- 2.30 Блок типа 29
- 2.31 Портал (30)
- 2.32 Блок типа 31
- 2.33 Блок типа 32
- 2.34 Источник света (33)
- 2.35 Блок типа 34
- 2.36 Блок геометрии (35)
- 2.37 Блок типа 36
- 2.38 Блок вершин (37)
- 2.39 Блок типа 38
- 2.40 Блок типа 39
- 2.41 Генератор объектов (40)
- 3 Примечания
Общее описание структуры файла
Формат b3d разделен на 3 основные секции:
<заголовок> <список материалов> <блоки данных>
Общее описание блока данных
тип данных | описание |
---|---|
int32 | Идентификатор начала блока |
char[32] | Имя блока |
int32 | Тип блока |
<данные> | Данные блока |
int32 | Идентификатор конца блока |
Числовые идентификаторы
Располагаются в начале и конце каждого экземпляра блока, а также в начале и конце блока данных b3d-файла (см. общее описание структуры файла). Представляют собой int32.
значение int32 | описание |
---|---|
111 | Начало секции с блоками данных |
222 | Конец секции с блоками данных |
333 | Начало одного блока |
444 | Разделитель переключаемых блоков (маркер окончания переключаемой группы) |
555 | Конец одного блока |
Заголовок
тип данных | описание | значение по умолчанию |
---|---|---|
char[4] | сигнатура файла | "b3d" |
int32 | [ Размер файла в байтах ] / 4 | |
int32 | [ Смещение секции со списком используемых материалов ] / 4 | 6 |
int32 | [ Размер секции со списком материалов (1ая секция) ] / 4 | |
int32 | [ Смещение секции с блоками данных (третья секция) ] / 4 | |
int32 | [ Размер секции с блоками данных (третья секция) в байтах ] / 4 |
Список материалов
Представляет собой массив имён материалов из RES-файла. Порядок и имена должны соответствовать RES.
тип данных | описание |
---|---|
int32 | количество материалов |
массив char[32] | имя материала |
Структуры и описания объектов
Структуры даны в синтаксисе C++.
Некоторые используемые структуры
struct Vector3{ float x; float y; float z; }; struct Vector4{ float x; float y; float z; float w; };
Блок (00)
char[32] some_name Vector3 some_position
Назначение неизвестно. Обычно расположен сразу после списка материалов в любом b3d-файле.
Обозреватель (01)
char[32] start_space //имя локатора типа 24, задаёт начальную позицию обозревателя char[32] start_room //имя комнаты типа 19
Обозреватель (Viewer).
Контейнер (02)
Vector4 position; Vector4 unknown; int childCount; <блоки[childCount]>
Контейнер с неизвестными параметрами.
Контейнер (03)
Vector4 position; int childCount; <блоки[childCount]>
Простой контейнер.
Контейнер (04)
Vector4 position; char[32] spaceObject; char[32] linkedObject; int childCount; <блоки[childCount]>
Контейнер с возможностью его прямой привязки к другому объекту: в spaceObject можно задать имя локатора типа 24, и тогда данный контейнер будет привязан к позиции локатора. В linkedObject задаётся подключенный объект (например, коллизия).
Контейнер (05)
Vector4 position; char[32] linkedObject; int childCount; <блоки[childCount]>
Контейнер. Параметр linkedObject аналогично типу 04.
Блок типа 06
Блок вершин (07)
Блок геометрии (08)
Контейнер (09)
Контейнер-переключатель LOD (10)
Контейнер (11)
Плоскость коллизии (12)
Vector4 position; Vector4 collisionPlane; int unknown; int collisionType; int childCount; <блоки[childCount]>
Плоскость коллизии (аналогична CollisionPlane из tech-файла). Определяется нормальным вектором и его длиной (она может быть отрицательной). Границей данной коллизии являются точки пересечений с другими объектами коллизии.
Блок типа 13
Блок типа 14
Блок типа 15
Блок типа 16
Блок типа 17
Блок-связка (18)
Vector4 nodePosition; char[32] spaceObject; char[32] linkedObject;
Используется для добавления копий объектов. В spaceObject указывается имя блока-локатора типа 24, в linkedObject - имя подключаемого объекта. После загрузки сцены копия linkedObject будет расположена в позиции spaceObject, причём эта связь не единоразовая - при изменении позиции spaceObject изменится и позиция копии linkedObject.
Контейнер комнаты (19)
int childCount; <блоки[childCount]>
Используется для хранения комнат игрового мира.
Ломанная линия коллизии (20)
Контейнер-переключатель (21)
Геометрия коллизии (23)
Локатор-контейнер (24)
Vector3 matrix0; Vector3 matrix1; Vector3 matrix2; Vector3 position; int caseState?; int childCount; <блоки[childCount]>
Хранит в себе позицию и вращение. Возможно, также является контейнером-переключателем по типу блока 21. В свойствах локаторов, дочерних данному, матрицы преобразования и позиции должны быть указаны в локальных координатах относительно родительского локатора.
Звуковой объект (25)
Блок типа 26
Блок типа 27
Блок типа 28
Блок типа 29
Портал (30)
Vector4 doorPosition; char[32] targetRoom; Vector3 doorLowVertex; Vector3 doorTopVertex;
Портал (дверь) между комнатами.
параметр | описание |
---|---|
doorPosition | позиция портала |
targetRoom | имя комнаты, в которую ведёт портал. Если комната находится в другом модуле, то имя задаётся в формате <модуль>:<комната> |
doorLowVertex | крайняя нижняя левая точка портала |
doorTopVertex | крайняя верхняя правая точка портала |
Важно!
- Если портал ведёт в комнату другого модуля, то в одной комнате с этим порталом обязательно должен быть загрузчик модуля (блок типа 13)
- Порталы соседних комнат должны иметь одинаковую позицию (doorPosition) и границы, в противном случае запрошенная комната не будет отображена
Блок типа 31
Блок типа 32
Источник света (33)
Vector4 nodePosition; int is_enabled; int unknown_var; int lightType; Vector3D lightPosition; Vector3D lightDirection; float falloff; float attenuation0; float attenuation1; float attenuation1; float theta; float phi; float R; float G; float B; int childCount; <блоки[childCount]>
Источник света DirectX 8.
параметр | описание[2] |
---|---|
lightType | тип источника света: 1 - направленный (directional), 2 - точечный (point), 3 - зональный (spot) |
lightPosition | позиция источника света |
lightDirection | направление освещения (нормальный вектор) |
falloff | уменьшение освещения между внутренним конусом (theta) и внешним конусом (phi) источника света |
attenuation0 | постоянное затухание |
attenuation1 | линейное затухание |
attenuation2 | квадратичное затухание |
theta | угол внутреннего конуса в радианах, для нацеленного источника света. Это значение может принимать от 0 до значения Phi |
phi | угол внешнего конуса источника света. Т.е. вне этого конуса свет уже не освещает. Может принимать значения между 0 и числом Пи. |
Блок типа 34
Блок геометрии (35)
Блок типа 36
Блок вершин (37)
Блок типа 38
Блок типа 39
Генератор объектов (40)
Дальнобойщики 2 | ||
---|---|---|
Игровое наполнение | Игровой регион • Автопарк • Саундтрек • Вступительный ролик • Рация • Милиция • Вертолёт | |
Моддинг | Модификации • Утилиты • game.cnf • sch-файлы • vehicle.tech • truck.ini | |
Разное | История версий • Советы и секреты • Бонусный диск • Управление • Авторы |