B3D (формат файлов): различия между версиями
м (→Контейнер комнаты (41)) |
м (→Источник света (33)) |
||
| (не показаны 2 промежуточные версии этого же участника) | |||
| Строка 154: | Строка 154: | ||
* Параметр nodePosition у объектов никак не влияет на их позицию! Скорее всего, он нужен лишь для оптимизации отрисовки. | * Параметр nodePosition у объектов никак не влияет на их позицию! Скорее всего, он нужен лишь для оптимизации отрисовки. | ||
* Поиск объектов, указанных в текстовых полях (linkedObject, spaceObject и т.п.) происходит во всех загруженных в память b3d-файлах. То есть допускается давать в одном b3d-файле ссылки на объекты из другого b3d. | * Поиск объектов, указанных в текстовых полях (linkedObject, spaceObject и т.п.) происходит во всех загруженных в память b3d-файлах. То есть допускается давать в одном b3d-файле ссылки на объекты из другого b3d. | ||
| − | * В игре «Дальнобойщики: Путь к победе» было только | + | * В игре «Дальнобойщики: Путь к победе» было только 35 типов объектов (1 - 33, 41 и 42). К выходу «Дальнобойщиков 2» их количество было увеличено до 41. |
==Блок (00)== | ==Блок (00)== | ||
| Строка 695: | Строка 695: | ||
<блоки[childCount]> | <блоки[childCount]> | ||
| − | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
| Строка 807: | Строка 806: | ||
==Контейнер комнаты (41)== | ==Контейнер комнаты (41)== | ||
Vector4 nodePosition; | Vector4 nodePosition; | ||
| − | int | + | int paramsCount; |
<int[paramsCount] params> | <int[paramsCount] params> | ||
| − | int | + | int childCount; |
<блоки[childCount]> | <блоки[childCount]> | ||
| − | Ещё один вариант контейнера комнаты. Поддерживается игрой, но не используется ни в одном из файлов. Параметров | + | Ещё один вариант контейнера комнаты. Поддерживается игрой, но не используется ни в одном из файлов. Параметров может быть не более двух. |
= Технические ограничения (Дальнобойщики II) = | = Технические ограничения (Дальнобойщики II) = | ||
Текущая версия на 14:54, 23 октября 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 Блок типа 15
- 2.20 Блок типа 16
- 2.21 Блок типа 17
- 2.22 Блок-связка (18)
- 2.23 Контейнер комнаты (19)
- 2.24 Ломанная линия коллизии (20)
- 2.25 Контейнер-переключатель (21)
- 2.26 Контейнер типа 22
- 2.27 Геометрия коллизии (23)
- 2.28 Локатор-контейнер (24)
- 2.29 Источник звука (25)
- 2.30 Контейнер типа 26
- 2.31 Блок типа 27
- 2.32 Спрайт (28)
- 2.33 Контейнер-переключатель LOD (29)[3]
- 2.34 Портал (30)
- 2.35 Набор спрайтов (31)
- 2.36 Источник света (33)
- 2.37 Блок типа 34
- 2.38 Блок геометрии (35)
- 2.39 Контейнер-блок вершин (36)
- 2.40 Контейнер-блок вершин (37)
- 2.41 Контейнер-блок типа 39
- 2.42 Генератор объектов (40)
- 2.43 Контейнер комнаты (41)
- 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.
- В игре «Дальнобойщики: Путь к победе» было только 35 типов объектов (1 - 33, 41 и 42). К выходу «Дальнобойщиков 2» их количество было увеличено до 41.
Блок (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 border; int childCount; <блоки[childCount]>
Контейнер. Плоскость border задаётся нормальным вектором и его длиной (она может быть отрицательной). Внутри контейнера данного типа могут быть и другие объекты типа 09.
Данный контейнер может:
- Использоваться в качестве ограничителя зоны отрисовки объекта (повсеместно применяется в "Дальнобойщиках 2" в контейнерах коллизии игрового мира). В таком случае отрисовка происходит относительно тангенса, перпендикулярного указанному вектору border[2].
- Задавать границы события. В таком случае границей события будет сумма всех border родительских контейнеров по отношению к триггеру типа 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 |
Параметры события: отсутствуют.
Блок типа 15
Vector4 nodePosition; Vector3 some_data[3]; int some_value1; int some_value2;
Назначение неизвестно. Предположительно, структура аналогична блоку типа 16. Не встречается в файлах игры.
Блок типа 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. Они используются в моделях домов для реализации света в окнах. Время работы данных переключателей приведено чуть далее на изображениях.
Контейнер типа 22
Vector4 nodePosition; Vector4 some_vector; int childCount; <блоки[childCount]>
Назначение неизвестно.
Геометрия коллизии (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;
Источник трёхмерного звука.
Контейнер типа 26
Vector4 nodePosition; Vector3 some_vector1; Vector3 some_vector2; Vector3 some_vector3; int childCount; <блоки[childCount]>
Назначение неизвестно.
Блок типа 27
Vector4 nodePosition; Vector3 some_vector1; int some_value1; Vector3 some_vector2;
Назначение неизвестно.
Спрайт (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;
}
}
Трёхмерный спрайт. Использует материал с текстурой формата TXR.
Контейнер-переключатель LOD (29)[3]
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 spritePosition?; <Type31Data [dataCount]>
struct Type31data {
float blendValue;
int maskID;
};
Трёхмерный спрайт. Использует маску формата MSK, в отличие от типа 28. В Type31Data указаны разные варианты масок, в порядке возрастания разрешения текстуры. Судя по всему, переключение отображаемой маски происходит в зависимости от расстояния до наблюдателя.
Источник света (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]>
| параметр | описание[4] |
|---|---|
| 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 | неизвестно, не встречается в игре |
Контейнер комнаты (41)
Vector4 nodePosition; int paramsCount; <int[paramsCount] params> int childCount; <блоки[childCount]>
Ещё один вариант контейнера комнаты. Поддерживается игрой, но не используется ни в одном из файлов. Параметров может быть не более двух.
Технические ограничения (Дальнобойщики II)
- На одну отрисовываемую 3D-модель должно приходиться не более 1023 вершин;
- Число одновременно активных источников света не должно быть более 8 (?), в противном случае игра будет их отключать, пока количество сократится до допустимого.
- На каждую вершину 3D-модели на данном слое UV-развёртки в блоке вершин может приходиться только одна пара UV-координат. Иными словами, недопускается, чтобы одна и та же вершина, используемая в разных треугольниках, имела разные UV-координаты. На каждый островок UV должен приходиться свой набор вершин. Впрочем, данное ограничение можно обойти, указывая индивидуальные координаты вершин каждого треугольника в блоке геометрии. Но в таком случае отражения (см. параметр "env" в RES) будут рассчитываться не для всей модели, а для каждого треугольника.
| Дальнобойщики 2 | ||
|---|---|---|
| Игровое наполнение | Игровой регион • Автопарк • Саундтрек • Вступительный ролик • Рация • Милиция • Вертолёт | |
| Моддинг | Модификации • Утилиты • truck.ini | |
| Форматы ресурсов | B3D • OVL • RES • game.cnf • sch-файлы • vehicle.tech | |
| Разное | История версий • Советы и секреты • Бонусный диск • Управление • Авторы | |