
Далее приступаем к работе с игровым движком. Создаём проект, внутри которого будут два уровня: в одном будут производиться тесты грума, а в другом — тесты real-time волос.
Для удобства презентации поставим в сцене циклораму с освещением.

Окно управления проектами UE 5

Content Browser UE 5

Сцена с персонажем и циклорамой
Чтобы осуществить импорт грума, подключаем плагины Groom и Alembic Groom Importer. Волосы приходят в проект отдельно от персонажа, и их можно подогнать во вьюпорте по координатам. Пока что на них нет материала.
Подключение плагинов
Подключение плагинов
Грум во вьюпорте Unreal Engine
Если зайти в настройки ассета (в Content Browser ассет волос обозначается как грум), то здесь можно поварьировать параметры, например, толщину кончика или корня волос. Тут же сталкиваемся с первой проблемой: волосы проросли насквозь головы, и это портит эстетику, хотя в Maya маска роста волос была сделана правильно и сохранена на диск, а гайды не проходили через меш. В дальнейшем можно попытаться поискать решение такого вопроса.
Настройки ассета грума
Волосы, проросшие насквозь
Волосы, проросшие насквозь
Следующей проблемой стал выбор способа соединения меша персонажа и грума, ведь они пришли в проект по отдельности. Для этого был создан блюпринт, в который добавлен скелетный меш бота и грум. Отельно был создан HeadSocket на кость, которая вращает голову. HeadSocket — это кластер, к которому был привязан грум. Далее внутри блюпринта можно подвинуть прическу так, чтобы она точно прилегала к голове, а в настройках физического ассета тела бота настроить капсулы физики (которые определяют зону коллизии). Теперь волосы двигаются синхронно с костью головы.
Создание Head Socket на джоинте
Причёска и меш внутри блюпринта
Остаётся добавить симуляцию. В настройках грума есть пункт Enable Simulation. Здесь нужно поставить галочку. Чтобы проверить, насколько правильно она работает, возвращаемся в блюпринт персонажа и видим, что амплитуда слишком большая. Далее эта проблема решается долгим подбором значений в параметрах симуляции, а чтобы волосы не пересекали меш головы, нужно грамотно поставить коллизию. С первого раза сделать такое очень трудно. Но уже заметно, что симуляция работает, а значит, можно сделать её физически корректной.
Подключение симуляции к груму
Изменение размеров капсул коллизии
Чрезмерно высокая амплитуда симуляции
Добавление персонажа в секвенсер для записи анимации
Пример физики грума внутри Maya XGen. «Холодное сердце 2», 2019, Disney.
Модуль MetaHuman для UE5 позволяет создавать цифровых аватаров для внедрения в движок. Волосы MetaHuman представляют собой чистый грум, поддерживаемый плагином Groom. Следовательно, движок в принципе способен выдерживать нагрузку от грума, но метахьюман слишком тяжёл для геймдева.
Модели из MetaHuman
С плашками ситуация выглядит ещё интереснее. Их нужно импортировать в движок как скелетный меш. Для этого пришлось достроить дополнительные джоинты от головы и прискинить их к мешу плашек.
Экспорт частей персонажа из Maya в формате .fbx
Работа над скином в Blender
Работа над скином в Blender
Работа над скином в Blender
Работа над скином в Blender
После распределения весов в скине меш причёски движется вместе с костью головы
Дополнительные джоинты влияют на отдельные пряди
На этом этапе возникла новая сложность — движок не захотел принимать риг, полученный при экспорте из блендера. Это объясняется только нестабильностью работы функций движка, и после нескольких попыток рескейла Unreal загрузил модель.
Подбор значений для рексейла в Blender
Персонаж снова добавляется в блюпринт, но на этот раз нужно построить нодовую связь между ботом и причёской так, чтобы бот был ведущим телом, а причёска — ведомым, и забирала информацию об анимациях от основного скелета. Плюс меш причёски был преобразован в физический ассет, и ему были добавлены капсулы коллизии на джоинты, а к самим джоинтам были привязаны констрэйнты. Это ещё один способ соединить волосы и персонажа. Он показался менее удобным, потому что анимацию здесь можно записать только внутри блюпринта, а не в секвенсере. Для этого был создан дополнительный, анимационный блюпринт.
Персонаж и скелетный меш плашек внутри блюпринта
Нодовая взаимосвязь между ассетами в блюпринте. Скелетный меш выполняет ведущую функцию, а причёска играет роль таргета.
Преобразование причёски в физический меш
Преобразование причёски в физический меш
Добавление новой капсулы к джоинтам на причёске
Выбор типа физики: Kinematic
Такой размер капсул слишком большой для волос на картах
Оптимальный размер капсул
Привязка констрэйнтов к капсулам
Привязка констрэйнтов к капсулам
Добавление физики твёрдых тел к физическому ассету причёски
Добавление физики твёрдых тел к физическому ассету причёски
Добавление физики твёрдых тел к физическому ассету причёски
Физика твёрдых тел показалась более податливой и аккуратной, чем симуляция внутри грума. Здесь был подобран кинетический тип физики. Дополнительно к нему можно подключить cloth-симуляцию. Они могут работать как отдельно, так и вместе. Всё зависит от задачи и от предпочтений заказчика/специалиста. Что не очень импонировало — так это то, что отключать ту или иную симуляцию нужно внутри нодовой системы, а не имея опыта, в ней бывает проблематично ориентироваться. Но тем не менее результат того стоил: плашки движутся очень аккуратно и создают впечатление волос
Cloth-симуляция используется для написания физики одежды. «Mortal Kombat 11» собран на движке Unreal Engine 3. 2019, WB Games
Создание cloth-симуляции для скелетного меша причёски
Создание cloth-симуляции для скелетного меша причёски
Окно редактора cloth-симуляции
Активация cloth-симуляции
Распределение влияния cloth-симуляции на меше происходит по аналогии с развесовкой скина на риге
Процесс скининга меша
Рабочая cloth-симуляция. Пряди устремились вниз под действием физики
На основе полученных ранее карт текстур строится шейдер волос. Полигональные полоски становятся невидимыми из-за действия маски прозрачности
Следующий эксперимент — измерение нагрузки на движок. Один из способов проверки — включение отображения fps, где программа подсчитает в том числе задержку отрисовки.
Измерения следует проводить при прочих равных условиях.
Наиболее эффективный результат дают измерения в максимально перегруженной сцене.
В среднем разница задержки между грумом и картами волос составила 3 fps с одинаковых камер в пустой сцене с циклорамой и пятью источниками света.
Проведение измерений нагрузки на движок в различных условиях
Проведение измерений нагрузки на движок в различных условиях
Проведение измерений нагрузки на движок в различных условиях
Подключение анимации в анимационный блюпринт для тестов рендера. Записанная на конкретный скелет анимация добавляется в нодовый редактор через Drag-and-Drop и соединяется с компонентом
Статичные карты волос на рендере
Колебания карт под действием физики
Симуляция внутри грума более чувствительная и трудная в управлении