Легкий ретаргет анимации под любые цели в Blender для инди разработчика.
Как без проблем разобраться в ретаргете и не сломать при этом голову в Blender.
Введение
Добрый день, меня зовут Иван, я 3D-художник и аниматор на проекте инди-игры «Песнь Копья», которую мы с моими коллегами делаем и доводим до ума в раннем доступе уже год. Сегодня я хотел бы осветить такую важную тему, как ретаргет анимаций, как это сделать быстро, просто и бюджетно (то есть своими силами).
Цель статьи
Примером станет персонаж из нашей игры — «Морозко». Он комплексный: снаружи он состоит из заколдованной шубы, которая при каждых ударах по ней или атаках по врагам вытягивает жизненные силы из персонажа, находящегося внутри него — девушки в платке, из-за чего та начинает кричать от холода.
3D модель персонажа в игре
Чтобы сделать эти анимации, я решил пойти путем записи мокапа с его дальнейшей чисткой. Не знаю, насколько это выгодно и полезно, но попробовать захотелось.
Для того чтобы перенести анимацию с одного рига на другой, я немного вожусь с animation constraints (далее — констрейнтами) внутри Blender.
Зачем это нужно знать? Это будет встречаться повсеместно. С этим придется столкнуться хотя бы раз на любом проекте. Я покажу, как это делаю я в Blender, чтобы был понятен общий принцип работы с констрейнтами.
Статья рассчитана на продвинутых юзеров Blender. О том, как я делал свой риг, можно прочесть в прошлой статье.
На эту статью меня вдохновил Royal Skies и его видео о ретаргете и использовании Constraints в Blender. Этот ютубер помог мне во многих аспектах лучше понять инструменты самого Blender в работе с ригами.
Пример ретаргета для сегодняшней статьи
Для примера я буду делать ретаргет анимации мокапа, который я получил через генерацию анимации по видеофутажу.
Перед началом я записал футаж-видео для нашей генерации. Записывал в условиях, непригодных для нормального анализа алгоритма. Футаж должен быть записан на светлом фоне, объект должен быть в темной одежде или костюме. Я же записывал в белой одежде на темном фоне штор. Но ничего, это дает стресс-тест на наши сервисы генерации мокапа.
Я тестировал через 3 сервиса: QuickMagic, Rokoko, Plask.
Хуже всего справился Rokoko. У него сильные расхождения движений с оригинальным футажом. Сам разработчик говорит, что видео обязательно надо записывать наилучшего качества и на светлом фоне.
Plask выдает относительно приличный результат, даже в некотором плане передал выразительность движений, показанных в видео. Только у модели сильные дергания в пространстве относительно ног, я так понимаю, этот недостаток исправляется платной версией.
Лучший результат показал QuickMagic. Даже учитывая, что видео было ускорено, чтобы уложиться в лимиты по загрузке и апроксимацию движений, это все равно лучший результат из трех сервисов. Ноги стоят на месте, тело не выгибается в невозможные для него позы. Вообще видно, что нейросеть пытается выдать хороший результат, и он может сойти за мокап бюджетного уровня.
Будущее уже тут!
Должен сказать, что бесплатных генераций везде дают жменьку. В QuickMagic это 50 секунд видео в месяц, Plask и Rokoko тоже имеют ограничения. Но самое главное — интеллектуальная собственность остается за вами только при платной подписке. Но за 9 долларов (на текущий момент) в месяц QuickMagic может стать спасением по мокапу для маленькой инди-студии.
С обзором сервисов закончили, теперь нам надо эту анимацию перенести на наш ранее созданный риг.
Подготовка проекта
Для начала нам надо настроить исходный риг (далее — Main Rig) и Control Rig.
Сохраняю персонажа со скелетом, мешами в отдельном файле, чтобы не путать одно с другим в будущем. Помещаю его в Collection в Blender с названием, например, «morozko_rig».
Далее создаю другой файл и через File-Link выбираю коллекцию с ранее сохраненным ригом.
После этого кликаю правой кнопкой по нашей коллекции и нажимаю «Make Override — Selected and Content». Теперь можно управлять ригом, объектами, вносить в них часть изменений.
Важно: мы прилинковываем риг прямо из исходного файла, без использования команды Append, что, наоборот, целиком независимо копирует данные, а не ссылается на них. Таким образом, изменения, вносимые в исходный файл, будут применяться для остальных файлов, которые используют эти риги. Такая организация файлов в проекте крайне важна для общего порядка в ассетах. И места на диске сэкономит прилично.
Я так делаю для каждой анимации. Правило: 1 blend файл = 1 анимация.
Затем в этот же файл добавляю Control Rig от нашего Motion Capture и также оба рига помещаем в Collection и именуем ее уникальным именем, например Rig.
Оба рига в сцене, анимация работает.
Настраиваем риги
Последние приготовления перед ретаргетом - желательно выровнять риги относительно друг друга. В режиме редактирования Edit подгоняю кости, или просто меняю scale у объекта.
Так же я включаю у одного скелета отображение Octahedral, а у другого Stick костей, для того чтобы быстро их различать между собой.
Назначаем констрейнты
Далее, выделяю риг откуда берем анимацию - Control Rig, потом выделяю наш основной от персонажа Main Rig.
Затем нажимаю Ctrl+Tab для перехода в режим анимации обоих ригов одновременно.
После этого выделяю кость руки из Control Rig, а потом соответствующую ей кость ik Main Rig (именно в таком порядке!) и нажимаю Ctrl+Shift+C - попадаем в меню быстрого назначения констрейнтов и там назначаем констрейнт Parent.
Теперь руки и ноги должны двигаться, будто они дочерние кости нашего исходного рига!
Замечу, чтобы не возникло проблем, нужно, чтобы все ik-кости Main Rig были дочерние от root вашего основного рига. Иначе возникнет «двойная» зависимость.
Решаем возникшую проблему
Но возникают проблемы. Мне нужно как то заставить кости позвоночника и головы сгибаться.
И если напрямую привязать через констрейнт эту кость это не решит проблемы - только усугубит, потому что появится двойная зависимость у кости - она одновременно дочерняя и от своего скелета и от чужого. И я не могу использовать просто Copy Rotation - оси костей у разных скелетов разные.
Это можно решить несколькими способами.
Один быстрый - использовать Damped Tracks. Кость в таком случае как бы все время "направлена" в сторону другой кости, ее начала, либо конца. Это решение может быть рабочим, но иногда по непредсказуемым причинам может быть и не рабочим. Damped Track не учитывает повороты кости вокруг своей оси. Вероятность словить рандомный выверт кости при сильных сгибах тут тоже присутствует.
Второй способ немного длиннее. Нельзя напрямую поставить констрейнт чтобы тот просто копировал "вращение" и "положение" другой кости, так как оси у костей разных скелетов совершенно разные. Но можно сделать копии нужных костей с основного скелета, убрать у них Relations, а затем уже их через нужные констрейнты соединить между двумя скелетами. Покажу на видео.
Создаю копию рига через Shift+D, называю его адекватно. Выделяю только те кости, которые нужны для копирования вращений спины и шеи с плечами.
Удаляю у нового рига у всех его костей все взаимоотношения с другими костями. Кости теперь зависят только от origin рига.
Теперь все кости нового «переходного» скелета(далее Transfer Rig) присоединяю к костям нашего ретаргет-скелета через Ctrl+Shift+C -> Parent
Потом уже к костям нашего исходного рига присоединяю соответствующие им кости от Transfer Rig. Мне надо копировать повороты, в этом случае подойдет констрейнт Copy Rotation
Все. Теперь все должно работать!
Запекаем анимацию на Main Rig
Для того, чтобы завершить ретаргет, надо запечь всю анимацию для рига Main Rig. Для этого выбираю Ctrl+Tab мой Main Rig, выделяю нужные кости для запекания и через F3 находим Bake Action.
Выбираю следующие настройки, чтобы наша анимация запеклась и нажимаю Bake.
Все, она запеклась, но риг стал дергаться. Это потому что на Main Rig навешана куча констрейнтов и они влияют на итоговый результат. Для того, чтобы этого не происходило, создаю копию нашего Main Rig без Control Rig и назначаю эту запекшуюся анимацию на него.
Либо можно перенести через Append эту анимацию в другой файл, где запустить ее уже на «чистом» риге без всех этих назначенных на него констрейнтов.
Как видим, результат идентичен. Мы перенесли анимацию с одного рига на другой. Анимация конечно страдает клиппингом, но это не страшно. Это решается уже на этапе чистки мокапа.
Чистка ретаргета
В заключение можно немного почистить анимацию. Создаем новый файл, именуем, сохраняем. Так же как раньше я линковал коллекцию с двумя ригами, прилинковываю к файлу коллекцию с Main Rig.
Далее в этот раз уже через Append надо загрузить запечённую ранее анимацию, чтобы можно было ее отредактировать.
Править анимацию с таким большим количеством ключей возможно через режимы наложения слоев в NLA редакторе в Blender. Поэтому придется немного опуститься в NLA треки Blender.
Первый трек отправляем вниз на шкалу, нажав на кнопку рядом с названием трека. Сверху нажимаем на пустой трек и выбираем рядом в меню режим Combine. Теперь любой Action, который будет добавлен как слой сверху будет не перезаписывать анимационные ключи, а комбинировать движения между собой.
Таким образом я выравниваю положение модельки относительно центра, немного гиперболизирую наклоны.
Из этой длинной анимации я взял небольшой кусочек и из него я уже сделаю игровую анимацию айдла персонажа, когда он стоит и ждет действия.
Я аккуратно нахожу ключевые позиции нашего персонажа, ставлю ключи на них, а остальные, ненужные ключи удаляю. Это занимает какое то время.
В итоге прострадав над этим минут 5 получается набор чистых ключевых поз под анимацию.
Финальную чистую анимацию уже можно по всякому улучшать, как анимацию на ключевых позах, что мы делали ранее - добавлять позам выразительности, динамики и так далее.
Также используя в той или иной степени свой готовый результат я сделал все анимации с этим персонажем в игре.
Ответы на вопросы
- Нужно ли делать это каждый раз?
Нет, не нужно, если риг у вас от мокапа типовой. Вы один раз делаете его под экспорт из QuickMagic или Mixamo, и на этом всё, подгружаете анимации и запекаете на свой риг. Если вы знаете, что делаете, то создание такого мокап-рига займет не больше получаса.
Да, конечно, если вы в большой студии и надо сделать 1000 анимаций на персонажах разных пропорций, дело серьезно меняется — но тогда зачем вам читать эту статью? ;)
- Можно ли как то сделать это все автоматизированно?
Конечно, можно написать скрипт, но я не знаю языка для этого. Возможно, есть готовые решения, но цель моей статьи — объяснить сам принцип ретаргетинга. Его можно применять по-разному. Возможно, есть бесплатные готовые инструменты, но на своих радарах я их не обнаружил.
- Стоит ли такой мокап чтобы им заморачиваться?
Всё зависит от проекта. Я думаю, мокап будет скорее полезен, где объем его записи внушителен. Я имею опыт только с инди проектами и думаю, что мокап может быть использован для анимаций фоновых персонажей, там, где нужно их большое количество, но не критична их выразительность, а анимировать по ключам можно уже какие-нибудь основные движения персонажей.
Заключение
В итоге у нас получилось перенести анимацию с одного рига на другой, почистить ее и это не заняло много времени.
Статья вышла объемная, но показать как делать ретаргет кратко подчас почти невозможно, моя цель - чтобы эту статью можно было использовать как инструкцию. Поэтому, если у вас есть дополнения я буду рад их внести.Эта статья про риг посвящена ходу разработки нашего проекта Песнь Копья. Ссылку на проект скромно оставлю здесь
Так же я завел теперь свой тг канал
В планах вернуться к написанию статей полноценно с циклом про анимации в Blender: парные анимации, root motion, разрушение, симуляция ткани, волосы.
Но в следующей статье мне хочется отойти в сторону от только анимаций и окончательно ответить на вопрос какое место сейчас занимают нейросети для 3д художника через эксперимент. Над этим я сейчас активно работаю.
Оставайтесь на связи.
Спасибо что читали!