Designer.kz: О базе рига в Maya - Designer.kz

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

О базе рига в Maya Оценка: ****- 1 Голосов

#1 Пользователь офлайн   Е. Мерзляков 

  • ветеран
  • PipPipPipPip
  • Перейти к блогу
  • Перейти к галерее
  • Вставить ник в быстрый ответ
  • Раскрыть информацию

Отправлено 12 Июнь 2009 - 19:32

Текст: Эйнар Габбасов (Artist)

О базе рига в Maya.

В этом уроке я хотел бы рассказать о базе рига в Maya на простом, но фундаментальном примере рига* широко известного bouncing ball.

Риг (англ. rig — оснастка, приспособление, упряжка) — термин в компьютерной анимации, которых описывает набор зависимостей между управляющими и управляемыми элементами, созданный таким образом, чтобы управляющих элементов было меньше, чем управляемых. Назначение — упростить манипуляцию большим количеством объектов. © Википедия.

В течении урока я продемонстрирую создание иерархии объектов с последующим ее разбитием для изоляции движения (isolate motion technic), а так же использование одной из самых полезных нод Maya Multiply/Divide и пару простых формул X = pow (Y,-1) или иначе говоря X = 1/sqrt(Y) для создания squash and stretch контроля которые являются неотъемлемой частью любой персонажной анимации. Вдобавок ознакомимся с Hypergraph и как создавать соединения между нодами Maya.

Итак, для начала создадим nurbs сферу в центре осей координат, это будет наш мячик. Для тех кто изучает Maya с опытом 3DS Max, рекомендую не использовать Interactive creation. Для этого в панели create->nurbs primitives убрать галочку с Interactive creation, таким образом при последующем нажатии сфера создастся ровно в центре осей. Итак создаем nurbs sphere и перемещаем ее по оси Y так, что бы она стояла на сетке.
Изображение

Теперь удалим ноду истории конструкции сферы, поскольку в этом случае она нам не нужна Edit->Delete by Type->History. Таким образом наша сцена будет чистой без всякой ненужной информации. Одно из основных правил рига в любой программе, будь то Maya, XSI или 3DS Max, это не забывать делать Freeze transformations для необходимых объектов. Такая опция имеется во всех программах потому что, она жизненна необходима для рига и анимации и самого аниматора. Поэтому выделяем нашу сферу и идем в Modify->Freeze Transformations, теперь если мы заглянем в Сhannel box, то увидим что координаты сферы по всем осям опять равны нулю. Переименуем нашу сферу в "Ball".

И так наш персонаж "Ball" готов к ригу. Начнем с создания иерархии контроллеров. Создадим контроллер который будет отвечать за squash and stretch. Для этого создадим nurbs circle, повторяем процедуру удаления history и freeze transform. И переименуем nurbsCircle1 на что-нибудь более дескриптивное , например назовем его squash_cntrl, будем стараться следовать 3d конвенциям по названию объектов. Мы еще вернемся к squash_cntrl для создания самого squash and stretch при помощи выше упомянутой ноды Multiply/Divide. А пока закончим иерархию всех контроллеров мяча. Далее создадим еще один nurbsCircle и повернем его по оси Y на 90 градусов и сместим и отскейлим его так что бы получилось как на картинке. Назовем его rotate_cntrl, он будет отвечать за вращение мяча. Не забываем про history и freeze transformations.
Изображение

Теперь парентим Ball под squash_cntrl и squash_cntrl под rotate_cntrl. Что бы парентить, выделяем сперва child потом с зажатым Shift выделяем parent и нажимаем клавишу P.
Создадим последний контроллер который будет замыкать иерархию, еще один nurbs circle, но теперь уже изменим его форму что бы он отличался от других контроллеров. Например предадим ему вот такую форму путем перемещения вершин:
Изображение

Назовем его translate_cntrl. И конечно же delete history и freeze transfrormations. Парентим rotate_cntrl под только что нами созданный translate_cntrl. И так наша иерархия готова. Теперь немного к теории о squash and stretch technic.

Squash and stretch, это один из основных принципов любой персонажной анимации, для изображения веса, скорости, силы движения и воздействия, в общем все то что делает анимацию более правдоподобной интересной для нашего глаза. Принцип таков: если объект растягивается по оси Y, то что бы сохранить объем, объект сплющивается по осям X, Z и наоборот. Проще говоря, оси Z и X становится инверсионными значениями оси Y т.е. scaleZ = scaleX = 1/sqrt(scaleY) или попроще X и Z =Y^-1. Этот принцип применяется не только для мячика, но и для всех частей тела бипедовых и квадрупедовых ригов. Признаюсь честно, на мастер классе одного из бывших разработчиков Alias я не сразу въехал в смысл этих уравнений, но когда продемонстрировали аналог рига спины Голума, то среди десятков строк кода половину занимали слегка модифицированные выражения pow (scaleY,-1) и 1\sqrt(scaleY) я понял, что это фундаментально как для мячиков, так и не для "мячиков" вроде Голума. Конец теории. Теперь как нам запихнуть это уравнение в наш мячик? Есть два способа: через expression или через ноду Multiply/Divide. Поскольку Мауа основана на нодах мы воспользуемся этим большим преимуществом, избегая необходимость писать еxpression с MEL.
Итак откроем окно HyperGraph. Window->Hypergraph: Connections. В этом окне схематически показываются все ноды Maya, а так же их взаимосвязи (прошу не путать с иерархией). Во вьюпорте Maya, выделяем squash_cntrl и в окне Hypergraph нажимаем кнопку output and input connections, мы должны увидеть ноду трансформации и ноду shape контроллера squash_cntrl. Нас интересует нода трансформации (та на которой не написано shape) Затем в окне Нуреrgraph нажимаем на меню Rendering->create Render Node. Выбираем Multiply Divide
Изображение

