The Jerusalem PostPolice officer charged with sex offenses against two colleaguesDaily MaverickAfter The Bell: The wonderful and strange business of prognosticationInquirerManila North sees 660,000 visitors on All Souls’ DayZDF heuteAktuelle Pressemitteilungen des ZDFThe Sydney Morning HeraldUS midterms 2026 LIVE updates: Donald Trump to make final election pitch from Reflecting Pool as Americans head to polls; Republican control of House and Senate under threat from DemocratsRai NewsSera 24 - Puntata del 02/11/2026الشرقإعلام إسرائيلي: نتنياهو منفتح على إجراء محادثات لتشكيل حكومة بقيادتهSRF NewsPressefreiheit in Russland – Der «Novaya Gazeta» geht die Luft austazAusschreitungen nach Gen-Z-Protesten: Und wieder als fremd markiertConsequenceBoy Throb Announce 2027 North American TourRTP DesportoTreinador do Shakhtar Donetsk respeita Tiago Fernandes e SportingBillboardThe Longest-Leading Billboard Hot 100 No. 1s: ‘Choosin’ Texas’ & More
The Daily Newsstand · Free, Always
Monday, November 2, 2026

Захотел добавить себя в игру. Как я собирал 3D-персонажа с помощью ИИ

Translate

Я делаю Dungeon Cult — игру про строительство подземелья на Unreal Engine 5. В какой-то момент захотелось добавить туда себя: в плаще, с моей причёской, голосом и не самым дружелюбным выражением лица. Так появился Проводник. Ему нужно ходить, разговаривать, показывать дорогу и иногда вполне понятно объяснять, что он обо всём этом думает.

Ролик и вся эволюция персонажа — в галерее на GitHub Pages. Там можно увеличить сравнения и переключить две версии разговора на одном и том же месте реплики. Ниже разберу, что между ними пришлось чинить.

Первую голову я получил в локальной Pixal3D за 273 секунды. Посмотрел — надо поправить бороду, глаза, рот. На версиях №18 и №19 я уже перестал узнавать себя и попросил вернуть прежнее лицо. Потом попробовал MetaHuman, чтобы добавить мимику, — и снова получил не себя. Когда внешность наконец устроила, выяснилось, что посадить голову на костюм тоже не так просто: вместе со старой шеей вырезался воротник. А стоило поднять руку — кисть залезла в плащ. Вот из таких переделок и собрался персонаж из ролика.

Код и обработку моделей я поручал ИИ-агентам. Сам выбирал внешность, смотрел результаты и возвращал на переделку то, что не устраивало. Дальше покажу эти попытки: почему я отказывался от очередного «улучшения», где помог откат и как проверки умудрялись проходить, пока рука была внутри плаща.

Своё лицо оказалось сложнее монстра

Начал с портрета. Pixal3D запускалась локально на RTX 5060 Ti с 16 ГБ видеопамяти. В том запуске использовалось разрешение 1024 и текстура 4096 × 4096; экспорт занял 273 секунды, пик VRAM — 7,45 ГБ. На выходе получилось 476 069 треугольников. Проба разрешения 1536 до этого не поместилась в доступную память. Это замеры одной генерации, без последующей доводки.

Исходное фото слева, промежуточная версия №15 справа

Исходное фото слева, промежуточная версия №15 справа

Это ещё промежуточный вариант. К №15 я уже несколько раз просил переделать бороду, усы, брови и рот. Но на этом с лицом не закончил.

Как Проводник выглядит сейчас — кадр из ролика в Unreal Engine 5

Как Проводник выглядит сейчас — кадр из ролика в Unreal Engine 5

А так персонаж выглядит сейчас. Здесь уже доработанные лицо, волосы и мимика, голова на костюме. Свет и ракурс отличаются от сравнения выше — это кадр из сцены в Unreal. Дальше — что пришлось переделать по дороге от №15 до этого результата.

На монстре можно принять необычную форму за задумку. На своём лице сразу видно: вроде похоже, но я так не выгляжу. Сгладили бороду — появились отдельные куски и отверстия. Пересобрали подбородок — снизу растянулась текстура щетины. Добавили глаза и ресницы — взгляд стал слишком раскрытым. Сузили веки и поправили кожу под ними — лицо перестало быть моим.

Версии №18 и №19 я отверг именно из-за потери сходства. Для следующей попытки вернулись к №15 и правили только участок под глазами. Контур глаз, брови, нос и остальное лицо оставили в покое. Это пришлось закрепить в задании агенту: просьба убрать один дефект не означает разрешение заново переделать всё вокруг.

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

Почему в браузере стало лучше, а в Unreal — нет

