Создание плавных переходов в анимации при помощи нейросетей: принципы работы 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. Тогда комбинированный вектор функций будет содержать данные из обеих баз данных.
Следующий шаг — сделать так, чтобы вектор комбинированных функций высчитывался не каждый кадр, а каждые несколько кадров. Для этого нужна ещё одна нейронная сеть, которая называется Stepper — она прогнозирует вектор комбинированных функций для следующего кадра из текущего кадра.
Теперь не нужно использовать Combined Features Database каждый кадр. Но есть ещё две операции, которые зависят от неё: поиск самих фрагментов анимации и последующий поиск функций. Для этого нужно использовать ещё одну нейросеть — Projector, которая должна предсказывать комбинированные функции прямо из запроса. Теперь можно избавиться от всех баз данных.
Эта система проста, и при этом она показывает почти такие же результаты как обычный Motion Matching.
Но в играх используется намного больше анимаций, чем в этом примере. Поэтому разработчики добавили к изначальному персонажу новых 47 суставов и 30 стилей передвижения.
Разработчикам удалось снизить затраты памяти с 590 MB до 16,8 MB. При этом специалисты из Ubisoft обнаружили, что результат можно сжать ещё в два раза — до 8,5 MB.