B3D (формат файлов): различия между версиями

Материал из RnR Wiki
Перейти к навигации Перейти к поиску
Строка 87: Строка 87:
 
  };
 
  };
  
==Блок 00==
+
==Блок (00)==
 
  char[32] some_name
 
  char[32] some_name
 
  Vector3  some_position
 
  Vector3  some_position
  
 
Назначение неизвестно. Обычно расположен сразу после списка материалов в любом b3d-файле.
 
Назначение неизвестно. Обычно расположен сразу после списка материалов в любом b3d-файле.
==Блок 01==
+
==Обозреватель (01)==
 
  char[32] start_space //имя локатора типа 24, задаёт начальную позицию обозревателя
 
  char[32] start_space //имя локатора типа 24, задаёт начальную позицию обозревателя
 
  char[32] start_room  //имя комнаты типа 19
 
  char[32] start_room  //имя комнаты типа 19
  
 
Обозреватель (Viewer).
 
Обозреватель (Viewer).
==Контейнер 02==
+
==Контейнер (02)==
 
  Vector4 position;
 
  Vector4 position;
 
  Vector4 unknown;
 
  Vector4 unknown;
Строка 104: Строка 104:
  
 
Контейнер с неизвестными параметрами.
 
Контейнер с неизвестными параметрами.
==Контейнер 03==
+
==Контейнер (03)==
 
  Vector4 position;
 
  Vector4 position;
 
  int    childCount;
 
  int    childCount;
Строка 110: Строка 110:
  
 
Простой контейнер.
 
Простой контейнер.
==Контейнер 04==
+
==Контейнер (04)==
 
  Vector4  position;
 
  Vector4  position;
  char[32] parentObject;
+
  char[32] spaceObject;
 
  char[32] linkedObject;
 
  char[32] linkedObject;
 
  int      childCount;
 
  int      childCount;
 
  <блоки[childCount]>
 
  <блоки[childCount]>
  
Контейнер с возможностью его прямой привязки к другому объекту: в parentObject можно задать имя локатора типа 24, и тогда данный контейнер будет привязан к позиции локатора. В linkedObject задаётся подключенный объект (например, коллизия).
+
Контейнер с возможностью его прямой привязки к другому объекту: в spaceObject можно задать имя локатора типа 24, и тогда данный контейнер будет привязан к позиции локатора. В linkedObject задаётся подключенный объект (например, коллизия).
==Контейнер 05==
+
==Контейнер (05)==
 
  Vector4  position;
 
  Vector4  position;
 
  char[32] linkedObject;
 
  char[32] linkedObject;
Строка 131: Строка 131:
 
==Блок типа 10==
 
==Блок типа 10==
 
==Блок типа 11==
 
==Блок типа 11==
==Коллизия типа 12==
+
==Плоскость коллизии (12)==
 
  Vector4  position;
 
  Vector4  position;
 
  Vector4  collisionPlane;
 
  Vector4  collisionPlane;
Строка 145: Строка 145:
 
==Блок типа 16==
 
==Блок типа 16==
 
==Блок типа 17==
 
==Блок типа 17==
==Блок типа 18==
+
==Блок-связка (18)==
==Блок типа 19==
+
Vector4 nodePosition;
==Блок типа 20==
+
char[32] spaceObject;
==Блок типа 21==
+
char[32] linkedObject;
==Блок типа 22==
+
 
==Блок типа 23==
+
Используется для добавления копий объектов. В spaceObject указывается имя блока-локатора типа 24, в linkedObject - имя подключаемого объекта. После загрузки сцены копия linkedObject будет расположена в позиции spaceObject, причём эта связь не единоразовая - при изменении позиции spaceObject изменится и позиция копии linkedObject.
==Блок типа 24==
+
==Контейнер комнаты (19)==
==Блок типа 25==
+
int      childCount;
 +
<блоки[childCount]>
 +
 
 +
Используется для хранения комнат игрового мира.
 +
==Ломанная коллизии (20)==
 +
==Контейнер-переключатель (21)==
 +
==Геометрия коллизии (23)==
 +
==Локатор-контейнер (24)==
 +
Vector3 matrix0;
 +
Vector3 matrix1;
 +
Vector3 matrix2;
 +
Vector3 position;
 +
int    caseState?;
 +
int    childCount;
 +
<блоки[childCount]>
 +
 
 +
Хранит в себе позицию и вращение. Возможно, также является контейнером-переключателем по типу блока 21.
 +
==Звуковой объект (25)==
 
==Блок типа 26==
 
==Блок типа 26==
 
==Блок типа 27==
 
==Блок типа 27==
Строка 160: Строка 177:
 
==Блок типа 31==
 
==Блок типа 31==
 
==Блок типа 32==
 
==Блок типа 32==
==Блок типа 33==
+
==Источник света (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.
 +
{| class="wikitable"
 +
|-
 +
! параметр !! описание<ref>https://firststeps.ru/mfc/directx/dxhelp/r.php?59</ref>
 +
|-
 +
| lightType || тип источника света: 1 - направленный (directional), 2 - точечный (point), 3 - зональный (spot)
 +
|-
 +
| lightPosition || позиция источника света
 +
|-
 +
| lightDirection || направление освещения (нормальный вектор)
 +
|-
 +
| falloff || уменьшение освещения между внутренним конусом (theta) и внешним конусом (phi) источника света
 +
|-
 +
| attenuation0  || постоянное затухание
 +
|-
 +
| attenuation1  || линейное затухание
 +
|-
 +
| attenuation2  || квадратичное затухание
 +
|-
 +
| theta || угол внутреннего конуса в радианах, для нацеленного источника света. Это значение может принимать от 0 до значения Phi
 +
|-
 +
| phi  || угол внешнего конуса источника света. Т.е. вне этого конуса свет уже не освещает. Может принимать значения между 0 и числом Пи.
 +
|}
 +
 
 
==Блок типа 34==
 
==Блок типа 34==
 
==Блок типа 35==
 
==Блок типа 35==
Строка 167: Строка 226:
 
==Блок типа 38==
 
==Блок типа 38==
 
==Блок типа 39==
 
==Блок типа 39==
==Блок типа 40==
+
==Генератор объектов (40)==
  
 
{{Дб2}}
 
{{Дб2}}
  
 
= Примечания =
 
= Примечания =

Версия 17:37, 14 сентября 2025

Описание формата *.b3d игр Дальнобойщики: Путь к победе и Дальнобойщики 2. Данный формат представляет собой трёхмерную сцену с различными типами объектов: контейнерами, переключателями, триггерами, источниками освещения, геометрией и т.п.[1]. Инструменты для работы с B3D представлены на странице с утилитами. Сам формат, предположительно, создан в первой половине 90-х годов ХХ века.

Содержание

Общее описание структуры файла

Формат 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

Блок типа 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

Блок типа 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
Игровое наполнение Игровой регионАвтопаркСаундтрекВступительный роликРацияМилицияВертолёт
Дб2t.jpg
Моддинг МодификацииУтилитыgame.cnfsch-файлыvehicle.techtruck.ini
Разное История версийСоветы и секретыБонусный дискУправлениеАвторы


Примечания