Как собрать 3D-персонажа с помощью ИИ: от портрета до анимации в Unreal Engine 5

Разработка игры Dungeon Cult на Unreal Engine 5 началась как проект о строительстве подземелья, но со временем в ней появился личный персонаж автора — Проводник. Он должен был выглядеть как создатель игры, носить плащ, разговаривать, показывать дорогу и реагировать на происходящее. Для создания героя использовали генеративные инструменты, локальные модели, ИИ-агентов и стандартные средства Unreal Engine.
ИИ в этом процессе не работал как полностью автономный разработчик. Агентам поручали обработку моделей, экспорт и написание проверок, а человек выбирал подходящую внешность, оценивал результат и возвращал неудачные версии на переделку. Основная сложность оказалась не в получении отдельных красивых кадров, а в том, чтобы собрать из них устойчивого персонажа, который одинаково хорошо выглядит в просмотрщике и внутри игры.
Генерация головы оказалась только началом
Первую голову создали локально в Pixal3D на компьютере с RTX 5060 Ti и 16 ГБ видеопамяти. Генерация в разрешении 1024 с текстурой 4096 × 4096 заняла 273 секунды, пиковое потребление VRAM составило 7,45 ГБ. Итоговая модель насчитывала 476 069 треугольников. Попытка работать с разрешением 1536 не поместилась в доступную память.
Дальше началась серия исправлений бороды, усов, бровей, глаз и рта. Проблема генеративной модели проявлялась особенно заметно на собственном лице: небольшие изменения быстро разрушали сходство. После сглаживания бороды возникали куски и отверстия, при пересборке подбородка растягивалась текстура щетины, а добавление глаз и ресниц делало взгляд слишком открытым. Версии 18 и 19 пришлось отвергнуть и вернуться к более удачной версии 15.
Чтобы лицо постепенно не менялось до неузнаваемости, в следующих заданиях агенту явно ограничили область работы: нужно было исправлять только участок под глазами, не трогая контуры глаз, брови, нос и остальные детали. Сравнение проводили в просмотрщике с одинаковым освещением, держа рядом исходный портрет. Это помогало не сравнивать каждую новую модель только с предыдущей и не терять сходство шаг за шагом.
Почему исправления не сразу появились в Unreal
После очередной правки под глазами оставались светлые круги. В локальном просмотрщике они почти исчезли, но в Unreal Engine снова стали заметными. Диагностика показала сразу несколько причин: у кожи и вставленных век различались нормали, а два материала имели одинаковые названия. Из-за этого движок назначил полупрозрачному краю непрозрачный материал.
Кроме того, голова уже дошла до версии 46, а Unreal продолжал использовать текстуру от версии 29. Новая геометрия загружалась, но часть старой окраски оставалась в сцене. Экспорт пришлось изменить так, чтобы обновлялся и соответствующий PNG, а результат начали проверять после повторного открытия сцены. Этот случай показал, что успешный экспорт файла ещё не означает, что именно он используется в игре.
Мимика, рот и синхронизация речи
У готовой головы не было полноценного лицевого рига и внутренней части рта. Перенос внешности в MetaHuman не решил задачу: одна попытка дала лицо-маску перед увеличенным черепом, другая изменила внешность настолько, что результат снова пришлось отклонить. В одном из экспортов также не подключился ресурс лицевого рига, поэтому анимационные данные существовали, но персонаж оставался неподвижным.
В итоге сохранили исходную голову и волосы, а мимику дорабатывали отдельно. В текущей версии используется 21 канал: моргание, движение взгляда, брови, улыбка и формы рта. Для речи применяются шесть основных форм, включая смыкание губ и положения для звуков «ф» и «в». Они смешиваются во времени, а не переключаются как набор отдельных изображений.
Отдельной проблемой стало двойное движение челюсти: оно уже присутствовало в формах рта и дополнительно добавлялось системой анимации. Формы привели к единой нейтральной основе, а сумму речевых весов ограничили. Для привязки речи использовали локальную модель распознавания русского языка wav2vec2. Она помогала получить временные ориентиры для букв, после чего скрипт строил переходы между формами рта с учётом громкости.
Первая версия липсинка на общем плане почти не читалась: губы лишь слегка поднимались, хотя звук и анимационные кривые были корректными. Переходы сделали короче, отдельные положения рта начали ненадолго удерживаться, а первые секунды сцены пересняли крупнее. При этом проверять пришлось не только техническую работу анимации, но и то, заметит ли её зритель в готовом кадре.
Посадка головы на костюм и настройка движения
Костюм создавался отдельно и включал плащ, красный воротник, ремни, сумку и перчатки. При генерации важную роль сыграла даже почти незаметная тень под обувью: слабые пиксели в альфа-канале превратились в лишние фрагменты геометрии. После обнуления значений альфы ниже 16 количество мусора уменьшилось.
Генератор объединил подбородок, шею и воротник в одну оболочку, поэтому простая замена головы не сработала. Прямоугольное вырезание срезало часть одежды, выделение по цвету оставляло крапинки, а новая граница давала рваный край. Более удачным решением стала модель с тёмной высокой водолазкой, после чего голову увеличили на 9%, вернули шею назад и сужали её только ниже челюсти.
Для ходьбы использовали анимации из Game Animation Sample и переносили их на скелет персонажа. Тело упростили примерно с 880 тысяч до 200 тысяч треугольников, однако проблемы были связаны не только с плотностью сетки. Сумка и пояс оказались привязаны к руке и были перенесены к тазу, а для обуви пришлось сделать более жёсткую привязку к стопе. После отключения одного из этапов IK скачок локтя уменьшился с 22 до 4 градусов за кадр.
Часть ошибок возникла из-за неверно расположенных суставов: кисти находились на 11–18 сантиметров впереди костей модели. Кроме того, перемещение корня скелета вычиталось только для таза, из-за чего голова и верхняя часть тела расходились с нижней. Исправлять пришлось не веса одежды, а вычисление трансформаций и положение костей.
Проверки должны воспроизводить старые ошибки
Для сценического ролика подготовили 11 действий. Четыре жеста — «за мной», указание, остановку и неприличный жест — пришлось переделать из-за неестественной работы локтей, запястий и пальцев. После доработки использовали анатомическую основу кистей MetaHuman и отдельно согласовали движения плеча, локтя, предплечья и запястья.
Однако при соединении разговора, жеста и возврата в исходную стойку кисть снова заходила внутрь плаща. Предыдущие тесты проходили, потому что проверяли положение пальцев и углы суставов, но не пересечение руки с одеждой. Новую проверку расширили до деформируемой поверхности обеих кистей и перчаток относительно плаща, сумки и пояса. Она включила весь жест, особенно момент опускания руки, и 1021 положение между кадрами.
Старую сломанную сборку также прогнали через тест. Это принципиальный подход: если проверка не обнаруживает заранее известный дефект, её зелёный статус ничего не доказывает. В данном случае автоматизация долго подтверждала лишь то, что пальцы не пересекаются друг с другом.
Плащ, воротник и финальная сборка
Ещё один дефект выглядел как тёмная тень на плаще, но оказался его изнанкой. Внутренняя подкладка деформировалась иначе, чем наружная ткань, и выходила наружу. Участок подкладки пересобрали, согласовали веса с внешней поверхностью и сместили внутрь на 8 мм.
Позже выяснилось, что часть шеи и подкладки исчезла при экспорте из-за неполного списка разрешённых деталей. Воротник восстановили отдельно, а исправленное тело сделали самостоятельным компонентом, который повторяет позу основного скелета через Leader Pose. Сборку проверяли после повторного открытия сцены и осматривали спереди, сбоку, снизу и при наклоне головы.
История Проводника показывает, что создание игрового 3D-персонажа с помощью ИИ состоит не из одной генерации, а из длинной цепочки проверок. Нужно контролировать сходство лица, версии текстур, материалы, нормали, риг, веса, трансформации, экспорт и поведение модели в конкретном кадре. Даже исправленная геометрия бесполезна, если движок загружает старый ресурс, а работающий тест — если он не воспроизводит реальные движения персонажа.


