#5 — Добавление полноценного 3D персонажа с анимацией
В ходе урока мы добавим полноценного 3D персонажа с анимацией ходьбы, бега и состояния спокойствия. Мы научимся выполнять анимацию в зависимости от действия, а также переходить с одной анимации на другую.
Видеоурок
Полезные ссылки:
- Скачать персонажа можно по этой ссылке .
Игра без анимаций, звуков и динамике — скучная игра. Именно по этой причине в ходе урока мы добавили множество анимаций к главному игроку.
Unreal Engine обладает большими возможностями в настройках анимации. Вы можете устанавливать не только очередность выполнения анимации, но также просчитывать скорость анимации и вызов функций в определенные моменты анимации.
Для работы с анимацией используется встроенный редактор, что схож по дизайн на редактор «Blueprint».
Помимо настройки анимации через редактор «Animation Blueprint» вы также можете настроить анимацию более тщательно за счёт использования редактора «BlandSpace». Он позволяет настраивать анимацию в соответсвии с игроком или же объектом.
Как срендерить анимацию в unreal engine
Всем привет, сегодня я покажу как срендерить анимацию в unreal engine, я буду использовать unreal engine 5, я постарался, чтобы туториал подходил новичкам.
Создание проекта
Для анимации я создаю пустой проект, games > blank, так же можно указать путь, где будет храниться проект и имя проекта, и нажать create (Так же, можно поставить галочку на starter content, если у вам пока что моделек нет и вы хотите просто попробовать сделать анимацию, тогда вам сразу добавится в проект несколько моделек):
Настройка unreal engine
Те, кто привыкли работать в ue4, могут нажать dock in layout, тогда док зафиксируется и не будет скрываться:
Так же надо открыть вкладку с place actors, чтобы можно было размещать объекты, эффекты и т.д на сцене (можно не открывать из из верхних менюшек вытягивать их, но лично мне не удобно это делать), делается это так:
Настройка сцены
Далее нам нужно создать новый мир, делается это просто, тыкаем правой кнопкой мыши на content browser > level, называйте как хотите и тыкайте 2 раза по появившейся иконке:
Теперь мы можем увидеть превосходную темноту, как же она прекрасна:
Давай те создадим террейн:
Пролистываем вниз и нажимаем create:
Управление в unreal engine как в играх wasd и кнопки e — вверх, q — вниз
Переходим обратно в режим select:
Далее нам нужно осветить превосходную темноту, переходим во вкладку lights и перетаскиваем direction light на сцену:
Далее переходим во вкладку visual effects и перетаскиваем sky atmosphere для создания неба:
В той же вкладке берем и перетаскиваем volumetric cloud для создания облаков:
Сделаем небольшой туман в далеке, в той же вкладке перетащим ExponentialHeightFog на сцену:
Можете нажать сюда, чтобы сменить цвет тумана, я оставлю как есть:
Далее я просто создал куб, чтобы потом сделать анимацию приближения камеры к нему:
Создание анимации
Для начала надо перетащить камеру на сцену:
Чтобы менять режимы выбора объекта(перемещение, вращение, изменение размера) надо нажать на пробел:
При выставлении объекта можно изменять систему координат с глобальных на локальные и наоборот:
Далее нам нужно создать новую секвенцию:
Выбираем где ее сохранить и еще можно поменять название секвенции и нажимаем save:
Должна открыться такая вкладка:
Если не открылась то добавляем ее вручную:
Чтобы выбрать режим вида от лица камеры, нужно кликнуть сюда:
Я собираюсь изменять у нее только transform, поэтому я ключевой кадр ставлю только на transform:
Должна появиться такая точка:
Перехожу на последний кадр, ставлю камеру как надо и делаю тоже самое, ставлю ключевой кадр:
Так же можно менять режим интерполяции, кликнув правой кнопкой мыши на ключевой кадр (кружочек):
Так же можно изменять количество кадров, перетаскивая красную полосу:
Рендер анимации
Теперь нам надо подключить 1 плагин к проекту, для этого переходим сюда:
Вбиваем «render» в поиск и ищем этот плагин:
Далее restart now, unreal должен перезагрузится:
Далее открываем это окошко:
В появившемся окне нажимаем + Render и выбираем нашу секвенцию:
Кликаем сюда для настройки анимации:
можно нажать delete, чтобы удалить опцию, и + Settings, чтобы добавить опцию (я обычно рендерю в png, поэтому я удалил jpg и добавил png):
Далее я добавил anti-aliasing со следующими параметрами:
Далее меняю директорию вывода секвенции:
Далее сохраняем пресет настроек рендера:
Сохраняем и жмем Accept:
Далее Render (Local), чтобы срендерить сцену:
Далее начнется рендер:
Собираем видео
Далее мы видим куча изображений, в папке, которую указывали на вывод рендера:
Далее надо объединить это в видео, сделать это можно в любом видеоредакторе, я буду использовать blender. Когда открыли блендер надо открыть вкладку video editing:
Далее нужно добавить все изображения, которые у нас отрендерелись:
Нажимаем кнопку «A», чтобы выбрать все, и нажимаем add:
Далее выбираем где будет располагаться видео и выбираем, что бы он рендерил именно видео, а не картинки:
Так же можно выбрать тип файла:
Далее нажимаем render animation и получаем видео:
На этом все, всем спасибо за просмотр, пока.
Туториал по Unreal Engine. Часть 6: Анимация
Сегодня редко можно встретить игру без анимации, потому что она является важным аспектом передачи движения. Без анимации будет казаться, что персонаж не бежит, а скользит.
К счастью, Unreal позволяет быстро и удобно анимировать персонажей!
В этой части туториала вы научитесь следующему:
- Импортировать меш со скелетом
- Импортировать анимации
- Создавать Animation Blueprint для переходов между разными анимациями
- Выполнять плавные переходы анимаций
Примечание: этот пост является одной из восьми частей туториала, посвящённого Unreal Engine:
- Часть 1: Знакомство с движком
- Часть 2: Blueprints
- Часть 3: Материалы
- Часть 4: UI
- Часть 5: Как создать простую игру
- Часть 6: Анимация
- Часть 7: Звук
- Часть 8: Системы частиц
- Часть 9: Искусственный интеллект
- Часть 10: Как создать простой FPS
Приступаем к работе
Скачайте заготовку проекта и распакуйте её. В корневом каталоге есть папка Animation Assets. В этой папке находятся персонаж и анимации, которые мы будем импортировать.
Откройте проект, перейдя в папку проекта и запустив SkywardMuffin.uproject.
Примечание: если откроется окно, сообщающее, что проект создан в более ранней версии Unreal editor, то всё в порядке (движок часто обновляется). Можно или выбрать опцию создания копии, или опцию преобразования самого проекта.
Нажмите на Play, чтобы запустить игру. Цель игры заключается в том, чтобы коснуться как можно большего числа облаков, не упав. Чтобы прыгнуть на первое облако, нажмите левую клавишу мыши.
Заголовок спойлера
Вместо простого красного круга давайте будем управлять этим милым маффином:
Этот маффин имеет скелет, который позволяет нам анимировать его.
Что такое скелет?
В 3D-редакторах скелетом называется множество взаимосвязанных точек, называемых шарнирами. На рисунке ниже каждая сфера является шарниром.
Примечание: в Unreal используются взаимозаменяемые термины joint и bone.
Управляя этими шарнирами, можно создавать различные позы персонажа.
При переходе из одной позы в другую создаётся анимация.
Если создать ещё больше поз между предыдущими, можно получить что-то вроде такого:
Заголовок спойлера
В Unreal любой меш со скелетом называется Skeletal Mesh. Давайте начнём с импорта Skeletal Mesh для маффина.
Импорт Skeletal Mesh
Перейдите в Content Browser и зайдите в Characters\Muffin. Нажмите на Import и перейдите в SkywardMuffinStarter\Animation Assets. Выберите SK_Muffin.fbx и нажмите Open.
В окне импорта перейдите в раздел Mesh и снимите флажок с опции Create Physics Asset. Physics Asset помогает создать эффект рэгдолла. В этом туториале мы не будем его использовать, поэтому он нам не понадобится.
В проекте уже содержится материал и текстура маффина, поэтому импортировать их не нужно. Снимите флажки с опций Import Materials и Import Textures.
Все остальные настройки оставьте по умолчанию и намжите на Import. При этом создадутся следующие ассеты:
- SK_Muffin: ассет Skeletal Mesh. Это просто меш со ссылкой на ассет Skeleton.
- SK_Muffin_Skeleton: ассет Skeleton. Он содержит список шарниров и другую информацию, например, об их иерархии.
Использование Skeletal Mesh
Прежде чем использовать новый Skeletal Mesh, нужно дать ему материал, чтобы он не был просто серым пятном. Дважды щёлкните на SK_Muffin, чтобы открыть его.
Перейдите в панель Asset Details и найдите раздел Material Slots. Назначьте материал M_Muffin и закройте SK_Muffin.
Теперь давайте используем SK_Muffin в качестве персонажа игрока. Вернитесь в Content Browser и дважды щёлкните на BP_Muffin, чтобы открыть его.
Перейдите к панели Components и выберите компонент Mesh (Inherited). Переключитесь на панель Details и найдите раздел Mesh. Для свойства Skeletal Mesh выберите значение SK_Muffin.
Нажмите на Compile и вернитесь в основной редактор. Нажмите на Play, и вы сможете управлять в игре маффином!
Заголовок спойлера
Игра уже выглядит намного лучше! Следующим шагом будет импорт анимаций, которые вдохнут в маффин жизнь.
Импорт анимаций
Перейдите в Content Browser и нажмите на Import. Перейдите в SkywardMuffinStarter\Animation Assets. Выберите следующие файлы:
- SK_Muffin_Death.fbx
- SK_Muffin_Fall.fbx
- SK_Muffin_Idle.fbx
- SK_Muffin_Jump.fbx
- SK_Muffin_Walk.fbx
В окне импорта перейдите в раздел Mesh и снимите флажок с опции Import Mesh. Благодаря этому Skeletal Mesh не будет импортирован снова.
Теперь проверьте, что свойство Skeleton имеет значение SK_Muffin_Skeleton. Это определяет скелет, который будет использоваться в анимации.
Затем нажмите на Import All. Так вы импортируете все анимации с только что указанными настройками.
Теперь, когда у нас есть все анимации, нам нужен способ их воспроизведения. Можно воспользоваться для этого Animation Blueprint.
Создание Animation Blueprint
Animation Blueprint похож на обычный Blueprint. Однако в нём также есть граф, предназначенный только для задач анимации.
Чтобы создать его, перейдите в Content Browser и нажмите на кнопку Add New. Выберите Animation\Animation Blueprint.
Во всплывающем окне найдите свойство Target Skeleton и выберите SK_Muffin_Skeleton. Затем нажмите на кнопку OK для создания Animation Blueprint.
Переименуйте ассет в ABP_Muffin. После этого дважды щёлкните на нём, чтобы открыть его в Animation Blueprint editor.
Animation Blueprint Editor
The Animation Blueprint editor похож на Blueprint editor, но в нём есть четыре дополнительных панели:
- Anim Graph: это специальный граф для анимаций. Здесь воспроизводятся все анимации.
- Preview Scene Settings: эта панель позволяет настраивать сцену предварительного просмотра во Viewport
- Anim Preview Editor: создаваемые переменные также будут отображаться здесь. Используйте эту панель для предварительного просмотра того, как влияют ваши переменные на конечную анимацию.
- Asset Browser: эта панель содержит список анимаций, которые может использовать текущий скелет.
Что такое конечный автомат?
Конечный автомат — это набор состояний и правил. В нашем туториале можно считать состояние анимацией.
Конечные автоматы одновременно могут находиться только в одном состоянии. Для перехода в следующее состояние должны выполняться определённые условия, задаваемые правилами.
Ниже представлен простой пример конечного автомата. В нём показаны состояния прыжка и правила перехода в каждое состояние.
Состояния могут иметь и двустороннюю взаимосвязь. В представленном ниже примере состояния Jump и Fall могут переходить друг в друга.
Без этой двусторонней связи персонаж не смог бы выполнять двойной прыжок, потому что он мог бы переходить в состояние Jump только из состояния Idle.
Ну, довольно о конечных автоматах, давайте уже займёмся их созданием.
Создание конечного автомата
Перейдите в Anim Graph и нажмите правой клавишей мыши на пустой области. В меню выберите Add New State Machine.
Это добавит в граф нод State Machine. Переименуйте State Machine в Locomotion. Затем соедините конечный автомат Locomotion с нодом Final Animation Pose.
Теперь конечный автомат Locomotion будет определять конечную анимацию маффина.
Дважды щёлкните на конечном автомате Locomotion, чтобы открыть его. Внутри вы увидите нод Entry.
Соединённое с этим нодом состояние является состоянием по умолчанию. В нашем туториале состоянием по умолчанию будет анимация ожидания. Создайте это состояние, нажав правой клавишей мыши на пустой области графа. В меню выберите Add State и переименуйте его в Idle.
Теперь нужно соединить нод Entry с состоянием Idle. Перетащите контакт Entry к серой области состояния Idle. Отпустите левую клавишу мыши, чтобы соединить их.
При создании состояния через контекстное меню с ним не будет связана никакая анимация. Давайте это исправим.
Привязывание анимации к состоянию
Дважды щёлкните на состоянии Idle, чтобы открыть его.
Чтобы привязать анимацию, перейдите в Asset Browser и перетащите анимацию SK_Muffin_Idle. Отпустите левую клавишу мыши на пустой области графа, чтобы добавить её.
Затем присоедините нод Play SK_Muffin_Idle к ноду Final Animation Pose.
Для использования Animation Blueprint нам нужно обновить BP_Muffin.
Использование Animation Blueprint
Нажмите на Compile и переключитесь на BP_Muffin.
Перейдите в панель Components и выберите компонент Mesh (Inherited). Перейдите в панель и найдите раздел Animation.
Выберите для Animation Mode значение Use Animation Blueprint. Для Anim Class выберите значение ABP_Muffin.
Теперь Skeletal Mesh в качестве своего Animation Blueprint будет использовать ABP_Muffin.
Нажмите на Compile и закройте BP_Muffin. Перейдите в основной редактор и нажмите на Play, чтобы проверить Animation Blueprint. Поскольку Idle является состоянием по умолчанию, маффин сразу же использует анимацию ожидания.
В следующем разделе мы создадим состояния для прыжков и падения.
Создание состояний прыжка и падения
Вернитесь к ABP_Muffin и переключитесь к графу конечного автомата Locomotion. Это можно сделать, нажав на слово Locomotion, расположенное в верхней части графа.
Вместо создания состояния и привязки к нему анимации можно создать состояние с уже привязанной анимацией. Давайте сделаем так для состояния прыжка.
Перейдите в Asset Browser и перетащите анимацию SK_Muffin_Jump. Отпустите левую клавишу мыши на пустой области графа. Это создаст состояние с уже привязанной к нему анимацией.
Переименуйте состояние в Jump.
Повторите процесс с анимацией SK_Muffin_Fall и переименуйте состояние в Fall.
Теперь у нас есть три состояния: Idle, Jump и Fall.
Теперь мы свяжем состояния друг с другом. Это можно сделать, перетащив серую область состояния, из которого нужно выполнить переход. Отпустите левую клавишу мыши на серой области целевого состояния для создания перехода.
Создайте следующие переходы:
Теперь, когда у нас есть переходы, нужно задать условия, при которых они происходят. Это можно сделать с помощью правил переходов (Transition Rules).
Transition Rules
Этот значок обозначает правило перехода (Transition Rule):
Каждое правило перехода содержит нод Result с единственным булевым входом.
Если этот вход равен true, то происходит переход.
Далее нужно создать переменные, сообщающие нам, прыгает или падает игрок. Мы применим эти переменные в правилах переходов.
Определяем, прыгает персонаж или падает
Создайте две булевы переменные с названиями IsJumping и IsFalling.
Во-первых, мы зададим значение IsJumping. Переключитесь на Event Graph и найдите нод Event Blueprint Update Animation. Этот нод работает подобно ноду Event Tick.
Чтобы проверить, прыгает ли персонаж, создадим следующую схему:
Так мы проверим, больше ли нуля скорость персонажа по оси Z. Если это так, то персонаж прыгает, а IsJumping должна принимать значение true.
Примечание: приведите её к классу, который будет использовать Animation Blueprint. Это очень важно для того, чтобы можно было предварительно просматривать переменные с помощью Anim Preview Editor.
Чтобы проверить, падает ли персонаж, нам достаточно выполнить противоположную проверку. Добавьте выделенные ноды:
Теперь IsFalling будет равна true, когда скорость по Z персонажа меньше нуля.
Настало время использовать эти переменные для задания правил переходов.
Определение правил переходов
Во-первых, нам нужно задать правило перехода Idle to Jump. Переключитесь обратно к конечному автомату Locomotion. Дважды щёлкните на правиле перехода Idle to Jump, чтобы открыть его.
Создайте нод IsJumping и соедините его с нодом Result.
Теперь состояние Idle может переходить в состояние Jump, когда IsJumping равно true.
Повторите процесс для правил переходов Jump to Fall и Fall to Jump. Используйте следующие переменные:
- Из Jump в Fall: IsFalling
- Из Fall в Jump: IsJumping
Теперь состояния Jump и Fall могут переходить друг в друга.
Осталось назначить ещё одно правило перехода. Откройте правило перехода Fall to Idle.
Для перехода в состояние Idle игрок не должен прыгать или падать. Чтобы выполнить эту проверку, можно использовать нод NOR. Этот нод возвращает true только когда оба входа имеют значения false.
Создайте нод NOR и соедините с ним нод IsJumping и IsFalling. После этого соедините нод NOR с нодом Result.
Теперь состояние Fall может переходить в состояние Idle, когда IsJumping и IsFalling равны false.
Нажмите на Compile и вернитесь в основной редактор. Нажмите на Play для проверки переходов.
Заголовок спойлера
Примечание: также вы можете проверить переходы, изменяя переменные в Anim Preview Editor.
Пока маффин при движении по земле только скользит, потому что мы ещё не применили анимацию ходьбы!
Вместо создания нового состояния для ходьбы можно смешать его с анимацией ожидания с помощью Blend Space.
Что такое Blend Space?
Blend Space — это тип анимационного ресурса. Он выполняет интерполяцию между разными анимациями на основании входных значений. В этом туториале мы будем использовать в качестве входных данных скорость игрока.
Заголовок спойлера
Blend Space также помогают упростить конечные автоматы. Вот как будет выглядеть конечный автомат Locomotion, если не использовать для ходьбы Blend Space:
Благодаря Blend Space достаточно просто заменить анимацию ожидания.
Теперь, когда вы познакомились с магией Blend Space, настало время создать его.
Создание Blend Space
Перейдите в Content Browser и нажмите на Add New. Выберите Animation\Blend Space 1D.
Примечание: разница между Blend Space и Blend Space 1D заключается в том, что у первого есть два входа. Последнее имеет только один вход.
Во всплывающем окне выберите SK_Muffin_Skeleton.
Переименуйте ассет в BS_IdleWalk и дважды щёлкните на нём, чтобы открыть его в Animation editor.
Когда откроется Blend Space, вы увидите панель в нижней части экрана. Это Blend Space editor, в котором мы будем добавлять анимации.
Давайте добавим анимации в Blend Space.
Добавление анимаций в Blend Space
Во-первых, нужно изменить имя значеняи оси (входа). Перейдите в панель Asset Details и найдите раздел Axis Settings. Измените свойство Horizontal Axis\Name на Speed.
Теперь мы добавим анимации. Перейдите в Asset Browser и перетащите анимацию SK_Muffin_Idle. Переместите её влево на сетке Blend Space, чтобы она привязалась к значению 0.0. Отпустите левую клавишу мыши, чтобы добавить анимацию.
Примечание: для отображения названий анимаций нажмите на значок метки в верхнем левом углу сетки Blend Space.
После этого добавьте анимацию SK_Muffin_Walk в значение 100.0.
Теперь Blend Space будет смешивать анимации ожидания и ходьбы в зависимости от входного значения. Если входное значение равно 0, то будет воспроизводиться только анимация ожидания. Если входное значение равно 100, то будет воспроизводиться только анимация ходьбы. Все промежуточные значения будут смешиваться.
Примечание: эти значения выбраны произвольно. Например, можно изменить максимальное значение, сделав его равным 500. В этом случае анимация ходьбы будет воспроизводиться только при более высоких скоростях.
Можно изменять значения раздела Axis Settings в панели Asset Details.
Настало время использовать Blend Space.
Применяем Blend Space
Закройте BS_IdleWalk и откройте ABP_Muffin. Переключитесь на конечный автомат Locomotion и откройте состояние Idle.
Во-первых, удалите нод Play SK_Muffin_Idle.
Затем добавьте Blend Space BS_IdleWalk с помощью перетаскивания. Соедините нод BS_IdleWalk с нодом Final Animation Pose.
Теперь BS_IdleWalk будет воспроизводиться автоматически, потому что является состоянием по умолчанию. Однако оно будет отображать только анимацию ожидания. Так происходит потому, что вход Speed остаётся равным 0.
Чтобы исправить это, нужно передать ему скорость игрока.
Получение скорости игрока
Создайте новую переменную типа float с именем Speed. Затем переключитесь на Event Graph.
Добавьте новый контакт к ноду Sequence, а затем добавьте к нему выделенные ноды:
Эта схема будет постоянно приравнивать переменную Speed к значению скорости игрока.
Переключитесь обратно к графу состояния Idle. Соедините переменную Speed со входом Speed нода BS_IdleWalk.
Теперь сможет BS_IdleWalk выполнять смешивание между анимациями ожидания и ходьбы.
Нажмите на Compile и вернитесь в основной редактор. Нажмите на Play, чтобы протестировать Blend Space.
Заголовок спойлера
Есть ещё одна анимация, которую нам нужно использовать: анимация смерти!
Использование анимации смерти
В этой игре можно умереть только в состоянии Idle (на земле). Однако давайте представим, что игрок может умереть в любом состоянии. Первой мыслью будет создать состояние Death и соединить с ним все состояния. Так можно сделать, но это быстро приведёт к запутанному графу.
Решением может стать использование нода Blend Poses by bool. Этот нод может переключаться между двумя анимациями в зависимости от значения входного булева значения.
Прежде чем создать этот нод, нам нужна переменная, содержащая статус смерти игрока.
Проверяем, умер ли игрок
Вернитесь назад к ABP_Muffin и создайте переменную типа boolean под названием IsDead. Затем переключитесь на Event Graph.
Добавьте новый контакт к ноду Sequence, а затем добавьте к нему выделенные ноды:
Так мы зададим переменную IsDead, зависящую от состояния смерти игрока.
Затем мы воспользуемся нодом Blend Poses by bool.
Использование нода Blend Poses by Bool
Переключитесь на Anim Graph и добавьте анимацию SK_Muffin_Death. Выбрав её, перейдите в панель Details и снимите флажок со свойства Loop Animation.
Благодаря этому анимация смерти будет проигрываться только один раз.
Затем создайте нод Blend Poses by bool.
Выберите нод Blend Poses by bool и перейдите в панель Details. В разделе Option поставьте флажок на свойстве Reset Child on Activation.
Поскольку анимация смерти проигрывается всего один раз, эта опция гарантирует, что анимация сбрасывается перед воспроизведением.
Наконец, добавьте переменную IsDead и соедините всё следующим образом:
Теперь если переменная IsDead будет равна true, то начнёт воспроизводиться анимация смерти. Если IsDead равно false, то будет воспроизводиться текущая анимация конечного автомата Locomotion.
Нажмите на Compile и закройте ABP_Muffin. Нажмите на Play и протестируйте новую анимацию смерти!
Заголовок спойлера
Куда двигаться дальше?
Скачать готовый проект можно здесь.
Теперь игра выглядит гораздо более качественной, не так ли? На основе уже полученных знаний можно сделать многое, но это ещё не конец! Изучите страницу Skeletal Mesh Animation System документации Unreal Engine. Здесь можно узнать о других типах анимационных ассетов и о способах их использования.
Если вы хотите продолжить обучение, то читайте следующую часть туториала, в которой я покажу вам, как добавлять в игру музыку и звуковые эффекты.
- unreal engine 4
- анимации
- Разработка игр
- Unreal Engine
Что такое ретаргетинг анимации — и как сделать его в Unreal Engine 5
Поэтапное описание процесса и разбор основных проблем, которые могут возникнуть у начинающего специалиста.
Иллюстрация: Катя Павловская для Skillbox Media
Леон Балбери
Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.
Создание анимации вручную — довольно кропотливая работа. Чтобы движения персонажа выглядели органично, разработчику нужно постоянно проверять расположение костей в скелетной анимации и их перемещение во время ключевых кадров. Как ускорить процесс, если технология мокапа недоступна, а на создание уникальной анимации просто нет ресурсов? В этой ситуации может помочь ретаргетинг.
Из этого материала вы узнаете:
- как работает перенаправление анимации с одного скелета на другой;
- в чём специфика экспорта моделей со скелетом из Blender в Unreal Engine 5 без использования дополнительных аддонов;
- как перенаправить анимации с манекена Unreal Engine на другую модель;
- в чём специфика работы сервиса Mixamo;
- с какими проблемами чаще всего сталкиваются при ретаргетинге и как их можно решить;
- что почитать и посмотреть на тему ретаргетинга.
Что такое ретаргетинг анимации
Ретаргетинг анимации — это процесс перенаправления готовых анимаций на объект с идентичным ригом, но другим мешем, или на объект, скелет которого отличается от оригинала иерархией костей, но имеет с ним сходства в строении. В результате такого переноса риг модели полностью копирует движения рига-источника.
Этот метод ускоряет производство, так как избавляет от необходимости создавать уникальные скелеты для персонажей с разным телосложением. Техника также станет хорошим подспорьем для начинающих пользователей: не нужно будет тратить время на создание анимаций с помощью ключевых кадров, рискуя ошибиться с расположением и поворотом костей скелета. Например, если в визуализации нужно продемонстрировать стандартные действия персонажа (ходьбу, бег, прыжок и так далее), не обязательно делать их вручную. Можно зайти в бесплатный сервис Mixamo, загрузить FBX-файл с моделью персонажа, выбрать подходящую анимацию из каталога, скачать её, а затем импортировать в программу для 3D-моделирования или в игровой движок.
Как происходит ретаргетинг анимации
Процесс ретаргетинга во многом зависит от специфики программы или редактора, но перенос анимации проходит по общему принципу.
Каждый риг содержит набор данных: наименования костей, их расположение и исходные пропорции при перемещении. Для моделей с другим ростом, толщиной и длиной конечностей простой привязки исходного скелета недостаточно: необходимо перенаправить данные костей. В противном случае во время анимации появятся различные дефекты — например, растяжки или исчезновение определённых частей меша.
На иллюстрации ниже слева изображён персонаж со скелетом, созданным под его пропорции во время воспроизведения анимации бега с оружием. На остальных двух кадрах запечатлены персонажи в этой же позе, но внешне они отличаются от первого объекта, к тому же оригинальный скелет привязан к их мешу без ретаргетинга.
После перенаправления скелетной анимации видимые дефекты исчезают, так как теперь расположение костей соответствует влиянию на определённые участки меша при движении.
По тому же принципу можно перенаправить данные на другой скелет с другими группами костей, но похожий по строению.
Примечание
Система ретаргетинга не переносит данные о вращении костей — они зависят от исходных значений в анимациях.
Ретаргетинг в Unreal Engine 5
С релизом версии Unreal Engine 5.1 процесс ретаргетинга стал проще благодаря связке нового ассета IK Rig с IK Retargeter. Эта связка позволяет легко перенести данные костей с одного скелета на другой. Для примера мы перенаправим анимацию со скелета стандартного манекена Unreal Engine на скелет другой человекоподобной модели. В качестве цели ретаргетинга используем лоуполи-персонажа, скелет для которого мы создавали в Blender в одном из предыдущих материалов. Для текущей задачи подойдёт любая модель с готовой арматурой, созданной по принципу человеческого скелета, за исключением моделей MetaHuman — их арматура сложнее и потребует дополнительных манипуляций.
Подготовка модели, созданной в Blender, к экспорту в движок
Если вы не используете конвертеры, например Send to Unreal или Auto-Rig Pro, при переносе модели из Blender в Unreal Engine стоит учитывать несколько нюансов.
- Убедитесь, что меш и скелет расположены ровно в центре, то есть в нулевых координатах по всем осям. Иначе при экспорте возникнут проблемы с позиционированием ассета в сцене.
- В Blender и Unreal Engine разные единицы измерения. По умолчанию в Blender одна единица — это один метр, а в UE такая же единица — один сантиметр. Из-за этого возможны проблемы с отображением костей в движке.
Например, на официальном форуме пользователи часто спрашивают, почему джойнты импортированного скелета в Unreal Engine выглядят слишком большими и вьюпорт превращается в сетку из огромных сфер. Чтобы этого не произошло, перед экспортом переходим в настройки сцены (значок капли) и проверяем, что Система единиц (Unit System) выбрана Метрическая (Metric), а затем изменяем Масштаб единиц (Unit Scale) на 0.01. После этого меш и скелет уменьшатся в размерах. Переходим в ортогональный режим и масштабируем оба объекта до нужного значения: нажимаем S и набираем 100, тем самым увеличивая объект в 100 раз. Чтобы было удобно видеть объект во вьюпорте после этой операции, открываем на боковой панели Вид (View) и изменяем Начало от (Clip Start) на 0.1, а Конец (End) на 100.
Если все условия экспорта были соблюдены, вероятность того, что Unreal Engine выдаст ошибку при загрузке модели, будет минимальной.
Импорт контента в Unreal Engine
Запускаем Unreal Editor и открываем шаблон Third Person — или добавляем контент Third Person в существующий проект. Создаём отдельную папку в разделе Characters и перемещаем в неё модель FBX, созданную в Blender. При импорте появится диалоговое окно. Указываем следующие настройки:
После этого в папке появятся Static Mesh, Skeletal Mesh, Physics Asset и все материалы, которые задействованы в данной модели. В Unreal Engine при работе с анимациями используют Skeletal Mesh. В отличие от Static Mesh, этот тип меша содержит данные арматуры. Именно его используют в проекте для создания игровых персонажей и NPC. Например, аватар в шаблоне Third Person — это Skeletal Mesh манекена Unreal Engine 5.
Наша текущая задача — перенести данные костей со стандартного рига манекена на риг импортированного персонажа. Во избежание путаницы для обозначения ригов во время процесса ретаргетинга мы будем использовать термины движка:
- Источник (Source) — Skeletal Mesh актора, с которого будут перенаправлены анимации (в данном случае — манекен Unreal Engine);
- Цель (Target) — Skeletal Mesh актора, на который нужно перенаправить анимации (в данном случае — импортированная модель).
Создание IK Rig
Нажимаем ПКМ в области Content Browser, чтобы вызвать меню создания ассетов, и в разделе Create Advanced Asset находим вкладку Animation, далее — IK Rig → IK Rig. В диалоговом окне выбираем Цель, то есть Skeletal Mesh загруженной модели. Даём созданному ассету новое название и открываем его. В новом окне будем работать с вкладкой IK Retargeting, расположенной в правом нижнем углу. В ней создаются так называемые цепи (Chain) — объединённые группы костей, которые в дальнейшем можно сопоставить с арматурой другого скелета.
В окне слева выделяем группу костей позвоночника (с пометкой spine) и нажимаем Add New Chain. По умолчанию движок предлагает объединить их в цепь Spine. Подтверждаем. Далее следует уточнение, нужно ли добавить IK Goals — точки для изменения положения конкретного сегмента (работают по принципу IK-костей в Blender, которые мы разбирали в материале по риггингу). Выбираем No Goal.
Примечание
Редактор автоматически предлагает подходящее имя цепи, исходя из списка костей. Если он не распознает кость, то выставит название по умолчанию — NewRetargetChain. В любом случае эти данные можно изменить при подтверждении операции или позже при редактировании.
Первая цепь готова. По этому же принципу создаём остальные группы, стараясь объединять их в логические сегменты. Например, в текущем риге кость шеи (neck) можно объединить с костью головы (head) и создать цепь Head. А в группу LeftArm добавить все кости руки, в частности ключицу (clavicle). Аналогичные связки создаём для цепи костей ног и правой руки.
Примечание
В цепи добавляют только те группы костей, которые будут задействованы при переносе анимаций. Например, совсем не обязательно создавать цепи для костяшек пальцев, если они не будут сгибаться во время движения.
В Unreal Engine есть своя специфика в отношении root bone. В качестве root bone обычно задействуют бедренную кость (pelvis или hips). Выделяем её в списке ПКМ и выбираем Set Retarget Root. При этом вносить root в список цепей костей для будущего перенаправления не нужно.
Создав все необходимые цепи, сохраняем ассет и сворачиваем окно. Далее нужно проделать аналогичную операцию с Источником. Создаём новый IK Rig и выбираем подходящий Skeletal Mesh. В UE5 доступно несколько видов манекенов, которые различаются как анимациями, так и иерархией костей. И в целом выбор зависит от скелета, на который будут перенаправлены анимации. Нет смысла брать стандартный риг, если скелет Цели простой, так как в состав цепей войдут лишь основные кости. В случае с лоуполи-моделями можно ограничиться классическим манекеном из UE4 (68 костей) или выбрать Manny_Simple или Quinn_Simple. Костей в арматуре последних почти в два раза меньше, чем в стандартном манекене (89 вместо 161). В этом примере выбран Skeletal Mesh Quinn_Simple.
Теперь наша задача — создать в IK Rig Источника такие же цепи костей, как и у Цели. Возможно, даже в скелете Simple-манекена окажется гораздо больше костей, чем в импортированном, но всё содержимое можно также разделить на логические сегменты. Главное, чтобы общее содержание цепей совпадало у обоих ригов. Придерживаться одинаковых наименований цепей при этом не обязательно. В текущем примере у Цели есть цепь Head (кость шеи и головы), а у Источника — цепь Neck (две кости шеи и кость головы). Если сопоставить их между собой на следующей стадии, редактор всё равно поймёт, что кости в этих группах выполняют одинаковые задачи.
При массовом выделении костей в списке слева редактор создаёт несколько дополнительных цепей. Поскольку при выборе затронута одна или несколько подгрупп, он автоматически разбивает одну цепь на несколько дополнительных в соответствии с иерархией.
Если это произошло, выделяем необходимую кость, которую не получилось автоматически вписать в основную цепь, и в окне IK Retargeting указываем её как конечную (End Bone), а остальные сгенерированные цепи удаляем. Также можно изначально выделить только те кости, которые требуются для определённой цепи.
Далее переносим точку root на бедренную кость, как ранее в IK Rig Цели: нажимаем ПКМ на кость pelvis и выбираем Set Retarget Root.
Работа в IK Retargeter
Закончив сборку цепей, сохраняем ассет, сворачиваем окно и в Content Browser создаём новый ассет — IK Retargeter. Он расположен в той же вкладке, что и IK Rig. В диалоговом окне нужно выбрать, какой IK Rig будет Источником. В данном примере мы переносим анимации с Quinn, поэтому выбираем этот IK Rig.
Созданный ассет переименовываем на своё усмотрение и открываем. В новом окне отдаляем камеру во вьюпорте колёсиком мыши, чтобы лучше видеть модель. В настройках справа указано, что этот риг — Источник (Source), и теперь нужно назначить Цель. В разделе Target указываем IK Rig, который мы создавали в самом начале. После этого Цель появится в той же точке, где находится Источник.
Во время ретаргетинга анимации учитывается изначальное положение скелета, то есть A- или Т- поза. Манекены в UE по умолчанию находятся в A-позе. Поэтому, если Цель изначально была в Т-позе, положение рук необходимо изменить, иначе при дальнейшем ретаргетинге меш импортированной модели будет деформирован. Аналогичные манипуляции потребуются и в случае, если источником окажется модель в T-позе — тогда Цель в A-позе (например, тот же манекен) также нужно привести в Т-позу.
Чтобы придать Skeletal Mesh A-позу, нужно убедиться, что в меню слева отмечена Target, и перейти в режим Edit Mode. Из списка выбираем кость плеча, которая отвечает за подъём руки (обычно это upper arm или shoulder) и перемещаем её в положение, максимально близкое к плечу Источника. Если размер меша Цели отличается от размера меша Источника, в настройках справа его можно увеличить или уменьшить (параметр Target Mesh Scale) и так добиться более аккуратного позиционирования. В данном примере плечи Цели находятся на одном уровне с плечами Источника, и необходимо лишь немного сместить предплечье и кисть руки вперёд. Выбираем левую кость предплечья из списка, поворачиваем её относительно осей, запоминаем координаты в настройках справа и по ним сверяем правую руку.
Закончив правки, отодвинем Цель в сторону. Для этого нужно изменить первое значение (ось X) в параметре Target Mesh Offset. Напоследок проверяем, соответствуют ли цепи костей обоих ригов друг другу. Особенно важно проверить цепи с разными названиями, как в случае со связкой Neck и Head, которая упоминалась ранее. Убедившись, что всё верно, переходим во вкладку Asset Browser со списком поз и проверяем результат.
Понравившиеся анимации можно экспортировать, нажав на Export Selected Animations (кнопка с зелёной дискетой). В настройках экспорта по желанию можно добавить к названию префикс и суффикс: они помогут быстрее отыскать ассет в строке поиска. Полученные анимации уже будут относиться к Skeletal Mesh Цели, и их можно использовать в дальнейшей работе.
Итоги и преимущества описанного подхода
Со стороны может показаться, что в этом материале выбран довольно сложный подход, ведь в теории можно просто загрузить модель в Mixamo, подобрать подходящие анимации из каталога и скачать их. Но в этом случае есть риск столкнуться с дополнительными сложностями.
Во-первых, сервис Adobe может загружать напрямую не любые модели. По опыту пользователей, Mixamo часто выдаёт ошибки при воспроизведении высокополигональных моделей, требует переконвертации, а также не отображает текстуры, если они состоят из нескольких карт. Это значит, что работа с более детальными моделями потребует дополнительных манипуляций. Надёжным способом считается ретаргетинг анимации с помощью аддона Rokoko Mixamo в Blender. На сайте Mixamo из каталога подбирают модель, схожую по комплекции с оригинальной, сохраняют необходимые анимации, загружают в Blender и с помощью аддона перенаправляют данные костей. Полученную анимацию можно использовать в рамках программы или экспортировать в движок.
Во-вторых, прямая загрузка анимаций из Mixamo в Unreal Engine часто сопровождается ошибками. Самая распространённая из них — Mesh contains root bone as root but animation doesn’t content root track, из-за которой импорт невозможен. Это происходит, потому что Mixamo генерирует свой риг без кости root. Из-за этого придётся импортировать персонажа из сервиса, в котором есть арматура Mixamo по умолчанию, а затем перенаправлять анимацию на нужную Цель. Эту проблему также можно решить с помощью дополнительных плагинов типа Mixamo Animation Retargeting 2 и других похожих инструментов, но процесс также потребует дополнительного времени и финансовых затрат.
Способ ретаргетинга, описанный в этом материале, позволяет легко переносить анимации из Mixamo с помощью бесплатной утилиты Mixamo Converter. В комплекте с программой идут адаптированные FBX-файлы манекенов из четвёртой и пятой версий Unreal Engine — можно загрузить их в сервис Mixamo без ошибок, выбрать понравившиеся анимации из каталога, скачать их риг, а затем с помощью утилиты сконвертировать FBX-файл под стандарты движка. В интерфейсе программы есть скриншоты, где указаны настройки, которые нужно задать при загрузке файлов в редактор. После успешного импорта скачанные анимации можно перенаправить с манекена на другого персонажа в окне ассета IK Retargeter.
Если что-то пошло не так…
Ниже перечислено несколько распространённых проблем, с которыми может столкнуться начинающий пользователь в процессе ретаргетинга в Unreal Engine 5, и возможные варианты их решения.
- Меш Источника во вьюпорте парит в воздухе, в отличие от Цели.
Решение. Можно создать цепь кости для Root и в самом IK Retargeter выделить эту цепь в меню Chain Mappings. Откроется панель с настройками, где в разделе FK Adjustments нужно найти параметр Translation Mode и выбрать в нём Globally Scaled. Если в ретаргетинге задействован манекен из UE4, рекомендуется посмотреть руководство по настройке костей root и pelvis и назначению им параметра Animation Scaled. На официальном форуме разработчиков отмечают, что эта техника во многих случаях помогает решить проблему с перенаправлением кости root.
- Retarget Output Log выдаёт следующие ошибки: IK Retargeter could not find source root bone… IK Retargeter unable to initiate source root «Bone» in Skeletal Mesh.
Решение. Скорее всего, не назначена Set Retarget Root на кости pelvis/hips и движок не распознаёт её в процессе ретаргетинга. Если после появления сообщения об ошибке вы исправили недочёт в IK Rig персонажа, но при этом в IK Retargeter один из мешей сместился по вертикали, следует попробовать один из способов, указанных в первом пункте.
- Отдельные части меша Цели (чаще всего это пальцы) при ретаргетинге неестественно вытянуты или повёрнуты не в ту сторону.
Решение. Необходимо выставить Цель в более точную позу по отношению к оригиналу.
- Захват анимаций работает, но не полностью (некоторые части меша остаются неподвижными или двигаются неправильно).
Решение. В какой-то из цепи костей Источника и Цели есть несоответствия. Нужно ещё раз проверить содержания цепей каждого IK Rig.
- Ретаргетинг работает, но отдельные части меша персонажа неестественно смещаются в процессе анимации.
Решение. Нужно вернуться в программу для 3D-моделирования и правильно распределить вес по модели. Также, если во время ретаргетинга скелет активен, но сам меш или его часть остаются неподвижными, — значит, рисование веса не закончено.
Решения многих проблем, связанных с ретаргетингом, можно найти на официальном форуме по Unreal Engine.
Полезные ссылки
- Раздел официальной документации Unreal Engine, посвящённый ретаргетингу.
- Подробный видеоурок по ретаргетингу анимаций в Unreal Engine 5 (канал Druid Mechanics).
- Видеоурок по ретаргетингу MetaHuman (канал MR3D-Dev).
- Пошаговый урок с переносом анимации Mixamo на персонажа MetaHuman (канал Jobutsu).
- Видеоурок по интеграции и ретаргетингу персонажа из Character Creator 4 в Unreal Engine 5 и настройка блюпринта анимации для управления им в качестве игрового персонажа в рамках шаблона Third Person (канал Yepkoo).
Например, у человекоподобного персонажа в любом случае будут две руки, две ноги, туловище и голова.
Ассет с данными коллизии и другими элементами, связанными с физикой.
Новые анимации появятся в списке Asset Browser.