- Unreal Engine Ragdoll
- Как создать Ragdoll (Physics Asset) и присоединить его к Skeletal Mesh
- Редактор Physics Asset Editor в Unreal Engine
- Панель инструментов
- Skeleton Tree
- Graph Constraints
- Viewport
- Details / Scene Settings
- Tools и Profiles
- Как в Unreal Engine настроить Ragdoll, чтобы он не был тряпкой, а симулировал физику человеческого тела
- Как в Unreal Engine включить симуляцию физики Ragdoll
- Активация рэгдолл в настройках Skeletal Mesh
- Активация Ragdoll через Blueprint
- Практика на Unreal Engine. Создаём при помощи Ragdoll анимацию падения персонажа с симуляцией физического увечья
- Фильтрация высоты падения
- Придаём наглядность коду
- Включаем Ragdoll и придаём импульс отскока
- Отключаем управление, основную коллизию и перегружаем уровень
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы рассмотрим Ragdoll (Physics Asset) в Unreal Engine — специальную коллизию Skeletal Mesh с симуляцией физики, которая также известна как «тряпичная кукла» в Анрил Энджин.
Unreal Engine Ragdoll
Итак, Ragdoll в Unreal Engine, что дословно переводится как «тряпичная кукла», представляет собой Physics Asset (физический ассет), привязанный к конкретному Skeletal Mesh и предназначенный для симуляции его физики, а также проверки столкновений.
Каждый Skeletal Mesh может либо иметь привязанный к нему физический ассет, либо же не иметь. Если Physics Asset отсутствует, его можно создать и присоединить к соответствующему скелету. Ниже мы рассмотрим этот процесс.
Ragdoll состоит из набора Physics Bodies (физических тел) или, по-другому, коллизий, которые регистрируют столкновения, а также прикреплённых к этим телам Constraints (ограничений вращения этих тел). Эти ограничения определяют естественные движения физических тел, что позволяет моделировать реалистичные физические реакции Skeletal Mesh.
На самом деле Physics Assets не ограничиваются только человекоподобными Ragdoll. Они также могут использоваться для симулирования физики одежды или любого другого физического моделирования с использованием Physics Bodies и Constraints.
Как создать Ragdoll (Physics Asset) и присоединить его к Skeletal Mesh
Ragdoll создаётся автоматически при создании самого физического ассета. При этом движок Unreal Engine позволяет контролировать этот процесс путём ввода некоторых предварительных настроек (о них поговорим ниже).
Итак, создать Physics Asset для Skeletal Mesh в Анрил Энджин можно несколькими путями.
Первый способ — это включить опцию Create Physics Asset при импорте Skeletal Mesh. Тогда физический ассет будет не только создан, но и сразу привязан к соответствующему скелету.
Второй способ, как можно создать Ragdoll — через меню в Content Browser. Для этого нужно вызвать контекстное меню в контент-браузере, затем выбрать раздел Physics и в нём — Physics Asset. После в открывшемся окне выбрать необходимый Skeletal Mesh, для которого и нужно создать физический ассет.
Ну и самый простой способ — это вызвать контекстное меню у самого ассета Skeletal Mesh. И в нём выбрать пункты Create / Physics Asset / Create and Assign (создать и присоединить).
После всех этих действий, перед непосредственным созданием файла физического ассета откроется новое окно с предварительными настройками будущего ассета (рэгдолла).
В данном промежуточном окне движок позволяет сделать следующие настройки:
- Min Bode Size (float, по умолчанию 20.0) — минимальный размер кости, для которой будет создано физическое тело (коллизия).
- Primitive Type (по умолчанию Capsule) — тип геометрической фигуры, на основании которой, будет создано физическое тело.
- Vertex Weighting Type (по умолчанию Dominant Weight) — расположение vertex относительно костей скелета.
- Auto Orient to Bone (bool, по умолчанию True) — автоматическая ориентация физических тел относительно костей.
- Walk Past Small Bones (bool, по умолчанию True) — пропускать мелкие кости вместо того, чтобы их объединять вместе с соседними.
- Create Body for All Bones (bool, по умолчанию False) — создавать физические тела абсолютно для всех костей.
- Disable Collisions by Default (bool, по умолчанию True) — отключить столкновение тела с другими физическими телами.
- Min Weld Size (float, по умолчанию 0.0001) — кости меньше указанного значения будут объединены в одно физическое тело.
- Hull Count (int, по умолчанию 4) — максимальное количество создаваемых оболочек сложной формы.
- Max Hull Verts (int, по умолчанию 16) — максимально количество vertex в создаваемых оболочках сложной формы.
- Level Set Resolution (int, по умолчанию 8) — используемое разрешение сетки при создании наборов уровней.
- Lattice Resolution (int, по умолчанию 8) — используемое разрешение сетки при создании наборов обтянутых уровней.
- Create Constraints (bool, по умолчанию True) — создавать ограничения между соседними физическими телами.
- Angular Constraints Mode (по умолчанию Limited) — тип углового ограничения.
Редактор Physics Asset Editor в Unreal Engine
Если перейти в файл физического ассета, то откроется его редактор, который состоит из шести основных разделов.
Разберём каждый из разделов немного подробнее.
Панель инструментов
Панель инструментов позволяет:
- сохранять любые изменения, внесённые в физический ассет;
- устанавливать Mesh и/или анимацию для предварительного просмотра данного физического объекта;
- создавать другие ассеты для использования с текущим Mesh;
- включать/отключать столкновение для выбранных физических тел;
- добавлять физический материал;
- конвертировать ограничения;
- активировать физическую симуляцию;
- переключаться между различными инструментами анимации в Unreal Engine.
Пожалуй, самая важная кнопка в панели инструментов, но не самая очевидная — запуск физической симуляции. Чтобы запустить симуляцию для её визуального просмотра во Viewport нужно нажать на кнопку двух треугольных скобок, далее Simulate Options / Simulate (симуляция для всего объекта) или Simulate Selected (симуляция только выделенной части объекта).
Также можно воспользоваться комбинациями горячих клавиш: ALT+I для симуляции всего объекта или ALT+SHIFT+I для симуляции выделенной части объекта.
Skeleton Tree
Skeleton Tree — дерево иерархии костей скелета, их физических тел и ограничений для текущего Mesh.
Именно в этом разделе создаются Physics Bodies (коллизии) и Constraints (ограничения) для Ragdoll.
Чтобы создать тело коллизии, нажмите правой клавишей мыши по необходимой кости скелета и выберите меню Add Shape. Далее кликните по необходимой фигуре коллизии (Box, Sphere, Capsule), которую хотите добавить для Skeletal Mesh.
Таким же образом добавляются ограничения — нажмите правой клавишей мыши по необходимой кости скелета и выберите меню Constraints. Далее, так как Constraints объединяют между собой две кости, кликните по необходимой парной кости ограничения.
Также в этом разделе для каждого физического тела можно полностью выключить/включить коллизию или установить её тип (Query, Physics, Query Only, No Collision и др.). Кроме того, здесь можно задать физический материал и определить тип физики. Ну и провести различные мероприятия с выделенными объектами: скопировать, продублировать, удалить и прочее.
Graph Constraints
Graph Constraints — график ограничений. Позволяет визуально, в удобном графическом виде представить иерархию костей скелетов и их физических тел (коллизий), привязанных к другим физическим телам через ограничения. Данный граф очень полезный, поскольку бывает достаточно трудно ориентироваться во Viewport во всех физических телах и их взаимосвязях.
На рисунке выше представлен граф, на котором хорошо визуально видно, с какими другими физическими телами и через какие связи (ограничения) связано тело «head». А именно, оно связано только с телом «neck_02» через ограничение «head : neck_02».
С помощью Graph Constraints можно создавать новые ограничения, отсоединив узел основного тела (слева) и выбрав новое физическое тело для привязки. Или даже перемещаться по дереву костей скелета, дважды щелкнув конечное тело, чтобы перейти к следующему набору коллизий и ограничений.
Viewport
Viewport — область визуального просмотра. Позволяет визуально просматривать физическую симуляцию Ragdoll. А также не только наблюдать за изменениями, которые вносятся в положение и размер физических тел и ограничений, но и производить эти самые изменения.
Также в области просмотра можно настраивать режимы освещения. Показывать или скрывать кости, тела и ограничения скелета. Кроме того, настраивать автоматическое вращение скелетной сетки на поворотном столе, что позволит видеть Skeletal Mesh со всех сторон.
Details / Scene Settings
Details / Scene Settings — настройки текущего ассета и сцены Viewport.
Панель Details служит для изменения свойств добавленных элементов, таких как физические тела и ограничения. Например, если добавить тело или ограничение в скелет, то при нажатии на него на панели Details появятся параметры, соответствующие функциям выделенного элемента.
Панель Scene Settings предоставляет возможность мгновенно увидеть, как текущий Skeletal Mesh и привязанные к нему физические и анимационные ассеты будут выглядеть в различных окружениях и световых условиях, без необходимости самостоятельной настройки этих сцен.
Tools и Profiles
На панели Tools (инструменты) отображаются параметры, доступные для выбранных физических тел при их создании или повторном создании. Данные параметры мы уже разбирали в этой статье в разделе выше «Как создать Ragdoll».
Панель Profiles предназначена для создания профилей, которые можно применять повторно к физической анимации или ограничениям. Эти профили содержат настройки по умолчанию, что позволяет быстро адаптировать их к другим объектам или ограничениям.
Как в Unreal Engine настроить Ragdoll, чтобы он не был тряпкой, а симулировал физику человеческого тела
Чтобы Ragdoll в Unreal Engine не вёл себя «как тряпка», его нужно правильно настроить. А именно, необходимо настроить его физические тела и ограничения.
Для Physics Bodies в основном нужно подобрать их масштаб относительно Skeletal Mesh. Чтобы, с одной стороны, тела не проваливались внутрь самого Mesh, но и, с другой стороны, чрезмерно не выходили из него. Также необходимо подобрать их направление и расположение относительно костей скелета.
Всё это можно сделать, находясь непосредственно во Viewport, выделяя каждое тело и обычным для Unreal Engine (UE4, UE5) виджетом, изменять параметры Location, Rotation и Scale.
Но, самое важное для реалистичной симуляции физики Ragdoll — это настройка Constraints (ограничений). В основном именно из-за ограничений получается не физика человеческого тела, а поведение «тряпки».
Происходит это из-за того, что по умолчанию ограничения ничего не ограничивают, и получается, что физические тела с их костями скелета изгибаются так, как не свойственно человеку. Соответственно, ограничив движение физических тел и их костей скелета, мы получим правильную симуляцию физики Ragdoll.
Чтобы настроить Constraints, выделите во Viewport необходимое ограничение, далее перейдите в Details в раздел Angular Limits и заполните необходимые параметры данного ограничения.
Если параметры Swing 1 Motion, Swing 2 Motion, Twist Motion поставить в значение Free, то кости вообще не будут никак заблокированы. Выбрав значение Locked, произойдет полная их блокировка. Если же выбрать Limited, то ограничения будут соответствовать значениям, которые Вы введёте в параметрах ниже.
Данные параметры обозначают:
- Swing 1 Limit — угол перемещения по плоскости XY.
- Swing 2 Limit — угол перемещения по плоскости XZ.
- Twist Limit — скручивание вдоль оси X.
При настройки Ragdoll для его реалистичной симуляции физики, в качестве примера я рекомендую использовать Skeletal Mesh из стандартного шаблона игры от третьего лица в Unreal Engine. В этом шаблоне рэгдолл уже настроен и работает превосходно.
Чтобы настроить физику вашего персонажа, просто выделите каждый Constraint в Skeletal Mesh из шаблона, скопируйте значения ограничений углов и скручиваний для каждой кости скелета и перенесите их на соответствующие кости вашего персонажа.
Как в Unreal Engine включить симуляцию физики Ragdoll
Активация рэгдолл в настройках Skeletal Mesh
Для того чтобы активировать рэгдолл в настройках класса Character, выделите необходимый компонент Skeletal Mesh. Затем перейдите в настройки Details. Далее включите для данного Mesh физику, активировав параметр Physics / Simulate Physics. И поменяйте пресет коллизии Collision / Collision Presets на Ragdoll.
Активация Ragdoll через Blueprint
Чтобы активировать Ragdoll через Blueprints необходимо провести три операции для конкретного компонента Skeletal Mesh.
- включить физику, используя ноду Set Simulate Physics.
- включить коллизию для физики, использовав ноду Set Collision Enabled и установив в её параметре Collision Enabled = Physics или Query and Physics.
- поменять канал коллизии на Physics Body через ноду Set Collision Object Type.
Скриншот
Код на BlueprintUE
Практика на Unreal Engine. Создаём при помощи Ragdoll анимацию падения персонажа с симуляцией физического увечья
Задача: создать физическую симуляцию увечья персонажа при его падении с большой высоты.
Итак, так как в данном примере мы будем настраивать симуляцию физики персонажа при помощи блюпринт кода, то соответствующий код правильно описывать в самом персонаже.
Поэтому откроем Event Graph персонажа «BP_ThirdPersonCharacter» из стандартного шаблона игры от третьего лица в Unreal Engine (UE5).
Далее вызовем событие Event On Landed, которое срабатывает в момент приземления персонажа на поверхность. Именно данное событие нам и нужно проверять. Так как мы будем симулировать физику персонажа при его падении с большой высоты.
Фильтрация высоты падения
Однако персонаж может приземляться и с небольшой высоты, например, после прыжка. Поэтому необходимо отделить такие ситуации. Я предлагаю делать это, измеряя вертикальную скорость по оси Z.
Когда персонаж прыгает или падает с любой высоты, его отрицательная скорость по оси Z увеличивается с течением времени. Экспериментально я определил, что при прыжке с небольшой высоты эта скорость достигает «-1100». Чтобы исключить прыжки с малой высоты, необходимо измерить скорость персонажа в момент приземления. А затем отфильтровать её. Если скорость окажется меньше «-1110», это будет означать, что персонаж прыгнул с большой высоты и, должен получить травмы при приземлении.
Чтобы вычислить скорость падения в момент приземления, воспользуемся нодой Get Velocity. Затем разделим её пин с векторным значением и используем только значение по оси Z.
После с помощью узлов «<» и Branch исключим ситуации, в которых скорость будет меньше значения «-1110».
Скриншот
Код на BlueprintUE
Придаём наглядность коду
Для более наглядного представления расположения нод в коде воспользуемся нодой Sequence. Она поможет нам разделить длинную горизонтальную цепочку кода на вертикальные смысловые блоки, которые будут выполняться последовательно. Конечно, можно обойтись и без неё, просто выстроив все ноды в одну линию. Также можно объединить отдельные фрагменты кода в функции. Но я не буду усложнять этот пример, поэтому просто воспользуюсь нодой Sequence.
Включаем Ragdoll и придаём импульс отскока
Далее, чтобы включить симуляцию физики для Ragdoll нашего персонажа, воспользуемся тремя нодами, о которых ранее уже говорили в этой статье.
- Set Simulate Physics — установим значение True, чтобы активировать физику.
- Set Collision Enabled — зададим значение Collision Enabled Query and Physics, чтобы включить коллизию для физики и запросов.
- Set Collision Object Type — установим значение Physics Body, чтобы определить тип объекта коллизии как физическое тело.
Для всех трёх нод в качестве цели укажем Skeletal Mesh персонажа.
После запуска симуляции придадим персонажу небольшое ускорение вверх, направленное по оси Z. То есть, когда персонаж упадёт с большой высоты и столкнется с поверхностью, его тело немного подбросит вверх, что полностью соответствует законам физики. Итак, чтобы добавить импульс, воспользуемся нодой Add Impulse. Установим в ней значение силы в 5000 единиц по направлению оси Z.
Скриншот
Код на BlueprintUE
Отключаем управление, основную коллизию и перегружаем уровень
Затем воспользуемся нодой Disable Movement, чтобы отключить компонент движения персонажа. Этим самым мы отключим возможность игроку управлять своим персонажем.
Также, в зависимости от ситуации и механики игры, чтобы не мешалась основная коллизия персонажа от его капсулы, можно отключить её коллизию. Сделать это можно нодой Set Collision Enabled для компонента капсулы, в которой указать значение No Collision.
Ну и последнее в этом коде — это перезагрузка уровня. Опять же, это можно и не делать. Всё зависит от конкретной ситуации. Но для примера сделаем это. Воспользуемся нодой Open Level (by Name), в которой укажем наименование нового уровня. А именно «ThirdPersonMap», то есть просто переоткроем текущий уровень. Но перед этим сделаем небольшую задержку в 3 секунды нодой Delay.
Скриншот
Код на BlueprintUE