B3D (формат файлов): различия между версиями
м (убрал типы 15, 26, 32 и 38 - их не существует ни в Д-1, ни в Д-2) |
м (→Некоторые общие используемые структуры) |
||
(не показано 16 промежуточных версий этого же участника) | |||
Строка 74: | Строка 74: | ||
=Структуры и описания объектов= | =Структуры и описания объектов= | ||
Структуры даны в синтаксисе C++. | Структуры даны в синтаксисе C++. | ||
− | ==Некоторые используемые структуры== | + | ==Некоторые общие используемые структуры== |
struct Vector3{ | struct Vector3{ | ||
float x; | float x; | ||
float y; | float y; | ||
float z; | float z; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
}; | }; | ||
struct Vector4{ | struct Vector4{ | ||
Строка 99: | Строка 93: | ||
float v; | float v; | ||
}; | }; | ||
+ | |||
+ | Структура vertsStruct: | ||
+ | //В блоке-хранилище вершин переменную vertsStructType следует читать как четыре uint8, тогда: | ||
+ | int normals_type = vertsStructType[0] | ||
+ | int num_UV = vertsStructType[1] | ||
+ | int some_data1 = vertsStructType[2] | ||
+ | int some_data1 = vertsStructType[3] | ||
+ | // | ||
+ | struct vertsStruct{ | ||
+ | Vector3 position; | ||
+ | Vector2 UV; | ||
+ | Vector2 additionalUV[num_UV]; | ||
+ | |||
+ | if (normals_type == 1 || normals_type == 2){ | ||
+ | Vector3 normal; //обычная нормаль | ||
+ | } else if (normals_type == 3){ | ||
+ | float normal; //а в таком случае модель не будет затеняться | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Структура faceStruct: | ||
+ | struct faceStruct{ | ||
+ | int format; | ||
+ | float num_1; | ||
+ | int num_32767; | ||
+ | int mtlIndex; | ||
+ | int indexCount; | ||
+ | <faceIndex[indexCount] indexes> | ||
+ | } | ||
+ | |||
+ | int inter_format = format ^ 1 | ||
+ | struct faceIndex{ | ||
+ | int vertexIndex; | ||
+ | if (inter_format & 2){ | ||
+ | Vector2 UV; //индивидуальная UV для данного полигона | ||
+ | } | ||
+ | if (inter_format & 0x10){ | ||
+ | if (inter_format & 0x1){ | ||
+ | Vector3 intensity_vector; //нормаль | ||
+ | } else if (inter_format & 0x20){ | ||
+ | float intensity_float; //если есть, то затенение не будет использоваться | ||
+ | } | ||
+ | } | ||
+ | } | ||
==Терминология и пояснения== | ==Терминология и пояснения== | ||
Строка 115: | Строка 153: | ||
==Замечания по структурам== | ==Замечания по структурам== | ||
* Параметр nodePosition у объектов никак не влияет на их позицию! Скорее всего, он нужен лишь для оптимизации отрисовки. | * Параметр nodePosition у объектов никак не влияет на их позицию! Скорее всего, он нужен лишь для оптимизации отрисовки. | ||
− | * В игре «Дальнобойщики: Путь к победе» было только 30 типов объектов. К выходу «Дальнобойщиков 2» количество | + | * Поиск объектов, указанных в текстовых полях (linkedObject, spaceObject и т.п.) происходит во всех загруженных в память b3d-файлах. То есть допускается давать в одном b3d-файле ссылки на объекты из другого b3d. |
+ | * В игре «Дальнобойщики: Путь к победе» было только 30 типов объектов. К выходу «Дальнобойщиков 2» их количество было увеличено до 40. | ||
==Блок (00)== | ==Блок (00)== | ||
Строка 328: | Строка 367: | ||
Параметры события: отсутствуют. | Параметры события: отсутствуют. | ||
==Блок типа 16== | ==Блок типа 16== | ||
+ | Vector4 nodePosition; | ||
+ | Vector3 some_data[3]; | ||
+ | int some_value1; | ||
+ | int some_value2; | ||
+ | |||
+ | Назначение неизвестно. Структура аналогична блоку типа 17. | ||
==Блок типа 17== | ==Блок типа 17== | ||
+ | Vector4 nodePosition; | ||
+ | Vector3 some_data[3]; | ||
+ | int some_value1; | ||
+ | int some_value2; | ||
+ | |||
+ | Назначение неизвестно. Структура аналогична блоку типа 16. | ||
==Блок-связка (18)== | ==Блок-связка (18)== | ||
Vector4 nodePosition; | Vector4 nodePosition; | ||
Строка 341: | Строка 392: | ||
Используется для хранения комнат игрового мира. | Используется для хранения комнат игрового мира. | ||
==Ломанная линия коллизии (20)== | ==Ломанная линия коллизии (20)== | ||
+ | Vector4 nodePosition; | ||
+ | int pointsCount; | ||
+ | int some_value1; | ||
+ | int some_value2; | ||
+ | int some_value3; | ||
+ | <float[some_value3]> | ||
+ | <vertsSimple[pointsCount]> | ||
+ | |||
+ | Вертикальная коллизия, заданная ломанной линией. Используется для ограждения заборов и лесов. Имеет неограниченную высоту. | ||
+ | |||
==Контейнер-переключатель (21)== | ==Контейнер-переключатель (21)== | ||
Vector4 nodePosition; | Vector4 nodePosition; | ||
Строка 350: | Строка 411: | ||
Контейнер с переключаемым содержимым. По умолчанию отображается группа под индексом defaultGroupIndex (если состояние переключателя не задаётся постоянно кодом игры).</br> | Контейнер с переключаемым содержимым. По умолчанию отображается группа под индексом defaultGroupIndex (если состояние переключателя не задаётся постоянно кодом игры).</br> | ||
Если у контейнера есть префикс "refer_" в названии, то значение активной группы привязывается к такому же контейнеру, у которого нет такого префикса в имени. Например, отображаемая группа контейнера "refer_DashboardGlowKey" будет зависеть от состояния контейнера "DashboardGlowKey". | Если у контейнера есть префикс "refer_" в названии, то значение активной группы привязывается к такому же контейнеру, у которого нет такого префикса в имени. Например, отображаемая группа контейнера "refer_DashboardGlowKey" будет зависеть от состояния контейнера "DashboardGlowKey". | ||
+ | |||
+ | ===Некоторые переключатели, используемые на моделях транспорта=== | ||
+ | Данные приведены для игры "Дальнобойщики 2" версии 8.2. | ||
+ | |||
+ | ====Повреждения==== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! имя блока !! количество групп по умолчанию !! описание | ||
+ | |- | ||
+ | | Damage1Key || 5 || Повреждения бампера. | ||
+ | |- | ||
+ | | DamageFCKey || 3 || Повреждения капота. | ||
+ | |- | ||
+ | | DamageFRKey || 4 || Повреждения переднего правого крыла. | ||
+ | |- | ||
+ | | DamageFLKey || 4 || Повреждения переднего левого крыла. | ||
+ | |- | ||
+ | | DamageRKey || 3 || Повреждения правой боковины кузова. | ||
+ | |- | ||
+ | | DamageLKey || 3 || Повреждения левой боковины кузова. | ||
+ | |- | ||
+ | | DamageBRKey || 4 || Повреждения заднего правого крыла. | ||
+ | |- | ||
+ | | DamageBLKey || 4 || Повреждения заднего левого крыла. | ||
+ | |- | ||
+ | | DamageBCKey || 3 || Повреждения багажника и/или заднего бампера. | ||
+ | |- | ||
+ | | DamageWheel0Key || 4 || Повреждения I колеса. | ||
+ | |- | ||
+ | | DamageWheel1Key || 4 || Повреждения II колеса. | ||
+ | |- | ||
+ | | DamageWheel2Key || 4 || Повреждения III колеса. | ||
+ | |- | ||
+ | | DamageWheel3Key || 4 || Повреждения IV колеса. | ||
+ | |- | ||
+ | | DamageWheel4Key || 4 || Повреждения V колеса. | ||
+ | |- | ||
+ | | DamageWheel5Key || 4 || Повреждения VI колеса. | ||
+ | |- | ||
+ | | DamageWheel6Key || 4 || Повреждения VII колеса. | ||
+ | |- | ||
+ | | DamageWheel7Key || 4 || Повреждения VIII колеса. | ||
+ | |} | ||
+ | Нумерация колёс транспорта ведётся слева-направо от передних к задним. Например, I колесо - это переднее левое, II - это переднее правое, и т.д. | ||
+ | |||
+ | ====Переключатели светотехники==== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! имя блока !! количество групп по умолчанию !! описание | ||
+ | |- | ||
+ | | HeadLightKey || 2 || Фары головного света автомобиля. | ||
+ | |- | ||
+ | | BackFaraKeyR, BackFaraKeyL || 2 || Свечение огня заднего хода. | ||
+ | |- | ||
+ | | StopFaraKeyR, StopFaraKeyL || 3 || Задний фонарь. Группа II хранит свечение стоп-сигнала, группа III хранит свечение габаритного огня. | ||
+ | |} | ||
+ | |||
+ | ====Другие переключатели==== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! имя блока !! количество групп по умолчанию !! описание | ||
+ | |- | ||
+ | | SizeLightKey || 2 || Габаритные огни кузова грузовика; I группа пустая, II хранит модели огней; в настройках блока группой по умолчанию должна быть II. | ||
+ | |- | ||
+ | | HornKey || 2 || Модель гудка, отображаемая при его установке на СТО. | ||
+ | |- | ||
+ | | SupportKey || 2 || Опоры полуприцепа. | ||
+ | |- | ||
+ | | IconKey || 9 || Логотипы компаний, отображаемые на бортах грузовиков. | ||
+ | |- | ||
+ | | CopSirenKey || 2 || Звуковая сирена автомобиля милиции. | ||
+ | |- | ||
+ | | CopLightKey || 8 || Мигалки автомобиля милиции. | ||
+ | |} | ||
+ | |||
+ | ===Другие переключатели=== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! имя блока !! описание | ||
+ | |- | ||
+ | | GeometryKey || Переключает отображение вариантов моделей разной детализации в зависимости от настроек игры | ||
+ | |- | ||
+ | | CollisionKey || Коллизия автомобиля (но неизвестно, как именно она используется) | ||
+ | |- | ||
+ | | GlassKey || Лобовое стекло автомобиля, отображаемое в салоне во время дождя | ||
+ | |- | ||
+ | | RD_Key || Улучшение "радар", устанавливаемое на СТО | ||
+ | |- | ||
+ | | RD_LampKey || Свечение сигнальных ламп радара | ||
+ | |- | ||
+ | | RedSvetKey || неизвестно | ||
+ | |- | ||
+ | | GreenSvetKey || неизвестно | ||
+ | |- | ||
+ | | TrafficLightKey0 || Светофор для дорожного трафика | ||
+ | |- | ||
+ | | TrafficLightKey1 || Светофор для дорожного трафика | ||
+ | |} | ||
+ | |||
+ | Кроме того, в игре есть переключатели ILLUM_LEVEL_00 - ILLUM_LEVEL_15. Они используются в моделях домов для реализации света в окнах. Время работы данных переключателей приведено чуть далее на изображениях. | ||
+ | |||
+ | <gallery> | ||
+ | b3d_wheel_groups_v2.jpg|Группы в DamageWheelKey | ||
+ | b3d_illum_key_time_hours.png|Время работы ILLUM_LEVEL в часах | ||
+ | b3d_illum_key_time_dbl.png|Время работы ILLUM_LEVEL в double | ||
+ | </gallery> | ||
+ | |||
==Геометрия коллизии (23)== | ==Геометрия коллизии (23)== | ||
+ | int some_value1; | ||
+ | int collisionType; | ||
+ | int dataCount; | ||
+ | <float[dataCount] someData> | ||
+ | int polyCount; | ||
+ | <collisionPolygon[polyCount] polygons> | ||
+ | |||
+ | struct collisionPolygon { | ||
+ | int vertsCount; | ||
+ | <Vector3[vertsCount] data>; | ||
+ | }; | ||
+ | |||
+ | Трёхмерная коллизия. | ||
+ | |||
==Локатор-контейнер (24)== | ==Локатор-контейнер (24)== | ||
Vector3 matrix0; | Vector3 matrix0; | ||
Строка 362: | Строка 544: | ||
Хранит в себе позицию и вращение. Возможно, также является контейнером-переключателем по типу блока 21. В свойствах локаторов, дочерних данному, матрицы преобразования и позиции должны быть указаны в локальных координатах относительно родительского локатора. | Хранит в себе позицию и вращение. Возможно, также является контейнером-переключателем по типу блока 21. В свойствах локаторов, дочерних данному, матрицы преобразования и позиции должны быть указаны в локальных координатах относительно родительского локатора. | ||
− | == | + | ==Источник звука (25)== |
+ | int num32767; | ||
+ | int num2; | ||
+ | int num256; | ||
+ | char[32] soundName; | ||
+ | Vector3 soundPosition; | ||
+ | float some_value4; | ||
+ | float some_value5; | ||
+ | float some_value6; | ||
+ | float _2xPI; | ||
+ | float _PI; | ||
+ | float some_value9; | ||
+ | float soundRadius; | ||
+ | float soundVolume; | ||
+ | |||
+ | Источник трёхмерного звука. | ||
+ | |||
==Блок типа 27== | ==Блок типа 27== | ||
− | == | + | Vector4 nodePosition; |
− | == | + | int some_value1; |
+ | Vector3 some_vector; | ||
+ | int some_value2; | ||
+ | |||
+ | Назначение неизвестно. | ||
+ | |||
+ | ==Спрайт (28)== | ||
+ | Vector4 nodePosition; | ||
+ | Vector3 some_vector; | ||
+ | int data_count; | ||
+ | <spriteData[data_count]> | ||
+ | |||
+ | struct spriteData{ | ||
+ | int format; | ||
+ | float var1; | ||
+ | int num_32767; | ||
+ | int mtlIndex; | ||
+ | int vertsCount; | ||
+ | <spriteVertex[vertsCount] verts> | ||
+ | } | ||
+ | |||
+ | int inter_format = format ^ 1 | ||
+ | struct spriteVertex{ | ||
+ | Vector2 position; | ||
+ | if (inter_format & 2){ | ||
+ | Vector2 UV; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Трёхмерный спрайт. | ||
+ | |||
+ | ==Контейнер-переключатель LOD (29)<ref>https://github.com/LabVaKars/Hard-Truck-1-2-Blender-plugins/blob/master/src/addons/b3d_tools/b3d/import_b3d.py</ref>== | ||
+ | Vector4 nodePosition; | ||
+ | int groupsCount; | ||
+ | int defaultGroupIndex; | ||
+ | <float[groupsCount] groups_render_distances> | ||
+ | int childCount; | ||
+ | <блоки[childCount]> | ||
+ | |||
+ | Расширенный контейнер LOD. Имеет неограниченное количество групп, для каждой из которых можно задать предельное расстояние отрисовки. | ||
+ | |||
==Портал (30)== | ==Портал (30)== | ||
Vector4 doorPosition; | Vector4 doorPosition; | ||
Строка 390: | Строка 628: | ||
* Порталы соседних комнат должны иметь одинаковую позицию (doorPosition) и границы, в противном случае запрошенная комната не будет отображена | * Порталы соседних комнат должны иметь одинаковую позицию (doorPosition) и границы, в противном случае запрошенная комната не будет отображена | ||
==Блок типа 31== | ==Блок типа 31== | ||
+ | Vector4 nodePosition; | ||
+ | int dataCount; | ||
+ | Vector4 objectPosition | ||
+ | int some_int; | ||
+ | Vector3 some_vector; | ||
+ | <Type31Data [dataCount]> | ||
+ | |||
+ | struct Type31data { | ||
+ | float blendValue; | ||
+ | int maskID; | ||
+ | }; | ||
+ | |||
+ | Назначение неизвестно. Предположительно, используется для отрисовки деревьев, заданных набором msk-файлов. | ||
+ | |||
==Источник света (33)== | ==Источник света (33)== | ||
Vector4 nodePosition; | Vector4 nodePosition; | ||
Строка 437: | Строка 689: | ||
int some_value; | int some_value; | ||
int dataCount; | int dataCount; | ||
− | < | + | <Type34Data[dataCount]> |
+ | |||
+ | struct Type34Data{ | ||
+ | float x; | ||
+ | float y; | ||
+ | float z; | ||
+ | int var; | ||
+ | }; | ||
Назначение неизвестно. | Назначение неизвестно. | ||
Строка 469: | Строка 728: | ||
Блок-контейнер вершин. Хранит в себе сложные вершины (тип определяется vertsStructType - могут быть и нормали, и несколько слоёв UV, и другие данные). | Блок-контейнер вершин. Хранит в себе сложные вершины (тип определяется vertsStructType - могут быть и нормали, и несколько слоёв UV, и другие данные). | ||
− | == | + | ==Контейнер-блок типа 39== |
+ | Vector4 nodePosition; | ||
+ | Vector4 some_vector; | ||
+ | int some_value; | ||
+ | int childCount; | ||
+ | <блоки[childCount]> | ||
+ | |||
+ | Назначение неизвестно. | ||
==Генератор объектов (40)== | ==Генератор объектов (40)== | ||
Vector4 nodePosition; | Vector4 nodePosition; |
Версия 17:01, 7 октября 2025
Описание формата *.b3d игр Дальнобойщики: Путь к победе и Дальнобойщики 2. Данный формат представляет собой трёхмерную сцену с различными типами объектов: контейнерами, переключателями, триггерами, источниками освещения, геометрией и т.п.[1]. Инструменты для работы с B3D представлены на странице с утилитами. Сам формат, предположительно, создан в первой половине 90-х годов ХХ века.
Содержание
- 1 Общее описание структуры файла
- 2 Структуры и описания объектов
- 2.1 Некоторые общие используемые структуры
- 2.2 Терминология и пояснения
- 2.3 Замечания по структурам
- 2.4 Блок (00)
- 2.5 Обозреватель (01)
- 2.6 Контейнер (02)
- 2.7 Контейнер (03)
- 2.8 Контейнер (04)
- 2.9 Контейнер (05)
- 2.10 Контейнер-блок вершин (06)
- 2.11 Контейнер-блок вершин (07)
- 2.12 Блок геометрии (08)
- 2.13 Контейнер (09)
- 2.14 Контейнер-переключатель LOD (10)
- 2.15 Контейнер (11)
- 2.16 Плоскость коллизии (12)
- 2.17 Триггер (13)
- 2.18 Событие (14)
- 2.19 Блок типа 16
- 2.20 Блок типа 17
- 2.21 Блок-связка (18)
- 2.22 Контейнер комнаты (19)
- 2.23 Ломанная линия коллизии (20)
- 2.24 Контейнер-переключатель (21)
- 2.25 Геометрия коллизии (23)
- 2.26 Локатор-контейнер (24)
- 2.27 Источник звука (25)
- 2.28 Блок типа 27
- 2.29 Спрайт (28)
- 2.30 Контейнер-переключатель LOD (29)[2]
- 2.31 Портал (30)
- 2.32 Блок типа 31
- 2.33 Источник света (33)
- 2.34 Блок типа 34
- 2.35 Блок геометрии (35)
- 2.36 Контейнер-блок вершин (36)
- 2.37 Контейнер-блок вершин (37)
- 2.38 Контейнер-блок типа 39
- 2.39 Генератор объектов (40)
- 3 Технические ограничения (Дальнобойщики II)
- 4 Примечания
Общее описание структуры файла
Формат b3d разделен на 3 основные секции:
<заголовок> <список материалов> <блоки данных>
Общее описание блока данных
тип данных | описание |
---|---|
int32 | Идентификатор начала блока |
char[32] | Имя блока |
int32 | Тип блока |
<данные> | Данные блока |
int32 | Идентификатор конца блока |
Числовые идентификаторы
Располагаются в начале и конце каждого экземпляра блока, а также в начале и конце блока данных b3d-файла (см. общее описание структуры файла). Представляют собой int32. При редактировании файлов в hex-редакторе удобно знать строковое представление данных идентификаторов.
значение int32 | строковый вид в кодировке 1251 | описание |
---|---|---|
111 | "o..." | Начало секции с блоками данных |
222 | "Ю..." | Конец секции с блоками данных |
333 | "M .." | Начало одного блока |
444 | "j .." | Разделитель переключаемых блоков (маркер окончания переключаемой группы) |
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; }; struct vertsSimple{ float x; float y; float z; float u; float v; };
Структура vertsStruct:
//В блоке-хранилище вершин переменную vertsStructType следует читать как четыре uint8, тогда: int normals_type = vertsStructType[0] int num_UV = vertsStructType[1] int some_data1 = vertsStructType[2] int some_data1 = vertsStructType[3] // struct vertsStruct{ Vector3 position; Vector2 UV; Vector2 additionalUV[num_UV]; if (normals_type == 1 || normals_type == 2){ Vector3 normal; //обычная нормаль } else if (normals_type == 3){ float normal; //а в таком случае модель не будет затеняться } }
Структура faceStruct:
struct faceStruct{ int format; float num_1; int num_32767; int mtlIndex; int indexCount; <faceIndex[indexCount] indexes> } int inter_format = format ^ 1 struct faceIndex{ int vertexIndex; if (inter_format & 2){ Vector2 UV; //индивидуальная UV для данного полигона } if (inter_format & 0x10){ if (inter_format & 0x1){ Vector3 intensity_vector; //нормаль } else if (inter_format & 0x20){ float intensity_float; //если есть, то затенение не будет использоваться } } }
Терминология и пояснения
Группа переключаемого контейнера
Переключаемые группы - это дочерние объекты у переключаемого контейнера, разделённые идентификатором int32=444 (в текстовом виде - "j .."). Например, в некотором контейнере в B3D записаны следующие объекты:
object0_0 object0_1 <j ..> object1_0 <j ..> object2_0
В таком случае, первой переключаемой группой будут object0_0 и object0_1, второй группой object1_0, а третьей группой object2_0.
- В конце последней группы идентификатор 333 не ставится. Кроме того, группы могут быть пустыми, то есть не содержать никаких объектов.
- Переключаемые группы есть только у объектов типа 10, 21 и (возможно) 24.
Замечания по структурам
- Параметр nodePosition у объектов никак не влияет на их позицию! Скорее всего, он нужен лишь для оптимизации отрисовки.
- Поиск объектов, указанных в текстовых полях (linkedObject, spaceObject и т.п.) происходит во всех загруженных в память b3d-файлах. То есть допускается давать в одном b3d-файле ссылки на объекты из другого b3d.
- В игре «Дальнобойщики: Путь к победе» было только 30 типов объектов. К выходу «Дальнобойщиков 2» их количество было увеличено до 40.
Блок (00)
char[32] some_name Vector3 some_position
Назначение неизвестно. Обычно расположен сразу после списка материалов в любом b3d-файле.
Обозреватель (01)
char[32] start_space char[32] start_room
Обозреватель (Viewer).
параметр | описание |
---|---|
start_space | имя локатора типа 24, задаёт начальные позицию и вращение обозревателя |
start_room | имя комнаты типа 19, в которой будет создан обозреватель |
Контейнер (02)
Vector4 nodePosition; Vector4 unknown; int childCount; <блоки[childCount]>
Контейнер с неизвестными параметрами.
Контейнер (03)
Vector4 nodePosition; int childCount; <блоки[childCount]>
Простой контейнер.
Контейнер (04)
Vector4 nodePosition; char[32] spaceObject; char[32] linkedObject; int childCount; <блоки[childCount]>
Контейнер с возможностью его прямой привязки к другому объекту: в spaceObject можно задать имя локатора типа 24, и тогда данный контейнер будет привязан к позиции локатора. В linkedObject задаётся подключенный объект (например, коллизия).
Контейнер (05)
Vector4 nodePosition; char[32] linkedObject; int childCount; <блоки[childCount]>
Контейнер. Параметр linkedObject аналогично типу 04.
Контейнер-блок вершин (06)
Vector4 nodePosition; char[32] eventObject?; char[32] parentObject; int vertexCount; <vertsSimple[vertexCount]> int childCount; <блоки[childCount]>
Блок-контейнер вершин. Хранит в себе простые вершины (XYZ+UV). Скорее всего, как-то используется в связке с блоками событий.
Контейнер-блок вершин (07)
Vector4 nodePosition; char[32] spaceObject; int vertexCount; <vertsSimple[vertexCount]> int childCount; <блоки[childCount]>
Блок-контейнер вершин. Хранит в себе простые вершины (XYZ+UV). Параметр spaceObject задаёт локатор, к которому привязан данный 3D-объект.
Блок геометрии (08)
Vector4 nodePosition; int faceStructsNum; <faceStruct[faceStructsNum]>
Блок, хранящий в себе информацию о треугольниках 3D-модели. Вся геометрия, образованная блоком типа 08, при отрисовке имеет плоское затенение ("flat shading").
Контейнер (09)
Vector4 nodePosition; Vector4 eventBorder; int childCount; <блоки[childCount]>
Контейнер события. Плоскость eventBorder задаётся нормальным вектором и его длиной (она может быть отрицательной). Внутри контейнера данного типа могут быть и другие объекты типа 09. Границей события является сумма всех границ eventBorder родительских контейнеров по отношению к триггеру типа 13.
Контейнер-переключатель LOD (10)
Vector4 nodePosition; Vector4 LOD_xyzw; int childCount; <блоки[childCount]>
Контейнер LOD. Имеет две переключаемые группы. В первой расположены объекты, отрисовываемые в том случае, когда расстояние от LOD_xyz до наблюдателя меньше w. В противном случае будет отображаться вторая группа.
Контейнер (11)
Vector4 nodePosition; Vector4 some_vector1; Vector4 some_vector2; int childCount; <блоки[childCount]>
Контейнер неизвестного назначения. Встречается в старых b3d, например, в MirDemo.
Плоскость коллизии (12)
Vector4 nodePosition; Vector4 collisionPlane; int unknown; int collisionType; int childCount; <блоки[childCount]>
Плоскость коллизии (аналогична CollisionPlane из tech-файла). Определяется нормальным вектором и его длиной (она может быть отрицательной). Границей данной коллизии являются точки пересечений с другими объектами коллизии.
Триггер (13)
Vector4 nodePosition; int eventType; int eventValue; int paramsNum; <данные_события[paramsNum]>
Блок-триггер.
Типы триггера
no_rain_no_sun (22)
Параметры блока:
параметр | значение |
---|---|
eventType | 22 |
eventValue | 0 |
paramsNum | 0 |
Параметры события: отсутствуют.
weather_change (23)
Параметры блока:
параметр | значение |
---|---|
eventType | 23 |
eventValue | индекс варианта погоды из weather.ini |
paramsNum | 4 |
Параметры события: плоскость, заданная нормальным вектором и длиной, определяющая границу смены погоды.
тип | параметр | значение |
---|---|---|
Vector3 | direction | нормальный вектор |
float | length | длина вектора |
Загрузка модуля (4095)
Параметры блока:
параметр | значение |
---|---|
eventType | 4095 |
eventValue | 0 |
paramsNum | 1 |
Параметры события:
тип | параметр | значение |
---|---|---|
char[2] | moduleName | имя модуля из папки ENV |
byte | нулевой байт | 0x00 |
byte | закрывающий байт | 0xCD |
Событие (14)
Vector4 nodePosition; Vector4 eventPosition; int eventType; int eventValue; int paramsNum; <данные_события[paramsNum]>
Обработчик событий.
Типы событий
sell_<vehicle> (18)
Как-то связан с продажей автомобиля. Имеется только у автомобилей, доступных для заказа по рации(?) Расположен внутри главного контейнера автомобиля. Параметры блока:
параметр | значение |
---|---|
eventType | 18 |
eventValue | 0 |
paramsNum | 0 |
Параметры события: отсутствуют.
Nek_<vehicle> (25)
Без него сцепка полуприцепа неработоспособна. Значение eventPosition должно соответствовать параметру topSaddle данного полуприцепа в vehicle.tech! Расположен внутри главного контейнера полуприцепа. Параметры блока:
параметр | значение |
---|---|
eventType | 25 |
eventValue | 0 |
paramsNum | 0 |
Параметры события: отсутствуют.
Блок типа 16
Vector4 nodePosition; Vector3 some_data[3]; int some_value1; int some_value2;
Назначение неизвестно. Структура аналогична блоку типа 17.
Блок типа 17
Vector4 nodePosition; Vector3 some_data[3]; int some_value1; int some_value2;
Назначение неизвестно. Структура аналогична блоку типа 16.
Блок-связка (18)
Vector4 nodePosition; char[32] spaceObject; char[32] linkedObject;
Используется для добавления копий объектов. В spaceObject указывается имя блока-локатора типа 24, в linkedObject - имя подключаемого объекта. После загрузки сцены копия linkedObject будет расположена в позиции spaceObject, причём эта связь не единоразовая - при изменении позиции spaceObject изменится и позиция копии linkedObject.
Контейнер комнаты (19)
int childCount; <блоки[childCount]>
Используется для хранения комнат игрового мира.
Ломанная линия коллизии (20)
Vector4 nodePosition; int pointsCount; int some_value1; int some_value2; int some_value3; <float[some_value3]> <vertsSimple[pointsCount]>
Вертикальная коллизия, заданная ломанной линией. Используется для ограждения заборов и лесов. Имеет неограниченную высоту.
Контейнер-переключатель (21)
Vector4 nodePosition; int groupsCount; int defaultGroupIndex; int childCount; <блоки[childCount]>
Контейнер с переключаемым содержимым. По умолчанию отображается группа под индексом defaultGroupIndex (если состояние переключателя не задаётся постоянно кодом игры).
Если у контейнера есть префикс "refer_" в названии, то значение активной группы привязывается к такому же контейнеру, у которого нет такого префикса в имени. Например, отображаемая группа контейнера "refer_DashboardGlowKey" будет зависеть от состояния контейнера "DashboardGlowKey".
Некоторые переключатели, используемые на моделях транспорта
Данные приведены для игры "Дальнобойщики 2" версии 8.2.
Повреждения
имя блока | количество групп по умолчанию | описание |
---|---|---|
Damage1Key | 5 | Повреждения бампера. |
DamageFCKey | 3 | Повреждения капота. |
DamageFRKey | 4 | Повреждения переднего правого крыла. |
DamageFLKey | 4 | Повреждения переднего левого крыла. |
DamageRKey | 3 | Повреждения правой боковины кузова. |
DamageLKey | 3 | Повреждения левой боковины кузова. |
DamageBRKey | 4 | Повреждения заднего правого крыла. |
DamageBLKey | 4 | Повреждения заднего левого крыла. |
DamageBCKey | 3 | Повреждения багажника и/или заднего бампера. |
DamageWheel0Key | 4 | Повреждения I колеса. |
DamageWheel1Key | 4 | Повреждения II колеса. |
DamageWheel2Key | 4 | Повреждения III колеса. |
DamageWheel3Key | 4 | Повреждения IV колеса. |
DamageWheel4Key | 4 | Повреждения V колеса. |
DamageWheel5Key | 4 | Повреждения VI колеса. |
DamageWheel6Key | 4 | Повреждения VII колеса. |
DamageWheel7Key | 4 | Повреждения VIII колеса. |
Нумерация колёс транспорта ведётся слева-направо от передних к задним. Например, I колесо - это переднее левое, II - это переднее правое, и т.д.
Переключатели светотехники
имя блока | количество групп по умолчанию | описание |
---|---|---|
HeadLightKey | 2 | Фары головного света автомобиля. |
BackFaraKeyR, BackFaraKeyL | 2 | Свечение огня заднего хода. |
StopFaraKeyR, StopFaraKeyL | 3 | Задний фонарь. Группа II хранит свечение стоп-сигнала, группа III хранит свечение габаритного огня. |
Другие переключатели
имя блока | количество групп по умолчанию | описание |
---|---|---|
SizeLightKey | 2 | Габаритные огни кузова грузовика; I группа пустая, II хранит модели огней; в настройках блока группой по умолчанию должна быть II. |
HornKey | 2 | Модель гудка, отображаемая при его установке на СТО. |
SupportKey | 2 | Опоры полуприцепа. |
IconKey | 9 | Логотипы компаний, отображаемые на бортах грузовиков. |
CopSirenKey | 2 | Звуковая сирена автомобиля милиции. |
CopLightKey | 8 | Мигалки автомобиля милиции. |
Другие переключатели
имя блока | описание |
---|---|
GeometryKey | Переключает отображение вариантов моделей разной детализации в зависимости от настроек игры |
CollisionKey | Коллизия автомобиля (но неизвестно, как именно она используется) |
GlassKey | Лобовое стекло автомобиля, отображаемое в салоне во время дождя |
RD_Key | Улучшение "радар", устанавливаемое на СТО |
RD_LampKey | Свечение сигнальных ламп радара |
RedSvetKey | неизвестно |
GreenSvetKey | неизвестно |
TrafficLightKey0 | Светофор для дорожного трафика |
TrafficLightKey1 | Светофор для дорожного трафика |
Кроме того, в игре есть переключатели ILLUM_LEVEL_00 - ILLUM_LEVEL_15. Они используются в моделях домов для реализации света в окнах. Время работы данных переключателей приведено чуть далее на изображениях.
Геометрия коллизии (23)
int some_value1; int collisionType; int dataCount; <float[dataCount] someData> int polyCount; <collisionPolygon[polyCount] polygons>
struct collisionPolygon { int vertsCount; <Vector3[vertsCount] data>; };
Трёхмерная коллизия.
Локатор-контейнер (24)
Vector3 matrix0; Vector3 matrix1; Vector3 matrix2; Vector3 position; int caseState?; int childCount; <блоки[childCount]>
Хранит в себе позицию и вращение. Возможно, также является контейнером-переключателем по типу блока 21. В свойствах локаторов, дочерних данному, матрицы преобразования и позиции должны быть указаны в локальных координатах относительно родительского локатора.
Источник звука (25)
int num32767; int num2; int num256; char[32] soundName; Vector3 soundPosition; float some_value4; float some_value5; float some_value6; float _2xPI; float _PI; float some_value9; float soundRadius; float soundVolume;
Источник трёхмерного звука.
Блок типа 27
Vector4 nodePosition; int some_value1; Vector3 some_vector; int some_value2;
Назначение неизвестно.
Спрайт (28)
Vector4 nodePosition; Vector3 some_vector; int data_count; <spriteData[data_count]>
struct spriteData{ int format; float var1; int num_32767; int mtlIndex; int vertsCount; <spriteVertex[vertsCount] verts> }
int inter_format = format ^ 1 struct spriteVertex{ Vector2 position; if (inter_format & 2){ Vector2 UV; } }
Трёхмерный спрайт.
Контейнер-переключатель LOD (29)[2]
Vector4 nodePosition; int groupsCount; int defaultGroupIndex; <float[groupsCount] groups_render_distances> int childCount; <блоки[childCount]>
Расширенный контейнер LOD. Имеет неограниченное количество групп, для каждой из которых можно задать предельное расстояние отрисовки.
Портал (30)
Vector4 doorPosition; char[32] targetRoom; Vector3 doorLowVertex; Vector3 doorTopVertex;
Портал (дверь) между комнатами.
параметр | описание |
---|---|
doorPosition | позиция портала |
targetRoom | имя комнаты, в которую ведёт портал. Если комната находится в другом модуле, то имя задаётся в формате <модуль>:<комната> |
doorLowVertex | крайняя нижняя левая точка портала |
doorTopVertex | крайняя верхняя правая точка портала |
Важно!
- Если портал ведёт в комнату другого модуля, то в одной комнате с этим порталом обязательно должен быть загрузчик модуля (блок типа 13)
- Порталы соседних комнат должны иметь одинаковую позицию (doorPosition) и границы, в противном случае запрошенная комната не будет отображена
Блок типа 31
Vector4 nodePosition; int dataCount; Vector4 objectPosition int some_int; Vector3 some_vector; <Type31Data [dataCount]>
struct Type31data { float blendValue; int maskID; };
Назначение неизвестно. Предположительно, используется для отрисовки деревьев, заданных набором msk-файлов.
Источник света (33)
Vector4 nodePosition; int is_enabled; int unknown_var; int lightType; Vector3 lightPosition; Vector3 lightDirection; float falloff; float attenuation0; float attenuation1; float attenuation1; float theta; float phi; float R; float G; float B; int childCount; <блоки[childCount]>
Источник света DirectX 8.
параметр | описание[3] |
---|---|
lightType | тип источника света: 1 - направленный (directional), 2 - точечный (point), 3 - зональный (spot) |
lightPosition | позиция источника света |
lightDirection | направление освещения (нормальный вектор) |
falloff | уменьшение освещения между внутренним конусом (theta) и внешним конусом (phi) источника света |
attenuation0 | постоянное затухание |
attenuation1 | линейное затухание |
attenuation2 | квадратичное затухание |
theta | угол внутреннего конуса в радианах, для нацеленного источника света. Это значение может принимать от 0 до значения Phi |
phi | угол внешнего конуса источника света. Т.е. вне этого конуса свет уже не освещает. Может принимать значения между 0 и числом Пи. |
Блок типа 34
Vector4 nodePosition; int some_value; int dataCount; <Type34Data[dataCount]>
struct Type34Data{ float x; float y; float z; int var; };
Назначение неизвестно.
Блок геометрии (35)
Vector4 nodePosition; int faceStructType; int materialIndex; int faceStructsNum; <faceStruct[faceStructsNum]>
Блок, хранящий в себе информацию о треугольниках 3D-модели. Вся геометрия, образованная блоком типа 35, при отрисовке имеет затенение по Гуро ("Gourand shading"). В отличие от типа 08, может иметь только один используемый материал и один тип faceStruct. Индекс материала, заданный внутри faceStruct, игнорируется.
Контейнер-блок вершин (36)
Vector4 nodePosition; char[32] spaceObject; char[32] linkedObject; int vertsStructType; int vertsStructsNum; <vertsStruct[vertsStructsNum]> int childCount; <блоки[childCount]>
Блок-контейнер вершин. Хранит в себе сложные вершины (тип определяется vertsStructType - могут быть и нормали, и несколько слоёв UV, и другие данные). В spaceObject можно задать имя локатора типа 24, и тогда данный контейнер будет привязан к позиции локатора. В linkedObject задаётся подключенный объект (например, коллизия).
Контейнер-блок вершин (37)
Vector4 nodePosition; char[32] linkedObject; int vertsStructType; int vertsStructsNum; <vertsStruct[vertsStructsNum]> int childCount; <блоки[childCount]>
Блок-контейнер вершин. Хранит в себе сложные вершины (тип определяется vertsStructType - могут быть и нормали, и несколько слоёв UV, и другие данные).
Контейнер-блок типа 39
Vector4 nodePosition; Vector4 some_vector; int some_value; int childCount; <блоки[childCount]>
Назначение неизвестно.
Генератор объектов (40)
Vector4 nodePosition; char[32] some_string; char[32] generatorClass; int generatorType; int some_value; int paramsNum; <данные_генератора[paramsNum]>
Генератор объектов. До конца не изучен.
Типы генераторов
generatorClass | описание |
---|---|
$$TreeGenerator | Генератор деревьев. Использовался в версиях 4.0 - 5.5. Использование в более поздних версиях игры возможно, но приводит к сообщениям в warn.log. |
$$TreeGenerator1 | Генератор сбиваемых деревьев. Используется в версиях игры, начиная с 6.6. |
$$People | Создаёт модели людей и животных в определённое время суток в указанных локациях. |
$$GeneratorOfTerrain | Генератор ландшафта в Алмазном. |
$$CollisionOfTerrain | Генератор коллизии в Алмазном. |
$$StaticGlow | неизвестно, не встречается в игре |
$$DynamicGlow | Создаёт блики от источников света, изменяющиеся от расстояния до наблюдателя. Есть во многих b3d-файлах игрового мира. |
$$WeldingSparkles | Излучатель искр. Используется в bb.b3d. |
$$SeaGenerator | неизвестно, не встречается в игре |
Технические ограничения (Дальнобойщики II)
- На одну отрисовываемую 3D-модель должно приходиться не более 1023 вершин;
- Число одновременно активных источников света не должно быть более 8 (?), в противном случае игра будет их отключать, пока количество сократится до допустимого.
Дальнобойщики 2 | ||
---|---|---|
Игровое наполнение | Игровой регион • Автопарк • Саундтрек • Вступительный ролик • Рация • Милиция • Вертолёт | |
Моддинг | Модификации • Утилиты • game.cnf • sch-файлы • vehicle.tech • truck.ini | |
Разное | История версий • Советы и секреты • Бонусный диск • Управление • Авторы |