Создание плавных переходов в анимации при помощи нейросетей: принципы работы 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.

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

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

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

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

Финальный результат на локации с множеством неровностей
Обозреватель подсайта Gamedev.
{ "author_name": "Владимир Семыкин", "author_type": "editor", "tags": ["\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438","\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f","ubisoft"], "comments": 29, "likes": 227, "favorites": 343, "is_advertisement": false, "subsite_label": "gamedev", "id": 183464, "is_wide": true, "is_ugc": false, "date": "Tue, 04 Aug 2020 18:16:50 +0300", "is_special": false }
0
29 комментариев
Популярные
По порядку
Написать комментарий...
12

___

Ответить

Мертвый якорь

27

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

Ответить

Уверенный Петя

Мертвый
62

это болезнь ассассинов

Ответить
6

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

Ответить

Ленинский коктейль

2

Было же?

Ответить

Парадный спрей

Ленинский
24

Там только новость о патенте была, а тут подробно

Ответить

Ленинский коктейль

Парадный
1

Вопрос снят.

Ответить

Цветной браслет

Ленинский
1

Была просто новость что такая фигня есть

Ответить
5

Теперь ты точно знаем, что такая фигня реально есть.

Ответить
5

на 46 секунде желтый мужик полапал задницу синего без всякой причины

Ответить

Задний огонь

SypSvary
13

"Без причины", хе-хе...

Ответить
2

Рокстаровское двигло напоминает

Ответить
1

При столкновениях с другими объектами видно как они скользят. Подобное сильно бросается в глаза. 

Ответить
1

О каких «затрат памяти» идет речь?

Ответить
0

Загадка века.

Ответить
1

Я, чёт, до сих пор не понимаю, чем эта технология лучше нормальной локомоушен-системы с блендом анимаций и поз между собой?
Вот, как тут:
https://youtu.be/ru1--3wP-F8

Ответить
0

Тем что обычными блендами не так просто сделать крутые анимации и анимации в контексте. Чтобы сделать без моушн матчинга такое https://www.youtube.com/watch?v=1rINbQMGJw0 тебе придется сильно постараться. Смысл же штуки описаной в статье - сделать тоже что и в моушн матчинг, только дешевле для вычислений.

Ответить
0

количеством требуемой памяти и ресурсов компьютера.

Ответить
0

На самом деле, это максимально очевидное и простое решение.

Ответить
1

Просто пиздец как, захуярили на колленке 4 нейросети в для отрисовки анимаций, каждый раз так делаю.

Ответить
0

Переход от поиска по датасету к нейросети — очевиднейшее решение. А остальные просто потребовались для доведения идеи до ума.

Ответить
0

Очень круто все выглядит. Анимации просто пушка

Ответить
0

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

Ответить
0

на одном стуле патчи точеные, на другом длц дроченые

Ответить
0

я так понял что они научили 30 стилям, а главное научить игроку держать автомат или пистолет и при этом поворачивать корпус и руки в нужное направление по трем осям нет, ведь это действительно практическая задача.

Ответить
0

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

Ответить
0

А аниматоры, и другие люди что в этом секторе работают(ли)как это ударит по ним?

Ответить
0

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

Ответить
0

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

Ответить

Комментарии

{ "jsPath": "/static/build/dtf.ru/specials/DeliveryCheats/js/all.min.js?v=05.02.2020", "cssPath": "/static/build/dtf.ru/specials/DeliveryCheats/styles/all.min.css?v=05.02.2020", "fontsPath": "https://fonts.googleapis.com/css?family=Roboto+Mono:400,700,700i&subset=cyrillic" }
null