Создание плавных переходов в анимации при помощи нейросетей: принципы работы Learned Motion Matching

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

Motion Matching — это простой, но эффективный способ анимирования персонажей, который позволяет сделать реалистичные переходы между движениями персонажей. Но этот подход лучше всего работает, когда есть большое количество mocap-данных. Для хранения всей этой информации нужно много дополнительной памяти. Метод Learned Motion Matching решает эту проблему — в нём применяется машинное обучение, что позволяет значительно снизить требования к памяти.

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

Ранее мы опубликовали основные выводы по оригинальному тексту. А в этом материале более подробно расскажем о принципах работы технологии Learned Motion Matching.

Как работает обычный Motion Matching

Данные, которые используются в Motion Matching — это длинные неструктурированные анимации из mocap-датасета.

Обычная анимация из такого датасета

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

Новый путь

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

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

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

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

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

Это выглядит примерно так. Цветной массив данных — это вектор функций

Вектор функций — компактное численное представление того, насколько каждый кадр способен выполнять поставленную задачу. Разработчики собирают показатели каждого кадра в единый датасет и объединяют полученные векторы в большую матрицу (Matching Features Database).

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

Визуализация процесса поиска лучшего фрагмента

Чтобы сгладить переходы между разными фрагментами анимации, разработчики используют обычные методы: crossfade blend или инерциализацию.

Результат с инерциализацией
Финальный результат с включённой инверсной кинематикой

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

Проблема масштабируемости

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

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

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

Цель разработчиков заключалась в том, чтобы сохранить все преимущества технологии Motion Matching, но при этом сделать так, чтобы новая система не требовала хранить так много данных.

Как работает Learned Motion Matching

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

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

Диаграмма, иллюстрирующая эту логику
Диаграмма, иллюстрирующая эту логику

Чтобы упростить эту систему, можно вместо Animation Dataset повторно использовать Matching Features Database. Для работы системы нужно обучить нейронную сеть Decompressor принимать в качестве входных данных вектор функций из Matching Features Database и выдавать в качестве выходных данных соответствующую позу.

Логика для каждого кадра
Логика для каждого кадра
Сравнение старой системы (серый персонаж) и новой системы (красный персонаж). На скелете слева совмещаются движения обеих систем

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

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

Так как в системе больше не нужно хранить датасет анимаций, использование памяти значительно снизилось. Но проблема масштабируемости полностью не исчезла — оставшиеся базы данных растут пропорционально размеру исходного датасета. Чтобы решить эту проблему, нужно сперва объединить Matching Feature Database и Extra Features Database в Combined Features Database. Тогда комбинированный вектор функций будет содержать данные из обеих баз данных.

Создание плавных переходов в анимации при помощи нейросетей: принципы работы Learned Motion Matching

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

Создание плавных переходов в анимации при помощи нейросетей: принципы работы Learned Motion Matching

Теперь не нужно использовать Combined Features Database каждый кадр. Но есть ещё две операции, которые зависят от неё: поиск самих фрагментов анимации и последующий поиск функций. Для этого нужно использовать ещё одну нейросеть — Projector, которая должна предсказывать комбинированные функции прямо из запроса. Теперь можно избавиться от всех баз данных.

Создание плавных переходов в анимации при помощи нейросетей: принципы работы Learned Motion Matching
Итоговая схема со всеми нейросетями
Итоговая схема со всеми нейросетями

Эта система проста, и при этом она показывает почти такие же результаты как обычный Motion Matching.

Пример использования Learned Motion Matching
Сравнение затрат памяти для каждого метода. Learned Motion Matching показывает результаты в десять раз лучше, чем у обычного Motion Matching
Сравнение затрат памяти для каждого метода. Learned Motion Matching показывает результаты в десять раз лучше, чем у обычного Motion Matching

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

Результат с разными стилями и дополнительными суставами
Затраты памяти для системы анимации с большим количеством данных
Затраты памяти для системы анимации с большим количеством данных

Разработчикам удалось снизить затраты памяти с 590 MB до 16,8 MB. При этом специалисты из Ubisoft обнаружили, что результат можно сжать ещё в два раза — до 8,5 MB.

Финальный результат на локации с множеством неровностей
233233
29 комментариев
150 ₽

___

12
Ответить

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

27
Ответить

Комментарий недоступен

61
Ответить

Минутка бесполезной инфы - Хитман так и делает :)

7
Ответить

Комментарий недоступен

2
Ответить

Комментарий недоступен

24
Ответить

Комментарий недоступен

1
Ответить