Сложные анимации в мобильных играх: риггинг в Mаya с применением Mash

Подробный разбор.

Александр Антонов, риггер из студии Social Quantum(«Мегаполис», «Дикий запад: новые земли»), написал для DTF колонку, в которой подробно рассказал о процессе создания анимации для мобильной игры. В тексте разбирается конкретный пример с колоколами, однако методы, которые применяет автор, можно использовать и для решения других задач в Maya.

Сложные анимации в мобильных играх: риггинг в Mаya с применением Mash

Вступление

Всем привет, меня зовут Антонов Александр, и я — риггер в Social Quantum, мы создаём игры для мобильных девайсов и те, что сейчас у нас в разработке: сложные, с нарративом, графикой и анимацией высокого качества. В одном из проектов (кейс из него мы разберем далее) мы хотим добиться уровня анимационного сериала, а может даже полного метра на мобильной платформе.

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

Я расскажу о подходе, который помог мне разработать элемент для сцены появления «магического» портала, который сопровождается анимацией из нескольких групп колоколов. Каждый колокол при движении должен обладать своей скоростью и двигаться независимо, по своей траектории.

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

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

Создание условного элемента и его обвязка

Создаю примитив, который будет условным колоколом Create > Polygon Primitives > Cone, для наглядности можно удалить полигон в основании и переименовать Bell_geo. Для управления геометрией колокола создаю кость Skeleton > Create Joints и меняю имя на Bell_jnt, расположу кость в верхней части конуса.

Добавляю контрол, на который можно ставить ключи для анимации колокола Create > NURBS Primitives > Circle, и добавляю его в группу (можно воспользоваться комбинацией CTRL + g на клавиатуре), контрол будет называться Bell_ctrl, а группу назову Bell_ctrl_offset. Группу Bell_ctrl_offset выравниваю относительно кости. Кость Bell_jnt положу в Bell_ctrl, а геометрию Bell_geo переношу в Bell_jnt. Должна получиться такая иерархия, в которой все элементы лежат по цепочке в одной группе, а контрол Bell_ctrl имеет нулевые координаты вращения и трансформации.

Риггинг кривой, которая задаёт направление

Нужна кривая, вдоль которой будет задаваться траектория движения колокола. Выбираю инструмент Create > Curve Tools > CV Curve Tool и, кликая левой клавишей мыши с привязкой к сетке (зажав клавишу x), во фронтальном виде создаю вертикальную прямую из пяти точек. Меняю имя в Path_crv.

Сделаю так, чтобы можно было редактировать форму кривой. Дублирую три раза группу Bell_ctrl_offset со всей иерархией и удаляю геометрию Bell_geo. Переименовываю все названия Bell в Path_A (будет первой группой с контролом кривой), Path_B (группа со вторым контролом) и Path_C (группа с 3-м контролом). Для замены имени можно использовать инструмент Modify > Search and Replace Names.

Затем группы располагаю в начале, середине и конце кривой Path_crv. Можно на всякий случай проверить, чтобы контролы Path_A_ctrl, Path_B_ctrl и Path_C_ctrl имели нулевые координаты на перемещении и вращении. Выбираю кости Path_A_jnt, Path_B_jnt и Path_C_jnt и кривую Path_crv и прискиниваю Skin > Bind Skin. Теперь контролами Path_A, Path_B и Path_C можно задавать форму кривой.

Сложные анимации в мобильных играх: риггинг в Mаya с применением Mash

Далее создаю локатор Create > Locator, называю его Path_loc. Выбираю Path_crv и локатор Path_loc с помощью инструмента Constraint > Motion Paths > Attach to Motion Path прикрепляю локатор к кривой. Теперь, если подвигать ползунок по таймлайну, локатор будет двигаться вдоль кривой.

Если открыть Attribute Editor с выбранным Path_loc, то на вкладке motionPath1 можно найти атрибут U Value, который отвечает за позиционирование локатора относительно кривой, тут можно скорректировать анимацию перемещения локатора (0 это начало кривой, а 1 — конец, в ригах я такие штуки обычно подключаю к контролу/слайдеру, чтобы не искать в сцене). Также атрибут World Up Type меняю на Object Rotation Up и World Up Vector меняю на 1, 0, 0, чтобы исключить случайные вращения.

Сложные анимации в мобильных играх: риггинг в Mаya с применением Mash

Наступило время MASH

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

Чтобы модуль работал, Windows > Settings/Preferences > Plug-in Manager в списке Mash отмечаю Loaded и Auto load. Mash работает только с геометрией, поэтому создаю ещё один конус Create > Polygon Primitives > Cone и переименовываю Bell_Mash_geo (группу с ригом Bell_ctrl_offset можно скрыть, чтобы не мешал). Перехожу в режим редактирования вершин и все вершины перемещаю вниз, чтобы конец конуса был в центре координатной сетки.

Выбираю Bell_Mash_geo применяю инструмент Create MASH Network. В Outliner появится нода с названием Mash1, а на экране появится несколько копий конуса, расположенных в линию. Выбираю в Outliner ноду Mash и в Attribute Editor перехожу на вкладку MASH1_Distribute.

Устанавливаю Numbers of Points в одну копию, так как у нас один колокол. Атрибут Distribution Type меняю на Initial State, и в поле Initial Transforms из Outliner, зажав среднюю кнопку мыши, переношу Path_loc. Теперь локатор задает позицию для элемента Mash. Чтобы симпатичнее выглядело, можно Bell_Mash_geo повернуть по оси z на -90°.

