Разработка игры · анимация персонажей

Как сотрудники пивоварни
учились ходить

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

30 октября 2026 · Лаборатория Антона Коннова

Внешность и движение

Один цикл — четыре персонажа

Здесь можно рассмотреть кадры ходьбы Игоря, Марты, Петра и Ольги. Это просмотрщик атласов из игры: он показывает походку на месте, а не работу маршрутов в цехе.

Загрузка кадров…

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

01 · Задача

Не просто перемещать картинку

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

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

02 · Источник движения

Скелет задаёт походку, рисунок — внешность

Для общего нейтрального шага используется Walk_Loop из Quaternius Universal Animation Library, с лицензией CC0. Исходный цикл длится примерно 1,333 секунды. В нём согласованы ноги, таз, корпус и руки — это одно движение, а не набор независимо придуманных положений конечностей.

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

Манекен не стал игровым сотрудником. Его задача — дать видео движения и геометрию опоры. Внешность берётся из исходного рисунка каждого персонажа: пивовара в фартуке, оператора, Марты и технолога в халате.

03 · Перенос

Wan Animate 2 соединяет два источника

На вход нейросети подаются изображение персонажа и видео-образец походки. В проекте использован Wan Animate 2: пакет Comfy-Org/Wan-Animate-2 на основе Wan2.2-Animate-2-14B, веса int8 convrot, с LightX2V LoRA. Граф работает в ComfyUI 0.41.3 на AIserver с RTX PRO 6000.

Для итогового нейтрального цикла подготовлено по одному управляющему видео на каждый ракурс: 97 кадров, 480 × 832 пикселя, 24 кадра в секунду. Этот же набор движений используется для четырёх сотрудников, но исходное изображение у каждого своё. Модель генерирует внешний вид человека в движении; она не выбирает, куда ему идти или чем заниматься.

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

04 · Подготовка графики

Из видео — в атлас кадров

Результат генерации ещё не готов для игры: у него есть фон, начало ролика отличается от устойчивой ходьбы, а кадры надо разместить относительно пола. Поэтому из середины записи берётся один цикл: кадры 32, 34, …, 62. Получаются 16 фаз шага на направление.

Серый фон удаляется по цветовому отличию; для фоновой области учитывается её связь с краем изображения, а граница фигуры получает мягкую прозрачность. Все кадры переводятся в ячейки 192 × 256 пикселей одной фиксированной аффинной привязкой. Нельзя каждый раз прижимать нижний непрозрачный пиксель к полу: поднятая нога тогда стала бы менять положение всего тела.

Итоговый PNG-атлас — 3072 × 2048 пикселей: восемь строк направлений и 16 столбцов фаз. В игре PixiJS выбирает нужную область текстуры. Нейросеть при этом уже не работает: все кадры подготовлены заранее.

05 · Движение в игре

Кадр зависит от пройденного пути

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

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

Темп и перемещение изменяются вместе. В текущем коде общий коэффициент воспроизведения — 1,794 относительно исходного цикла. Это настройка визуальной ходьбы, а не ускорение варки, фасовки или игрового времени.

Опорная точка фигуры постоянна. Контактные тени рассчитываются по данным костей стоп и носков управляющего скелета. Это геометрическая опора для изображения, а не физический расчёт контакта каждой сгенерированной подошвы с полом.

06 · Маршрут и работа

Обход оборудования без тяжёлой навигации

Планировщик знает прямоугольные площади, занятые оборудованием и объектами цеха. Сначала он проверяет прямой путь. Если тот пересекает препятствие, рассматривает Г-образные варианты и обходы через одну или две угловые точки с отступом от оборудования. Сначала выбирается путь с меньшим пересечением препятствий, затем — более короткий и простой.

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

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

07 · Результат и границы

Что получилось — и чего метод не делает

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

Но восемь ракурсов — не непрерывный трёхмерный поворот. При смене направления выбирается другая строка атласа; плавного 3D-разворота между ними нет. На границах фигуры возможны следы выделения фона, а нейросетевые кадры не дают математически точной опоры стоп. Переход к исходным рабочим позам тоже остаётся отдельным визуальным ограничением.

Такой подход оказался способом связать существующий рисованный стиль с подготовленным движением без создания индивидуального 3D-рига для каждого сотрудника. Скелет задаёт структуру шага, нейросеть создаёт кадры, игровой код управляет маршрутом и показом. Ни один из этих этапов не заменяет остальные.