Unreal Engine Ragdoll (тряпичная кукла) — Physics Asset для Skeletal Mesh

Друзья, приветствую, с Вами Будуев Антон. В данной статье мы рассмотрим Ragdoll (Physics Asset) в Unreal Engine — специальную коллизию Skeletal Mesh с симуляцией физики, которая также известна как «тряпичная кукла» в Анрил Энджин.

Unreal Engine Ragdoll

Physics Asset присоединённый к Skeletal Mesh
Skeletal Mesh и его Physics Asset

Итак, Ragdoll в Unreal Engine, что дословно переводится как «тряпичная кукла», представляет собой Physics Asset (физический ассет), привязанный к конкретному Skeletal Mesh и предназначенный для симуляции его физики, а также проверки столкновений.

Каждый Skeletal Mesh может либо иметь привязанный к нему физический ассет, либо же не иметь. Если Physics Asset отсутствует, его можно создать и присоединить к соответствующему скелету. Ниже мы рассмотрим этот процесс.

Ragdoll состоит из набора Physics Bodies (физических тел) или, по-другому, коллизий, которые регистрируют столкновения, а также прикреплённых к этим телам Constraints (ограничений вращения этих тел). Эти ограничения определяют естественные движения физических тел, что позволяет моделировать реалистичные физические реакции Skeletal Mesh.

Ragdoll в Unreal Engine состоит из набора Physics Bodies и Constraints
Ragdoll в Unreal Engine состоит из набора Physics Bodies и Constraints

На самом деле Physics Assets не ограничиваются только человекоподобными Ragdoll. Они также могут использоваться для симулирования физики одежды или любого другого физического моделирования с использованием Physics Bodies и Constraints.

Как создать Ragdoll (Physics Asset) и присоединить его к Skeletal Mesh

Ragdoll создаётся автоматически при создании самого физического ассета. При этом движок Unreal Engine позволяет контролировать этот процесс путём ввода некоторых предварительных настроек (о них поговорим ниже).

Итак, создать Physics Asset для Skeletal Mesh в Анрил Энджин можно несколькими путями.

Первый способ — это включить опцию Create Physics Asset при импорте Skeletal Mesh. Тогда физический ассет будет не только создан, но и сразу привязан к соответствующему скелету.

Опция Create Physics Asset в настройках импорта Skeletal Mesh
Опция Create Physics Asset в настройках импорта Skeletal Mesh

Второй способ, как можно создать Ragdoll — через меню в Content Browser. Для этого нужно вызвать контекстное меню в контент-браузере, затем выбрать раздел Physics и в нём — Physics Asset. После в открывшемся окне выбрать необходимый Skeletal Mesh, для которого и нужно создать физический ассет.

Как создать Physics Asset через меню в Content Browser
Как создать Physics Asset через меню в Content Browser

Ну и самый простой способ — это вызвать контекстное меню у самого ассета Skeletal Mesh. И в нём выбрать пункты Create / Physics Asset / Create and Assign (создать и присоединить).

Меню Skeletal Mesh: выбрать пункты Create / Physics Asset / Create and Assign
Меню Skeletal Mesh: выбрать пункты Create / Physics Asset / Create and Assign

После всех этих действий, перед непосредственным созданием файла физического ассета откроется новое окно с предварительными настройками будущего ассета (рэгдолла).

Окно дефолтных настроек при создании в Unreal Engine физического ассета (ragdoll)
Окно дефолтных настроек при создании в Unreal Engine физического ассета (ragdoll)

В данном промежуточном окне движок позволяет сделать следующие настройки:

  • 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

Если перейти в файл физического ассета, то откроется его редактор, который состоит из шести основных разделов.

Структура редактора Unreal Engine Physics Asset Editor
Структура редактора Unreal Engine Physics Asset Editor

Разберём каждый из разделов немного подробнее.

Панель инструментов

Панель инструментов Physics Asset Editor
Toolbar (панель инструментов) Physics Asset Editor

Панель инструментов позволяет:

  • сохранять любые изменения, внесённые в физический ассет;
  • устанавливать Mesh и/или анимацию для предварительного просмотра данного физического объекта;
  • создавать другие ассеты для использования с текущим Mesh;
  • включать/отключать столкновение для выбранных физических тел;
  • добавлять физический материал;
  • конвертировать ограничения;
  • активировать физическую симуляцию;
  • переключаться между различными инструментами анимации в Unreal Engine.

Пожалуй, самая важная кнопка в панели инструментов, но не самая очевидная — запуск физической симуляции. Чтобы запустить симуляцию для её визуального просмотра во Viewport нужно нажать на кнопку двух треугольных скобок, далее Simulate Options / Simulate (симуляция для всего объекта) или Simulate Selected (симуляция только выделенной части объекта).

Запуск симуляции физики Ragdoll в Unreal Engine
Запуск симуляции физики Ragdoll в Unreal Engine

Также можно воспользоваться комбинациями горячих клавиш: ALT+I для симуляции всего объекта или ALT+SHIFT+I для симуляции выделенной части объекта.

Skeleton Tree

Skeleton Tree — дерево иерархии костей скелета, их физических тел и ограничений для текущего Mesh.