Можно приступить к созданию узлов модуля Mash. Для создания и редактирования узлов, есть специальный редактор MASH editor, вызывается MASH > MASH editor. Если нажать на красную кнопку с плюсом в этом редакторе, то появится список узлов, которые можно применять, список достаточно длинный.

Можно поэкспериментировать, комбинируя разные узлы и их настройки. Если что-то пойдёт не так, узел можно удалить из списка, кликнув по нему правой кнопкой мыши, и выбрать Delete. Также у каждого узла есть выключатель. Порядок узлов можно менять, для этого нужно захватить нужный узел левой клавишей мыши и перенести на другое место.

Для создания анимации качания колокола я использую узел Signal из этого списка. В Attribute Editor задаю параметры для узла: Signal Type меняю на Trigonometry. Все атрибуты Position устанавливаю в 0, Rotation по оси Y и Z устанавливаю в 25 и Timescale на 5. Вообще, редактирование атрибутов элементов Mash, достаточно интуитивное, поэтому можно поэкспериментировать. Также есть атрибут Strength, который устанавливает силу эффекта, и если поставить на него ключи, можно задавать постепенное затухание качаний колокола.

Также можно применить узел Spring, чтобы добавить небольшой эффект «пружинности». Damping установлю в 0,1, а Stiffness в 0,05.

Важный узел Breakout

Теперь деформации из Mash нужно передать на риг колокола, который имеет нормальные кости и геометрию.

Для этого нужен еще один локатор, назову его Bell_Breakout_loc.

Среди списка доступных узлов MASH, есть Breakout, который передает трансформации с элементов Mash на другие объекты сцены. После того как подключается узел Breakout, в Attribute Editor во вкладке MASH1_Breakout1 есть поле Connected Nodes, в которое переносим средней кнопкой мыши Bell_Breakout_loc. После чего появится окно Breakout Connection Manager, где устанавливаем связи, которые нужно передать на локатор.

В поле From Breakout выбираю Rotate и в поле To Selection Rotate, таким образом устанавливается связь на передачу вращения. В поле From Breakout выбираю Transform, и в поле To Selection пункт Transform, чтобы передать перемещение.

Важно! В поле Connected Nodes можно затащить несколько объектов, в том случае, если массив Mash состоит из нескольких элементов. При установке связи можно выбрать Id элемента MASH, с которого будет устанавливаться связь. Для этого нужно в окне Breakout Connection Manager, в поле слева, щелкнуть правой клавишей мыши по имени элемента, на который передаем связь, и выбрать пункт Change Connection Id.

Осталось подключить Bell_Breakout_loc к Bell_ctrl_offset с помощью Constrain > Point (с выключённым Maintain offset, чтобы позиционировать риг относительно локатора) и Constrain > Orient (с включенным Maintain offset, чтобы сохранить текущее вращение). Теперь можно попробовать накликать тестовую анимацию изменить кривую. Условный колокол движется вдоль кривой и на нем отрабатывают эффекты с ноды Mash.

Вернемся к сцене с колоколами

Вот так выглядит сцена с колоколами со всеми элементами и кривыми. Теперь риг кажется не таким странным и запутанным. Риг разделён на четыре модуля, которые работают независимо и редактируются отдельно. Для сцены с колоколами я использовал несколько систем Mash.

Видимость кривых, по которым движутся объекты, можно отключать, чтобы не путаться. Параметр U Value, который отвечает за перемещение колокола вдоль кривой, вынесен на отдельный контрол/слайдер. Каждый колокол можно анимировать отдельно.

Все эти модули с колоколами имеют свои общие настройки Mash, что позволяет задать независимое поведение эффектами. Управление Mash вынесено на отдельные каналы и добавлены в контролы, которые отвечают за редактирование поведения модулей.

Сложные анимации в мобильных играх: риггинг в Mаya с применением Mash

Вот так подключены связи в Node Editor с контрола, который задает поведение группой.

Сложные анимации в мобильных играх: риггинг в Mаya с применением Mash

Вот так выглядит связка узлов Mash с одним из контролов.

Сложные анимации в мобильных играх: риггинг в Mаya с применением Mash

Это лишь один пример применения Mash, его можно использовать и для решения кардинально других задач в ригах. На данный момент инструмент уже стабильный, узлы работают быстро, ведет себя хорошо и можно смело его заносить в инструментарий риггера. Если я что-то описал недостаточно понятно или упустил какие-то детали — пишите в комментариях, разберёмся.

6464
17 комментариев

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

1
Ответить

Риггер отвечает за риг (кости, контроллеры, хелперы, IK и т.д.). Аниматор отвечает за анимации. Иногда это один и тот же человек, иногда нет. И это мы еще молчим про того, кто занимается скиннингом, в промежутке между риггингом и анимацией. 

17
Ответить

Аниматор делает анимации, а риггер делает систему управления, с помощью которой аниматор делает анимации. Водитель автомобиля и сборщик автомобиля - разные профессии. Моделлер в этом контексте тот, кто делает запчасти для автомобиля. 

1
Ответить

А конструктор гоночного болида - это гонщик.

1
Ответить

Аниматор, моделлер и риггер — это 3 разные специализации)

Ответить

Я или что-то упустил, или в статье вы не сказали как вы переносите это в игровой движок?
Так вообще прикольный сетап и вы молодец. В Cinema4d давно существуют xpresso и там такую штуку сделать правда мне кажется намного проще. Я уже не говорю, что процедурные такие штуки прикольно очень в гудини делать. 

Ответить