В окне Hypergraph мы должны увидеть только что выбранную multiply divide и ноды контроллера squash_cntrl. Теперь самое интересное, наводим курсор мыши на ноду трансформации и зажав среднюю кнопку мыши перетащим курсор на multiply divide, вылезет окошко, нажимаем Other. Maya откроет Сonnection editor где можно соединять атрибуты разных нод. Мы должны соединить атрибут scaleY контроллера squash_cntrl c одним из input ноды Multiply Divide. Для этого нужно всего лишь кликнуть в левой половине Сonnection editor на атрибуте scaleY и потом кликнуть на input1X что находится в правой половине окна
Изображение

Закроем Сonnection editor. В Hypergraph выделим ноду multiply divide, нажмем Сtrl+A, появится окошко с параметрами выделенной ноды, как видите в поле Input 1 одно поле желтого цвета, там отображается атрибут scaleY контроллера Squash_cntrl который мы подсоеденили в Connection editor. В rollout Operation выберим опцию Power, что является эквивалентом "pow" (возвести в степень) и в поле Input 2 впишем значение -1.
Изображение

Т.е. мы говорим ноде Multiply Divide возвести Input 1 в степень Input 2. Или иначе scaleY^ -1.
Теперь в Hypergraph щелчком средней мыши с ноды Multiply Divide перетащим курсор на ноду squash_cntrl (т.е теперь делаем наоборот) нажимаем Other. И в Сonnection editor в левом поле кликнем на output1X ноды Multiply Divide в правом окне кликнем на scaleX и scaleZ
Изображение

Закроем Hypergraph... фуууф сделали. Если все правильно, во вьюпорте выбираем squash_cntrl и пробуем его скейлить по оси Y. Сфера растягивается и сплющивается, но при этом сохраняя объем. Так как скалатура осей X и Z теперь автоматически высчитываются через ноду Multiply Divide. Повторюсь, это был только мячик, но тот же способ используется для сетапа спины, рук, головы и шеи персонажей, естественно речь идет о более комплексных ригах, но логика работы такая же.
Изображение

Закончив с squash and stretch займемся isolate motion.Это считается стандартной техникой в риге для разбития иерархии и изоляции движения. В нашем случае все достаточно просто, выделяем squash_cntrl и идем в Edit->Unparent. Попробуем сместить и вращать translate_cntrl все "дети" наследуют движение родителя, кроме squash_cntrl и его "ребенка'' мяча. Это не то что мы хотим, но мы уже близко, нужно сделать так что бы squash_cntrl наследовал только трансляцию при этом ротация оставалась изолированной. Для этого воспользуемся констреинтом позиции. Выделяем translate_cntrl c зажатым шифтом выделяем squash_cntrl и в aniamtion mode идем в меню Constraint->Point Constraint. Теперь если попробуем сместить translate_cntrl все работает, если мы попробуем вращать rotate_cntrl, то увидим, что squash_cntrl (и следовательно его "ребенок) не вращаются за rotate_cntrl потому, что они больше не часть иерархии. Это почти то, что нам нужно, остается только приконстреейнить сам Ball к rotate_cntrl. Для этого выделяем rotate_cntrl потом Ball и меню Constraint->Orient Constraint. Теперь Ball вращается вслед за rotate_cntrl и это то что нам нужно. Таким образом мы изолировали ротацию контроллера squash_cntrl, это нам позволит делать squash and stretch в любом направлении независимо от вращения мяча, например в каком бы положении не находился бы мяч он бы сплющивался и растягивался в заданном нами направлении.
Финальная часть, после долгих дней работы над ригом наступает время когда его надо отдать аниматору. Но сначала проведем Clean up, т.е. спрячем все ненужные атрибуты, которые будут мешать и путать аниматора, при этом вы будете спать ночью спокойно и знать, что вас никто не проклинает за некачественный риг. Поэтому в Channel box выделяем ненужные атрибуты, правый щелчок мышки и выбираем Lock and hide selected
Изображение

Для squash_cntrl прячем все translate и visibility. Для rotate_cntrl прячем translate, scale и visibility. Для translate_cntrl прячем все кроме translate.
Для Ball прячем абсолютно все. Потому что мы не хотим случайно его сдвинуть и анимировать.

Пример небольшого отрывка сетапа скелета плеча и предплечья. Где на ряду нами уже пройденной ноды Multiply Divide используются другие ноды-утилиты.
Изображение

Вот в принципе и все. Надеюсь, что для Вас, урок оказался познавательным и полезным. Rock and Roll товарищи!

Обсудить статью
1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему