Делаю игру с ИИ: от спрайтов к 3D

Третья часть про HellTrip: три попытки оживить героя, выбор Meshy и первый бег в Mixamo. Как работа над одной анимацией привела к решению перевести игру в 3D.

Содержание
  1. Сначала образы, потом игровые ассеты
  2. Первая попытка: сгенерировать кадры бега
  3. Вторая попытка: собрать персонажа из частей
  4. Третья попытка: видео вместо спрайтов
  5. Поиск сервиса и подписка на Meshy
  6. Герой наконец побежал
  7. Что дальше

В прошлой части я собрал прототип HellTrip с боем, комнатами и прокачкой. Проверять механику на кубах удобно, но уже очень хочется увидеть ту игру, которая у меня в голове. Поэтому следующим этапом я занялся артом.

Начать решил с главного героя: взять готовый концепт, добавить персонажа в игру и сделать ему бег. После нескольких подходов к анимации я оказался в Meshy и Mixamo, а HellTrip решил переводить в полноценное 3D.

Сначала образы, потом игровые ассеты

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

С первым этапом удалось продвинуться далеко. Я нагенерировал много изображений и собрал каталог персонажей и объектов окружения. Позже он стал набором исходников для генерации моделей: можно выбрать конкретную картинку и попробовать получить по ней 3D.

Фрагмент каталога HellTrip — раздел деревни. Здесь собраны изображения, промпты и варианты моделей; наличие концепта ещё не означает, что объект готов для игры
Фрагмент каталога HellTrip — раздел деревни. Здесь собраны изображения, промпты и варианты моделей; наличие концепта ещё не означает, что объект готов для игры

Но начал я с персонажа-программиста. Его образ уже был готов: тёмная куртка, рюкзак и клавиатура за спиной. Оставалось заставить его двигаться.

Концепт программиста с телефоном. Этот образ я использовал в первых попытках анимации
Концепт программиста с телефоном. Этот образ я использовал в первых попытках анимации

Первая попытка: сгенерировать кадры бега

Самым простым решением казалось попросить ChatGPT нарисовать спрайты. Для каждого кадра анимации — отдельная картинка, на которой персонаж немного меняет положение. Последовательно показываем изображения и получаем бег.

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

Одна из попыток спрайтовой анимации. Слева исходный концепт, справа — бег, собранный из сгенерированных кадров
Одна из попыток спрайтовой анимации. Слева исходный концепт, справа — бег, собранный из сгенерированных кадров

Для отдельной картинки ещё можно выбирать удачный вариант. Здесь же нужна целая последовательность, в которой всё согласовано.

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

Вторая попытка: собрать персонажа из частей

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

Так во всех кадрах оставался бы один и тот же герой. Не нужно было бы заново генерировать его целиком для каждой позы.

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

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

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

Поэтому продолжил искать другой способ.

Третья попытка: видео вместо спрайтов

Следующая идея — сгенерировать видео, на котором персонаж бежит, а затем нарезать его на кадры.

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

В этом примере персонаж бежит, но вместе с ним я получил целое подземелье и движение камеры. Сам по себе ролик выглядит неплохо, однако для игровых кадров фон и ракурс опять не подошли.

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

До нарезки я в итоге даже не добрался: подходящего исходного видео так и не получил.

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

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

Есть и другой способ: записать на видео собственные движения, а затем перенести их на персонажа. Но тогда каждое нужное движение мне пришлось бы исполнять и записывать самому. Для моего эксперимента это не подходит: HellTrip я делаю в режиме «только ИИ».

К этому моменту я уже основательно разочаровался. Задача «добавить своего героя и сделать ему бег» оказалась гораздо сложнее, чем выглядела вначале.

Поиск сервиса и подписка на Meshy

Тогда я подумал: можно попробовать получить 3D-модель персонажа, а анимацию взять, например, в Mixamo. Так можно было бы один раз получить модель героя и применять к ней разные движения, сохраняя его внешность.

Начал искать сервисы генерации 3D и нашёл Top 3D AI — сайт с рейтингом и сравнением разных решений. Попробовал бесплатные варианты, но качество полученных моделей меня не устроило. Стал выбирать платный сервис.

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

Сюда и пригодился каталог. Я стал загружать свои концепты и смотреть, какие модели сервис по ним построит. Для героя использовал в том числе изображение в А-позе — с немного отведёнными от тела руками.

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

Исходный концепт
Исходный концепт
Модель из Meshy
Модель из Meshy

На скриншоте заодно видно, насколько плотной получилась сетка: у одного героя 1 116 294 треугольника. Что с этим делать и как я пробовал уменьшать их количество, расскажу в следующей статье.

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

Герой наконец побежал

Изначально модели были способом решить задачу с персонажем. Но после первых результатов возникла следующая мысль: если я уже могу получать объёмных героев и окружение по своим концептам, почему бы не сделать всю игру в 3D?

В прошлой части я только пришёл к 2.5D. Теперь решил двигаться дальше.

Взял модель главного героя и загрузил её в Mixamo. После разметки суставов сервис построил скелет, и получилось применить анимацию.

Разметка суставов и проверка полученного рига в Mixamo. Ожидание обработки вырезано, запись без звука

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

Бег героя после подготовки в Mixamo. Это запись из сервиса, не из Godot. Видео без звука

Наконец я увидел своего персонажа в движении. А с учётом библиотеки бесплатных анимаций Mixamo этот путь выглядел достаточно перспективным, чтобы на нём остановиться.

Так попытка сделать одну анимацию бега привела к решению перевести всю игру в 3D.

Что дальше

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

В следующей части покажу результаты генерации людей и монстров, расскажу про анимацию через Meshy и Mixamo и разберу подготовку персонажей. Там же расскажу, что позже изменил во внешности героя и зачем.

Короткие демонстрации публикую в Telegram. Описание проекта есть на странице Godot × ИИ.