После очередного исправления под глазами оставались светлые круги. В локальном просмотрщике они уже почти не мешали, а в Unreal снова бросались в глаза. Пошли проверять свет, тени, шероховатость, цвет и нормали — направления, по которым поверхность отражает свет. Для этого агент снимал одну и ту же голову в разных диагностических режимах: без освещения, с однотонным материалом, с цветными обозначениями отдельных частей.

Нашлись сразу несколько причин. У кожи и вставленных век отличались нормали, поэтому боковой свет подчёркивал стык. В другом месте два материала назывались одинаково: движок назначил полупрозрачному краю непрозрачный материал, и на лице появился отчётливый лоскут. Но отдельный сюрприз ждал в экспорте.

Голова дошла до версии №46, а Unreal продолжал загружать отдельный файл текстуры от №29. Новая геометрия приезжала, часть старой окраски оставалась. Исправления в файле модели были, в сцене их не было. Экспорт переделали так, чтобы он обновлял и этот PNG, а проверять результат стали уже после повторного открытия сцены.

Круги под глазами до и после исправлений в Unreal

Круги под глазами до и после исправлений в Unreal

Сравнение включает исправления экспорта и стыков кожи. Приписывать весь результат только замене текстуры было бы неверно.

Если бы повторял это сейчас, раньше проверил бы весь путь конкретного ресурса: какой файл изменился, какой импортировался и какой материал действительно использует сцена. Факт успешного экспорта почти ничего не говорит о том, что видно в игре. Часть переделок внешности пришлась на время, когда движок всё ещё показывал старую текстуру.

Лицо готово. А рот-то открыть нечем

У принятой головы не было готового лицевого рига и нормальной внутренней части рта. Снаружи есть губы, но это ещё не лицо, которое умеет произносить слова. Попробовали перенести внешность в MetaHuman — систему персонажей Epic с готовыми средствами анимации лица.

Первая подгонка дала лицо-маску перед увеличенным черепом. Другая приблизила поверхность к исходной голове, но по виду меня всё равно не устроила. Получился тот самый случай, когда можно показать небольшое численное отклонение поверхности, а человек на экране уже другой. Дополнительно выяснилось, что у одного экспорта не был подключён ресурс лицевого рига: анимационные данные существовали, лицо стояло неподвижно.

Принятая голова и попытка переноса внешности в MetaHuman

Принятая голова и попытка переноса внешности в MetaHuman

В итоге сохранили саму голову и её волосы, а мимику доводили отдельно. В текущем варианте 21 канал: моргание, взгляд, брови, улыбка и формы рта для речи. Для произношения используются шесть основных форм, включая смыкание губ и положение для «ф» и «в». Они плавно смешиваются по времени; это не переключение между шестью картинками.

Была и менее очевидная ошибка: формы рта уже содержали движение челюсти, а сверху добавлялось ещё одно. Рот деформировался дважды. Поэтому у каждой формы зафиксировали одну нейтральную основу, а сумму речевых весов ограничили. Параллельно чинили зубы, уголки губ и моргание. Исправление нормалей убирало дефект при открытом рте, но создавало бугорок при закрытом — такую правку откатили. Тёмный край губ и затемнение глаз до идеала пока не доведены.

Для привязки речи к губам использовалась локальная модель распознавания русского языка wav2vec2. По известной реплике она помогала получить временные опоры для букв, затем скрипт строил переходы между формами рта с учётом громкости. Это приближённая артикуляция, не полный захват лица. Проверять всё равно приходилось на самом персонаже: отдельно смыкание губ, «ф/в», паузы и возвращение в спокойное выражение.

И всё равно первый монтаж я вернул: «не видно, что наша модель классно умеет разговаривать, там пару раз губы только поднялись». Кривые были, звук был, а на общем плане почти ничего не читалось. Переходы слишком сглаживали разные положения рта. В следующей версии формы стали ненадолго удерживаться, а переходы между ними — короче; отдельно проверили закрывание губ и паузы. Заодно первые секунды пересняли крупнее. Геометрию лица и движения тела для этого не переделывали.

Сравнить речь до и после. Реплика и звуковая дорожка одинаковые, но поменялись и артикуляция, и камера — по этому сравнению нельзя приписать весь эффект только новым движениям губ. Для меня это была ещё одна причина проверять именно готовый кадр: работающая анимация в просмотрщике ещё не означает, что зритель её увидит.

Теперь надо было посадить голову на тело

Костюм генерировался отдельно: плащ, красный воротник, ремни, сумка, перчатки. У одной ранней версии застёжка задумывалась как птичий череп. В 3D клюв и округлые детали сложились в настолько неудачную форму, что застёжку заменили плоским костяным диском. Даже после изменения картинки мелкий рельеф в генерации сглаживался.

Более полезный дефект был под обувью: маленькие куски геометрии. Источником оказалась почти прозрачная контактная тень на входной картинке. Перед следующим запуском пиксели с альфой меньше 16 обнулили, и мусора стало меньше. Для image-to-3D важно проверять именно альфа-канал — на белом фоне слабая тень легко выглядит как «там ничего нет».

