Глава 4.8: Моделирование зданий --- Двери и лестницы
Главная | << Назад: Руководство по Workbench | Моделирование зданий
Введение
Здания в DayZ --- это не просто статичный фон. Игроки постоянно взаимодействуют с ними --- открывают двери, поднимаются по лестницам, укрываются за стенами. Создание пользовательского здания с поддержкой этих взаимодействий требует тщательной настройки модели: дверям нужны оси вращения и именованные выделения в нескольких LOD, а лестницам --- точно расставленные пути подъёма, определяемые исключительно через вершины Memory LOD.
Эта глава охватывает полный рабочий процесс добавления интерактивных дверей и проходимых лестниц в пользовательские модели зданий на основе официальной документации Bohemia Interactive.
Предварительные требования
- Настроенный Work-drive со структурой папок вашего пользовательского мода.
- Object Builder (из пакета DayZ Tools) с настроенным Buldozer (предпросмотр модели).
- Возможность бинаризации и упаковки файлов пользовательского мода в PBO.
- Знакомство с системой LOD и именованными выделениями (рассмотрено в Главе 4.2: 3D-модели).
Содержание
- Обзор
- Конфигурация дверей
- Конфигурация лестниц
- Сводка требований к модели
- Лучшие практики
- Распространённые ошибки
- Ссылки
Конфигурация дверей
Интерактивные двери требуют сочетания трёх элементов: P3D-модели с правильно именованными выделениями и точками памяти, model.cfg, определяющего скелет анимации и параметры вращения, и config.cpp --- игровой конфигурации, связывающей дверь со звуками, зонами урона и игровой логикой.
Настройка модели для дверей
Дверь в P3D-модели должна включать следующее:
Именованные выделения во всех соответствующих LOD. Геометрия, представляющая дверь, должна быть назначена именованному выделению (например,
door1) в каждом из этих LOD:- Resolution LOD --- визуальная сетка, которую видит игрок.
- Geometry LOD --- форма физического столкновения. Также должен содержать именованное свойство
classсо значениемhouse. - View Geometry LOD --- используется для проверок видимости и рейкастинга действий. Имя выделения здесь соответствует параметру
componentв игровой конфигурации. - Fire Geometry LOD --- используется для баллистического обнаружения попаданий.
Вершины Memory LOD, определяющие:
- Ось вращения --- две вершины, формирующие ось вращения, назначенные именованному выделению, например
door1_axis. Эта ось определяет линию петель, вокруг которой дверь поворачивается. - Позицию звука --- вершина, назначенная именованному выделению, например
door1_action, отмечающая, откуда исходят звуки двери. - Позицию виджета действия --- где отображается виджет взаимодействия для игрока.
- Ось вращения --- две вершины, формирующие ось вращения, назначенные именованному выделению, например
Рекомендуемые размеры дверей
Почти все двери в ванильном DayZ имеют размер 120 x 220 см (ширина x высота). Использование этих стандартных размеров гарантирует корректность анимаций и естественное прохождение персонажей через проёмы. Моделируйте двери закрытыми по умолчанию и анимируйте их в открытое положение --- Bohemia планирует поддержку открытия дверей в обоих направлениях в будущем.
model.cfg --- Скелеты и анимации
Любая анимированная дверь требует файла model.cfg. Эта конфигурация определяет костную структуру (скелет) и параметры анимации. Разместите model.cfg рядом с файлом модели или выше в структуре папок --- точное расположение гибкое, если бинаризатор может его найти.
model.cfg имеет два раздела:
CfgSkeletons
Определяет анимируемые кости. Каждая дверь получает запись кости. Кости перечисляются парами: имя кости и её родитель (пустая строка "" для корневых костей).
class CfgSkeletons
{
class Default
{
isDiscrete = 1;
skeletonInherit = "";
skeletonBones[] = {};
};
class Skeleton_2door: Default
{
skeletonInherit = "Default";
skeletonBones[] =
{
"door1", "",
"door2", ""
};
};
};CfgModels
Определяет анимации для каждой кости. Имя класса в CfgModels должно совпадать с именем файла вашей модели (без расширения), чтобы связь работала.
class CfgModels
{
class Default
{
sectionsInherit = "";
sections[] = {};
skeletonName = "";
};
class yourmodelname: Default
{
skeletonName = "Skeleton_2door";
class Animations
{
class Door1
{
type = "rotation";
selection = "door1";
source = "door1";
axis = "door1_axis";
memory = 1;
minValue = 0;
maxValue = 1;
angle0 = 0;
angle1 = 1.4;
};
class Door2
{
type = "rotation";
selection = "door2";
source = "door2";
axis = "door2_axis";
memory = 1;
minValue = 0;
maxValue = 1;
angle0 = 0;
angle1 = -1.4;
};
};
};
};Описание ключевых параметров:
| Параметр | Описание |
|---|---|
type | Тип анимации. Используйте "rotation" для распашных дверей, "translation" для раздвижных. |
selection | Именованное выделение в модели, которое должно быть анимировано. |
source | Связь с классом Doors в игровой конфигурации. Должен совпадать с именем класса в config.cpp. |
axis | Именованное выделение в Memory LOD, определяющее ось вращения (две вершины). |
memory | Установите 1, чтобы указать, что ось определена в Memory LOD. |
minValue / maxValue | Диапазон фазы анимации. Обычно от 0 до 1. |
angle0 / angle1 | Углы поворота в радианах. angle1 определяет, насколько далеко открывается дверь. Используйте отрицательные значения для обратного направления. Значение 1.4 радиан --- это приблизительно 80 градусов. |
Проверка в Buldozer
После написания model.cfg откройте модель в Object Builder с запущенным Buldozer. Используйте клавиши [ и ] для переключения между доступными источниками анимации, а ; / ' (или колесо мыши вверх/вниз) для продвижения или отката анимации. Это позволяет убедиться, что дверь правильно поворачивается на своей оси.
Игровая конфигурация (config.cpp)
Игровая конфигурация связывает анимированную модель с игровыми системами --- звуками, уроном и логикой состояния дверей. Имя класса конфигурации должно следовать паттерну land_modelname для корректной связи с моделью.
class CfgPatches
{
class yourcustombuilding
{
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredAddons[] = {"DZ_Data"};
author = "yourname";
name = "addonname";
url = "";
};
};
class CfgVehicles
{
class HouseNoDestruct;
class land_modelname: HouseNoDestruct
{
model = "\path\to\your\model\file.p3d";
class Doors
{
class Door1
{
displayName = "door 1";
component = "Door1";
soundPos = "door1_action";
animPeriod = 1;
initPhase = 0;
initOpened = 0.5;
soundOpen = "sound open";
soundClose = "sound close";
soundLocked = "sound locked";
soundOpenABit = "sound openabit";
};
class Door2
{
displayName = "door 2";
component = "Door2";
soundPos = "door2_action";
animPeriod = 1;
initPhase = 0;
initOpened = 0.5;
soundOpen = "sound open";
soundClose = "sound close";
soundLocked = "sound locked";
soundOpenABit = "sound openabit";
};
};
class DamageSystem
{
class GlobalHealth
{
class Health
{
hitpoints = 1000;
};
};
class GlobalArmor
{
class Projectile
{
class Health { damage = 0; };
class Blood { damage = 0; };
class Shock { damage = 0; };
};
class Melee
{
class Health { damage = 0; };
class Blood { damage = 0; };
class Shock { damage = 0; };
};
};
class DamageZones
{
class Door1
{
class Health
{
hitpoints = 1000;
transferToGlobalCoef = 0;
};
componentNames[] = {"door1"};
fatalInjuryCoef = -1;
class ArmorType
{
class Projectile
{
class Health { damage = 2; };
class Blood { damage = 0; };
class Shock { damage = 0; };
};
class Melee
{
class Health { damage = 2.5; };
class Blood { damage = 0; };
class Shock { damage = 0; };
};
};
};
class Door2
{
class Health
{
hitpoints = 1000;
transferToGlobalCoef = 0;
};
componentNames[] = {"door2"};
fatalInjuryCoef = -1;
class ArmorType
{
class Projectile
{
class Health { damage = 2; };
class Blood { damage = 0; };
class Shock { damage = 0; };
};
class Melee
{
class Health { damage = 2.5; };
class Blood { damage = 0; };
class Shock { damage = 0; };
};
};
};
};
};
};
};Описание параметров конфигурации дверей:
| Параметр | Описание |
|---|---|
component | Именованное выделение в View Geometry LOD, используемое для этой двери. |
soundPos | Именованное выделение в Memory LOD, где воспроизводятся звуки двери. |
animPeriod | Скорость анимации двери (в секундах). |
initPhase | Начальная фаза анимации (0 = закрыта, 1 = полностью открыта). Проверяйте в Buldozer, какое значение соответствует какому состоянию. |
initOpened | Вероятность того, что дверь заспавнится открытой в мире. 0.5 означает 50% шанс. |
soundOpen | Класс звука из CfgActionSounds, воспроизводимый при открытии двери. Доступные наборы звуков см. в DZ\sounds\hpp\config.cpp. |
soundClose | Класс звука, воспроизводимый при закрытии двери. |
soundLocked | Класс звука при попытке игрока открыть запертую дверь. |
soundOpenABit | Класс звука при взломе игроком запертой двери. |
Важные замечания по конфигурации:
- Все здания в DayZ наследуют от
HouseNoDestruct. - Каждое имя класса в
class Doorsдолжно соответствовать параметруsource, определённому вmodel.cfg. - Раздел
DamageSystemдолжен включать подклассDamageZonesдля каждой двери. МассивcomponentNames[]ссылается на именованное выделение из Fire Geometry LOD модели. - Добавление именованного свойства
class=houseи класса игровой конфигурации требует повторной бинаризации вашего ландшафта (пути моделей в файлах.wrpзаменяются ссылками на классы игровой конфигурации).
Двойные двери
Двойные двери (две створки, открывающиеся вместе от одного взаимодействия) распространены в DayZ. Они требуют специальной настройки:
В модели:
- Настройте каждую створку как отдельную дверь с собственным именованным выделением (например,
door3_1иdoor3_2). - В Memory LOD точка действия должна быть общей для обеих створок --- используйте одно именованное выделение и одну вершину для позиции действия.
- Именованное выделение без суффикса (например,
door3без суффикса створки) должно охватывать обе дверные ручки. - View Geometry и Fire Geometry требуют дополнительного именованного выделения, охватывающего обе створки вместе.
В model.cfg:
- Определите каждую створку как отдельный класс анимации, но установите одинаковый параметр
sourceдля обеих створок (например,"doors34"для обеих). - Установите
angle1с положительным значением для одной створки и отрицательным для другой, чтобы они открывались в противоположных направлениях.
В config.cpp:
- Определите только один класс в
class Doors, имя которого совпадает с общим параметромsource. - Аналогично определите только одну запись в
DamageZonesдля пары двойных дверей.
Раздвижные двери
Для дверей, которые скользят по направляющей вместо поворота (например, ворота амбара или раздвижные панели), измените type анимации в model.cfg с "rotation" на "translation". Вершины оси в Memory LOD тогда определяют направление движения вместо оси вращения.
Проблемы ограничивающей сферы
По умолчанию ограничивающая сфера модели рассчитывается так, чтобы содержать весь объект. Когда двери смоделированы в закрытом положении, открытое положение может выходить за пределы этой ограничивающей сферы. Это вызывает проблемы:
- Действия перестают работать --- рейкастинг для взаимодействия с дверью не срабатывает с определённых углов.
- Баллистика игнорирует дверь --- пули проходят через геометрию, находящуюся за пределами ограничивающей сферы.
Решение: Создайте именованное выделение в Memory LOD, охватывающее большую область, которую здание занимает, когда двери полностью открыты. Затем добавьте параметр bounding в ваш класс игровой конфигурации:
class land_modelname: HouseNoDestruct
{
bounding = "selection_name";
// ... остальная конфигурация
};Это переопределяет автоматический расчёт ограничивающей сферы, охватывая все позиции дверей.
Конфигурация лестниц
В отличие от дверей, лестницы в DayZ не требуют конфигурации анимации и специальных записей в игровой конфигурации помимо базового класса здания. Вся настройка лестницы выполняется через размещение вершин в Memory LOD и одно выделение View Geometry. Это делает лестницы проще в настройке, чем двери, но размещение вершин должно быть точным.
Поддерживаемые типы лестниц
DayZ поддерживает два типа лестниц:
- Вход спереди снизу с боковым выходом наверху --- игрок подходит спереди внизу и выходит в сторону наверху (у стены).
- Вход спереди снизу с выходом вперёд наверху --- игрок подходит спереди внизу и выходит вперёд наверху (на крышу или платформу).
Оба типа также поддерживают промежуточные боковые точки входа и выхода, позволяющие игрокам садиться на лестницу и сходить с неё на промежуточных этажах. Лестницы также можно размещать под углом, а не строго вертикально.
Именованные выделения Memory LOD
Лестница полностью определяется именованными вершинами в Memory LOD. Каждое имя выделения начинается с ladderN_, где N --- идентификатор лестницы, начиная с 1. Здание может иметь несколько лестниц (ladder1_, ladder2_, ladder3_ и т.д.).
Вот полный набор именованных выделений для лестницы:
| Именованное выделение | Описание |
|---|---|
ladderN_bottom_front | Определяет нижнюю ступень входа --- где игрок начинает подъём. |
ladderN_middle_left | Определяет промежуточную точку входа/выхода (левая сторона). Может содержать несколько вершин, если лестница проходит через несколько этажей. |
ladderN_middle_right | Определяет промежуточную точку входа/выхода (правая сторона). Может содержать несколько вершин для многоэтажных лестниц. |
ladderN_top_front | Определяет верхнюю ступень выхода --- где игрок заканчивает подъём (тип выхода вперёд). |
ladderN_top_left | Определяет направление верхнего выхода для пристенных лестниц (левая сторона). Должна быть на 5 ступеней выше уровня пола (примерно рост стоящего на лестнице игрока). |
ladderN_top_right | Определяет направление верхнего выхода для пристенных лестниц (правая сторона). Те же требования к высоте, что и для top_left. |
ladderN | Определяет, где отображается виджет действия "Встать на лестницу" для игрока. |
ladderN_dir | Определяет направление, с которого можно подойти к лестнице (направление подхода). |
ladderN_con | Точка измерения для действия входа. Должна быть размещена на уровне пола. |
ladderN_con_dir | Определяет направление 180-градусного конуса (исходящего из ladderN_con), в пределах которого доступно действие входа на лестницу. |
Каждый из них --- это вершина (или набор вершин для промежуточных точек), которую вы размещаете вручную в Memory LOD в Object Builder.
Требования к View Geometry
Помимо настройки Memory LOD, вы должны создать компонент View Geometry с именованным выделением ladderN. Это выделение должно охватывать весь объём лестницы --- полную высоту и ширину области подъёма. Без этого выделения View Geometry лестница не будет функционировать корректно.
Размеры лестниц
Анимации подъёма по лестнице рассчитаны на фиксированные размеры. Ваши перекладины и расстояние между ними должны соответствовать пропорциям ванильных лестниц, чтобы анимации совпадали корректно. Обратитесь к официальному репозиторию DayZ Samples за точными замерами --- образцы частей лестниц такие же, как используемые на большинстве ванильных зданий.
Пространство для столкновений
Персонажи сталкиваются с геометрией во время подъёма по лестнице. Это означает, что вы должны обеспечить достаточно свободного пространства вокруг лестницы для поднимающегося персонажа в обоих:
- Geometry LOD --- физическое столкновение.
- Roadway LOD --- взаимодействие с поверхностью.
Если пространство слишком тесное, персонаж будет проникать сквозь стены или застревать во время анимации подъёма.
Требования конфигурации для лестниц
В отличие от серии Arma, DayZ не требует массива ladders[] в классе игровой конфигурации. Однако две вещи по-прежнему необходимы:
- Ваша модель должна иметь представление в конфигурации ---
config.cppс классомCfgVehicles(тот же базовый класс, что используется для дверей; см. раздел конфигурации дверей выше). - Geometry LOD должен содержать именованное свойство
classсо значениемhouse.
Помимо этих двух требований, лестница полностью определяется вершинами Memory LOD и выделением View Geometry. Записи анимации в model.cfg не нужны.
Сводка требований к модели
Здания с дверями и лестницами должны включать несколько LOD, каждый из которых служит определённой цели. Таблица ниже обобщает, что должен содержать каждый LOD:
| LOD | Назначение | Требования для дверей | Требования для лестниц |
|---|---|---|---|
| Resolution LOD | Визуальная сетка, отображаемая игроку. | Именованное выделение для геометрии двери (например, door1). | Нет специальных требований. |
| Geometry LOD | Обнаружение физических столкновений. | Именованное выделение для геометрии двери. Именованное свойство class = "house". | Именованное свойство class = "house". Достаточный зазор вокруг лестницы для поднимающихся персонажей. |
| Fire Geometry LOD | Баллистическое обнаружение попаданий (пули, снаряды). | Именованное выделение, совпадающее с componentNames[] в конфигурации зоны урона. | Нет специальных требований. |
| View Geometry LOD | Проверки видимости, рейкастинг действий. | Именованное выделение, совпадающее с параметром component в конфигурации дверей. | Именованное выделение ladderN, охватывающее полный объём лестницы. |
| Memory LOD | Определения осей, точки действий, позиции звуков. | Вершины оси (door1_axis), позиция звука (door1_action), позиция виджета действия. | Полный набор вершин лестницы (ladderN_bottom_front, ladderN_top_left, ladderN_dir, ladderN_con и т.д.). |
| Roadway LOD | Взаимодействие персонажей с поверхностью. | Обычно не требуется. | Достаточный зазор вокруг лестницы для поднимающихся персонажей. |
Согласованность именованных выделений
Критическое требование: именованные выделения должны быть согласованы во всех LOD, которые на них ссылаются. Если выделение называется door1 в Resolution LOD, оно должно также называться door1 в Geometry, Fire Geometry и View Geometry LOD. Несовпадение имён между LOD приведёт к тому, что дверь или лестница молча перестанут работать.
Лучшие практики
Моделируйте двери закрытыми по умолчанию. Анимируйте от закрытого к открытому. Bohemia планирует поддержку открытия дверей в обоих направлениях, поэтому начало от закрытого --- это подготовка к будущему.
Используйте стандартные размеры дверей. Придерживайтесь 120 x 220 см для дверных проёмов, если нет конкретной причины не делать этого. Это соответствует ванильным зданиям и обеспечивает корректный вид анимаций персонажей.
Тестируйте анимации в Buldozer перед упаковкой. Используйте
[/]для переключения источников и;/'или колесо мыши для прокрутки анимации. Обнаружение ошибок осей или углов здесь экономит значительное время.Переопределяйте ограничивающие сферы для крупных зданий. Если ваше здание имеет двери, которые значительно открываются наружу, создайте выделение в Memory LOD, охватывающее полный анимированный объём, и свяжите его параметром
boundingв конфигурации.Размещайте вершины лестниц точно. Анимации подъёма привязаны к конкретным размерам. Вершины, которые расположены слишком далеко друг от друга или смещены, приведут к тому, что персонаж будет парить, проникать сквозь стены или застревать.
Обеспечьте зазор вокруг лестниц. Оставьте достаточно места в Geometry и Roadway LOD для модели персонажа во время подъёма.
Храните один
model.cfgна модель или папку.model.cfgне обязан находиться рядом с файлом.p3d, но их близкое расположение упрощает организацию. Его также можно разместить выше в структуре папок для охвата нескольких моделей.Используйте репозиторий DayZ Samples. Bohemia предоставляет рабочие образцы для дверей (
Test_Building) и лестниц (Test_Ladders) по адресуhttps://github.com/BohemiaInteractive/DayZ-Samples. Изучите их перед созданием собственных.Повторно бинаризируйте ландшафт после добавления конфигурации зданий. Добавление
class=houseи класса игровой конфигурации означает, что пути моделей в файлах.wrpзаменяются ссылками на классы. Ваш ландшафт должен быть повторно бинаризирован для вступления в силу.Обновите navmesh после размещения зданий. Перестроенный ландшафт без обновлённого navmesh может привести к тому, что ИИ будет проходить сквозь двери вместо их использования.
Распространённые ошибки
Двери
| Ошибка | Симптом | Исправление |
|---|---|---|
Имя класса CfgModels не совпадает с именем файла модели. | Анимация двери не воспроизводится. | Переименуйте класс, чтобы он точно совпадал с именем файла .p3d (без расширения). |
| Отсутствует именованное выделение в одном или нескольких LOD. | Дверь видна, но не интерактивна, или пули проходят сквозь неё. | Убедитесь, что выделение существует в Resolution, Geometry, View Geometry и Fire Geometry LOD. |
| Вершины оси отсутствуют или определена только одна вершина. | Дверь поворачивается от неверной точки или вообще не вращается. | Разместите ровно две вершины в Memory LOD для выделения оси (например, door1_axis). |
source в model.cfg не совпадает с именем класса в Doors config.cpp. | Дверь не связана с игровой логикой --- нет звуков, нет смены состояний. | Убедитесь, что параметр source и имя класса Doors идентичны. |
Забыто именованное свойство class = "house" в Geometry LOD. | Здание не распознаётся как интерактивная структура. | Добавьте именованное свойство в Geometry LOD через Object Builder. |
| Ограничивающая сфера слишком мала. | Действия двери или баллистика не работают с определённых углов. | Добавьте выделение bounding в Memory LOD и сошлитесь на него в конфигурации. |
Путаница положительного и отрицательного angle1 для двойных дверей. | Обе створки открываются в одном направлении и проникают друг через друга. | Одной створке нужен положительный angle1, другой --- отрицательный. |
Лестницы
| Ошибка | Симптом | Исправление |
|---|---|---|
ladderN_con не размещена на уровне пола. | Действие "Встать на лестницу" не появляется или появляется на неверной высоте. | Переместите вершину на уровень земли/пола. |
Отсутствует выделение View Geometry ladderN. | С лестницей невозможно взаимодействовать. | Создайте компонент View Geometry с именованным выделением, охватывающим полный объём лестницы. |
ladderN_top_left / ladderN_top_right слишком низко. | Персонаж проникает сквозь стену или пол при верхнем выходе. | Эти точки должны быть как минимум на 5 ступеней выше уровня пола. |
| Недостаточный зазор в Geometry LOD. | Персонаж застревает или проникает сквозь стены при подъёме. | Расширьте пространство вокруг лестницы в Geometry и Roadway LOD. |
| Нумерация лестниц начинается с 0. | Лестница не функционирует. | Нумерация начинается с 1 (ladder1_, не ladder0_). |
Указание ladders[] в игровой конфигурации. | Напрасные усилия (безвредно, но не нужно). | DayZ не использует массив ladders[]. Удалите его и полагайтесь на размещение вершин Memory LOD. |
Ссылки
- Bohemia Interactive --- Двери на зданиях (официальная документация BI)
- Bohemia Interactive --- Лестницы на зданиях (официальная документация BI)
- DayZ Samples --- Test_Building (рабочий образец дверей)
- DayZ Samples --- Test_Ladders (рабочий образец лестниц)
- Глава 4.2: 3D-модели --- система LOD, именованные выделения, основы
model.cfg
Навигация
| Предыдущая | Вверх | Следующая |
|---|---|---|
| 4.7 Руководство по Workbench | Часть 4: Форматы файлов и DayZ Tools | -- |