Дерево иерархии скелета текущего Mesh
Дерево иерархии скелета текущего 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 во всех физических телах и их взаимосвязях.

Graph Constraints - график ограничений
Graph Constraints — график ограничений

На рисунке выше представлен граф, на котором хорошо визуально видно, с какими другими физическими телами и через какие связи (ограничения) связано тело «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, чтобы он не был тряпкой, а симулировал физику человеческого тела
Настраиваем 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 и заполните необходимые параметры данного ограничения.

Настройка Constraints во вкладке Details / Angular Limits
Настройка Constraints во вкладке 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.

Активация рэгдолл в настройках Skeletal Mesh
Активация рэгдолл в настройках Skeletal Mesh

Активация Ragdoll через Blueprint

Чтобы активировать Ragdoll через Blueprints необходимо провести три операции для конкретного компонента Skeletal Mesh.

  • включить физику, используя ноду Set Simulate Physics.
  • включить коллизию для физики, использовав ноду Set Collision Enabled и установив в её параметре Collision Enabled = Physics или Query and Physics.
  • поменять канал коллизии на Physics Body через ноду Set Collision Object Type.

Скриншот

Активация Ragdoll через Blueprint
Активация Ragdoll через Blueprint

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Практика на Unreal Engine. Создаём при помощи Ragdoll анимацию падения персонажа с симуляцией физического увечья

Задача: создать физическую симуляцию увечья персонажа при его падении с большой высоты.

Итак, так как в данном примере мы будем настраивать симуляцию физики персонажа при помощи блюпринт кода, то соответствующий код правильно описывать в самом персонаже.

Поэтому откроем Event Graph персонажа «BP_ThirdPersonCharacter» из стандартного шаблона игры от третьего лица в Unreal Engine (UE5).

Далее вызовем событие Event On Landed, которое срабатывает в момент приземления персонажа на поверхность. Именно данное событие нам и нужно проверять. Так как мы будем симулировать физику персонажа при его падении с большой высоты.

Событие Event On Landed
Событие Event On Landed

Фильтрация высоты падения

Однако персонаж может приземляться и с небольшой высоты, например, после прыжка. Поэтому необходимо отделить такие ситуации. Я предлагаю делать это, измеряя вертикальную скорость по оси Z.

Когда персонаж прыгает или падает с любой высоты, его отрицательная скорость по оси Z увеличивается с течением времени. Экспериментально я определил, что при прыжке с небольшой высоты эта скорость достигает «-1100». Чтобы исключить прыжки с малой высоты, необходимо измерить скорость персонажа в момент приземления. А затем отфильтровать её. Если скорость окажется меньше «-1110», это будет означать, что персонаж прыгнул с большой высоты и, должен получить травмы при приземлении.

Чтобы вычислить скорость падения в момент приземления, воспользуемся нодой Get Velocity. Затем разделим её пин с векторным значением и используем только значение по оси Z.

После с помощью узлов «<» и Branch исключим ситуации, в которых скорость будет меньше значения «-1110».

Скриншот

Фильтрация высоты падения
Фильтрация высоты падения

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Придаём наглядность коду

Для более наглядного представления расположения нод в коде воспользуемся нодой Sequence. Она поможет нам разделить длинную горизонтальную цепочку кода на вертикальные смысловые блоки, которые будут выполняться последовательно. Конечно, можно обойтись и без неё, просто выстроив все ноды в одну линию. Также можно объединить отдельные фрагменты кода в функции. Но я не буду усложнять этот пример, поэтому просто воспользуюсь нодой Sequence.

Нода 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.

Скриншот

Включаем Ragdoll и придаём импульс отскока
Включаем Ragdoll и придаём импульс отскока

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Отключаем управление, основную коллизию и перегружаем уровень

Затем воспользуемся нодой Disable Movement, чтобы отключить компонент движения персонажа. Этим самым мы отключим возможность игроку управлять своим персонажем.

Также, в зависимости от ситуации и механики игры, чтобы не мешалась основная коллизия персонажа от его капсулы, можно отключить её коллизию. Сделать это можно нодой Set Collision Enabled для компонента капсулы, в которой указать значение No Collision.

Ну и последнее в этом коде — это перезагрузка уровня. Опять же, это можно и не делать. Всё зависит от конкретной ситуации. Но для примера сделаем это. Воспользуемся нодой Open Level (by Name), в которой укажем наименование нового уровня. А именно «ThirdPersonMap», то есть просто переоткроем текущий уровень. Но перед этим сделаем небольшую задержку в 3 секунды нодой Delay.

Скриншот

Практика на Unreal Engine. Создаём при помощи Ragdoll анимацию падения персонажа с симуляцией физического увечья
Практика на Unreal Engine. Создаём при помощи Ragdoll анимацию падения персонажа с симуляцией физического увечья

Код на BlueprintUE

Если код отображается без связей, нажмите сверху кода на кнопку «Graph» Если код отображается без связей, нажмите сверху кода на кнопку "Graph"


Оцените статью
( 1 оценка, среднее 5 из 5 )
Unreal Engine - это просто
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.