Голова у этого тела изначально была временной. Но генератор объединил подбородок, шею и воротник в общую оболочку. Попытка вырезать старое лицо прямоугольной областью срезала одежду. Выделение по цвету оставляло крапинки. Новая граница давала рваный край. Собранный взамен воротник выглядел как ведро.

Попытки посадить голову на костюм: срезы, остатки старого лица и воротник

Попытки посадить голову на костюм: срезы, остатки старого лица и воротник

Промежуточные варианты посадки головы. Открыть крупнее и посмотреть соседние этапы.

Следующий концепт получил тёмную высокую водолазку: она давала больше места для стыка. Потом отдельно подбирали размер и положение головы. Принятый размер увеличили на 9%; слишком выдвинутую вперёд шею вернули назад. Геометрию шеи сужали только ниже челюсти, причём одинаково во всех формах мимики. Когда область правки однажды захватила подбородок, под бородой появился жёсткий край, который сначала ошибочно искали в освещении.

Так что совет «просто заменить голову» я теперь воспринимаю с уточнением: сначала покажите, где у модели заканчивается голова и начинается одежда.

Когда персонаж пошёл, сломалось почти всё по очереди

Для движения взяли анимации из Game Animation Sample и переносили их на скелет персонажа. До этого тело упростили примерно с 880 тысяч до 200 тысяч треугольников. Но сама плотность сетки не объясняла, почему при ходьбе сумка тянется за рукой, а ботинок складывается пополам.

У скелетной модели каждая вершина получает веса — насколько её двигает та или иная кость. Автоматическая привязка не дала пригодного результата, веса собирались и исправлялись отдельно. Сумка оказалась привязана к левой руке: её и пояс перенесли к тазу. Носок ботинка за несколько кадров поворачивался на 17–19 градусов: для этой обуви сделали более жёсткую привязку к стопе.

Локоть дёргался до 22 градусов за кадр. После отключения одного из этапов IK, то есть автоматического решения положения конечностей, скачок уменьшился до 4 градусов. Но это не было окончательным решением всей походки. В другом месте суставы просто стояли не там, где находились руки модели: кисти были на 11–18 см впереди костей. Поправлять такую ошибку одними углами бессмысленно — сначала пришлось поставить суставы на место.

Ещё одна переделка касалась самого переноса движения. Из траектории вычитали перемещение корня скелета, но сделали это только для таза. Голова и верх тела начали расходиться с нижней частью. Исправление было в вычислении трансформаций, хотя внешне хотелось снова обвинить веса плаща.

Жест получился. Пока рука не пошла обратно

Жест Проводника и взрыв профессора

Жест Проводника и взрыв профессора

В финальный ролик добавил шутку: показываю средний палец — профессор взрывается. Его модель и детали эффекта взяты из проекта, а момент смерти выставлен для съёмки. Это ещё не игровая способность Проводника. Короткое видео без тяжёлой GIF.

Первый набор содержал 11 действий. Четыре жеста — «за мной», указание, остановку и средний палец — пришлось переделать: неестественно работали локти, запястья и пальцы. В новой версии использовали анатомическую основу кистей MetaHuman, отдельно согласовали плечо, локоть, вращение предплечья и запястье. После этого я написал: «другое дело. согласовано, давай дальше».

Но позже, при соединении разговора, жеста и возврата в стойку, кисть залезла в плащ. Все предыдущие проверки пальцев и углов суставов проходили. Они отвечали на свои вопросы, а столкновение руки с одеждой вообще не проверяли.

Шея и кисть в старой и исправленной сборке

Шея и кисть в старой и исправленной сборке

Проверку расширили до деформированной поверхности обеих кистей и перчаток относительно плаща, сумки и пояса. Причём проверяли весь жест, особенно опускание руки, с дополнительными отсчётами между кадрами. На новой связке — 1021 положение. Старый бракованный вариант тоже прогнали: тест должен был поймать известный дефект, иначе доверять ему было незачем.

Это, пожалуй, самая переносимая часть всей истории. Если агент говорит, что исправил ошибку и написал проверку, стоит дать этой проверке старый сломанный файл. Она обязана на нём упасть. У нас «всё зелёное» долго означало только то, что пальцы не пересекаются друг с другом.

Чёрное пятно на плаще оказалось его изнанкой

При ходьбе спереди появлялся тёмный кусок ткани. Похож на тень, но изменением света он не лечился. Для диагностики изнанку окрасили красным и сравнили одинаковые позы. Выяснилось, что внутренняя подкладка деформируется иначе, чем наружная поверхность, и вылезает сквозь неё.

Плащ до и после исправления внутренней поверхности

