Создание рига для робота в Maya

Всем привет меня зовут Давид я занимаюсь созданием анимации и ригов в основном для персонажки. Мой artstation. Недавно я закончил создание рига для своего портфолио и решил поделится несколькими прикольными вещами.

Note: Я не часто пишу поэтому походу будет путаница с формулировками.

Вступление.

В интернете я нашел не так много доступных ригов мехов. Данная модель уже имела риг от крутого художника из близард Tre Vital. Линк на его риг. Но он был основан на констрейнах геометрии что довольно проблематично если ты захочешь использовать её в другой среде или движке.


ориг риг:

chrome_35TDsUjX3t.gif

Основные этапы:

Свой риг я создавал полностью основываясь на костях с expression и driven key без деформеров или блендшейпов.

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

1.gif

Начал я с продумывания переключения между FK/IK. Так как ноги робота были по дефолту в IK я подумал смысл ему FK добавлять если руки тоже вполне себя чувствуют. В крайнем случае можно гибрид сделать. Но потом отошел от этой затеи так как в процессе трансформации будет удобно когда ты можешь свободно двигать детали корпуса. Конечно возник казус) с тем что находясь в ik художник двигая атрибут трансформации не поймёт ("почему я еще не начал а уже сломалось..!!")

Для решения этой проблемы я не придумал ничего лучше как подключить к уже готовому атрибуту "FK/IK" дополнительный.

И прописать в expression основного обычные условия типо:maya_MnwjChtVz7.png

Хотя это можно было бы решить с помощью ноды "condition" но для этого нужно было подумать( это мы не делаем ).

Не отходя от кассы. В ik ноги вы можете увидеть дополнительные контроль сгиба верхней и нижней части. В оригинале такой схемы не было но я подумал почему бы нет.

maya_UJCb4ow8VP.gif

Суть довольно проста. Создаём копию скелета ноги которая будет отвечать за общий контроль. На копию применяем "spring IK solver" . Note: По дефолту в майке она вызывается через MEL команду " ikSpringSolver; ". На оригинал ноги применяем стандартный " rotate solver ". Получившееся ik handle парентим к уже готовой копи чётко в соответствии с иерархией. После создаём на всё те же ik handle оффсет группы которые и будут отвечать за контроль сгиба. Более подробно это объесняется в данном гайде .

Следующая деталь которую я хотел воплотить это что бы всё по ходу движения крутилось.

maya_sxH6ye9Oq9.gif

Для этого я добавил в иерархию дополнительные кости которые впоследствии прискинил диски. Ну и собственно берём нашу кость ноги и подключаем к кости/контролу отвечающему за вращение диска через input1 в ноде multDoubleLinear . Тут в принципе ничего и не надо. Кроме как рассчитать длину окружности деленную на оборот круга(360). Полученное число вводим в input2. Выглядит это так:

maya_RD0AHf9EZ5.png


Хотя мне кажется можно и еще проще. Просто в атрибут контрола отвечающего за диск прописать Disc_l_twist.rotateZ = (leg_jnt_l.rotateZ/(3.14))*360;

Где что я думаю и так ясно по названиям.


Следующая вещь связана с турбинами(в оригинале это просто две штуки торчащие из ноги)

Я очень хотел что бы это выглядело как в стимпанке. Когда в движение всё внешне начинает походить на работу двигателя.

maya_fEI29bJwsK.gif

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

На реддите мне подсказали афигенное решение. Скидываю сам тред. Собственно сама суть в том что мы берём положение нашего контрола отвечающего за движение ноги в текущем и предыдущем кадре. Вычитаем эти значения у каждой из осей. Полученный результат возводим квадратный корень с помощью команды mag . Мы получили пройденное расстояние в единицах. И собственно заместо нашей ноги как мы хотели вначале мы вводим этот результат. А точнее умножаем на него. У меня получилось так:

maya_OHJg8gO56V.png

Господа заметьте там есть *foot_r_ik_ctrl.turbinesspeed. Значения данного атрибута умножаются на тек.фрейм и отвечает за скорость самих турбин.

Это насамом деле очень крутая штука в том плане что вы можете использовать её в различных целях и на различных сетапах.


ФиналОчка:

Как вы видите в риге имеются три атрибута трансформации. Данной фичи нет в оригинале это лично моё желание. Реализована она с помощью обыкновенных driven key.

vlc_gmAo7S29jH.gif

Тут получается казус, так как в самом начале я говорил что мы будет двигаться по нарастающей. Так в чём же сложность? А не вчём. Проблема в геморройности принципа создания driven key. Он не удобный. Ну или я тупенький. Для создания ключей необходимо выделение необходимых атрибутов как у driver так и у driven после надо это всё тыкать а если ты захочешь изменить значения в какой то момент?... Опять ручками...? это невкусно и точка!

Возможно знающие люди это делают правильно. Я же просто создал ключи у контролов(с нужной мне анимацией) после перенёс их на оффсеты. Сами эти ключи находятся в ноде "animCurve". После просто подключите уже созданный вами атрибут трансформации в input ноде "animCurve". В моём случае за трансформацию отвечал контрол в TranslateX с ограничением от 0-35. Вы же можете создать любой кастомный и назвать его "автоботы_наступаем". Выглядит это так:

maya_h0IiLTI7ii.png

После вы можете подёргать за атрибут и убедится что у вас ничего работать не будет

А ты как хотел всё по чесноку!

На самом деле конфуз в том что ваш кастомный атрибут будет иметь диапазон чисел который вы указываете при его создании в поле min/max. Обычно это от нуля до единицы в моём случае это от 0-35. Так вот проблема в том что мы то анимировали в большем отрезке чем 1 или 10 кадров. В моём случае Time Slider был в отрезке от 1 -100 фреймов. Для того что бы решить вопрос. Надо дать понять "animCurve" где должен находится данный ключ в определённом отрезке(0-35). Или заранее указывать правильный диапазон.

maya_HRGUM9itfu.png

Для решения этого я написал скрипт. Он довольно кастрированный и неудобный. Так как для его выполнения необходимо вручную выбирать анимируемый объект и необходимый ключ. После он как бы перемещает данный ключ в значение которое сей час имеет наш кастомный атрибут.

import maya.cmds as cmds
import maya.mel
i = cmds.ls(sl=True)
aPlayBackSliderPython = maya.mel.eval('$tmpVar=$gPlayBackSlider')
tt = cmds.timeControl( aPlayBackSliderPython, rng=True, q=True )
f = eval(tt)
start,end = [int(n) for n in f.split(":")]
#get the integer values of the current frame and the next frame
a = cmds.getAttr( 'T_Control.translateX')
#get the current value from the attribute
v = round(a)
#rounds up the number
for nod in i:
cmds.keyframe( '{}'.format(nod), time=(start,end), timeChange=(v) )

#Substitute them for the current

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

Итог:

Спасибо всем кто смог дочитать до конца. Я решил не углубляется во все аспекты дабы не расписывать на 4 тома. Главное показать принцип.

Сам риг в свободном доступе. Ссылка на gumroad в описании на странице. Там же вы можете более детально рассмотреть все возможности данного рига.

659 0 850 4
2
2022-07-10
Андрей КривуляПрикольно! Мне нра =)

хех)
2022-07-20
Спасибо! Было интересно поглядеть
RENDER.RU