Плащ до и после исправления внутренней поверхности

Локальный участок подкладки пересобрали, согласовали его веса с внешней тканью и сместили внутрь на 8 мм. Это исправило конкретный дефект без повторной генерации костюма. Позже отдельно восстановили воротник: часть шеи и подкладки вообще пропала при экспорте из-за неполного списка разрешённых деталей. Простая чёрная заглушка под головой выглядела бы нормально только до первого поворота камеры.

Воротник до и после ремонта в нескольких ракурсах

Воротник до и после ремонта в нескольких ракурсах

Исправленное тело теперь отдельным компонентом повторяет позу основного скелета через Leader Pose. Для экспорта добавили проверку состава деталей, для сцены — проверку самой сборки после повторного открытия. Воротник смотрели спереди, сбоку, снизу и при наклоне головы. Версию v17 я принял с оставшимися небольшими огрехами на крупных планах.

И даже после этого я мог просто исчезнуть

В постановочной сцене персонаж наконец шёл по коридору, поворачивался и уходил через арку. А в одной из промежуточных попыток пропадал из кадра целиком. Причина оказалась в bounds — объёме, по которому движок решает, нужно ли рисовать объект. Персонаж перемещался костями и выходил за ожидаемые границы.

Для этой сцены увеличили границы и включили постоянное обновление позы. Это настройка для ролика; переносить её бездумно на толпу игровых персонажей я бы не стал. Самостоятельный NPC с навигацией, коллизией и игровым поведением ещё не подключён. Сейчас есть полноценная сборка и проверенные постановочные движения в Unreal.

Что осталось за кадром ролика

Чтобы не создавать впечатление трёх удачных запросов, собрал основные развилки в одном месте. Это не количество генераций и не список оплаченных запросов — история сохранённых решений.

Этап

Что не устроило

К чему пришли

Первый портрет

Повреждённая щека, проблемная борода

Локальная правка щеки и новая сплошная основа подбородка

Усы и брови

Светлые края, цветовые ореолы, грязные оттенки

Несколько отдельных правок поверхности и цвета

Глаза №12–19

Искусственный взгляд, затем потеря сходства

Откат к №15, более узкая область исправления

Перенос лица в Unreal

Круги, швы, непрозрачный лоскут

Исправление нормалей, имён материалов и устаревшей текстуры

MetaHuman

Подгонка меняла узнаваемое лицо

Сохранение исходной головы, отдельная доводка мимики

Речь

Не хватало полости рта, губы деформировались дважды

Отдельные формы рта и согласованное смешивание

Костюм v03–04

Неудачная застёжка, мусор под обувью

Другой концепт застёжки, очистка альфа-канала

Посадка головы v05–06

Срезанный воротник, шея слишком впереди

Новый концепт с водолазкой и локальная подгонка

Первый риг v07

Сумка следовала за рукой, ботинки гнулись, локоть дёргался

Исправление весов, положения суставов и переноса анимации

Кисти v09–10

Четыре неестественных жеста

Новая анатомическая основа и разделение движений суставов

Рот v11

Исправление открытого рта портило закрытый

Откат неудачной правки; часть косметики отложена

Походка v12

Скачок левой кисти на стыке до 12–13 см

Подготовка всей позы перед первым шагом

Плащ v13

Изнанка выходила наружу

Локальный ремонт подкладки и согласование весов

Разговор и переходы v14–15

Тесты проходили, рука всё равно пересекала плащ

Новые проверки поверхностей, а не только суставов

Сборка v16–17

Потерянные детали шеи и отверстия в воротнике

Контроль состава экспорта, ремонт геометрии и связей компонентов

Сцены в коридоре

Исчезновение при движении, новые пересечения

Настройка границ для съёмки и проверка каждой новой связки

Последний монтаж

Речь почти не читалась в кадре

Более выраженные речевые формы, короткие переходы и крупные планы

У текущей полной модели около 8 млн треугольников, из них примерно 4,3 млн — волосы. Это тяжёлый исходник для доводки и съёмки. Оптимизация впереди: её хочу делать отдельной версией и сравнивать лицо, волосы и движения крупно, чтобы вместе с полигонами снова не потерять себя.

Нейросеть дала первую голову за четыре с половиной минуты. Дальше большую часть времени занимало выяснение, почему очередное исправление не работает или ломает соседнее место. При этом генерацию далеко не всегда приходилось повторять: старые версии, отдельные детали, одинаковые ракурсы и короткие проверки позволяли чинить конкретную проблему.

Пока мой цифровой двойник умеет больше показывать характер, чем помогать игроку. Но теперь можно хотя бы посмотреть, как он говорит, а не поверить отчёту, что у него есть мимика. В галерее оставил ранние головы, неудачные переделки и текущий ролик: когда дойду до оптимизации, будет с чем сравнивать.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.