Анимация гаражных ролетт в Maya
Анимация гаражных ролетт в Maya
Здравствуйте, меня зовут Андрей Бабак, мне 33 года, я живу в Киеве и работаю дизайнером в сетевом рекламном агентстве. 3D и программирование является моим давнишним хобби. 3D я начал осваивать с 3D Studio, когда она была еще под DOS, потом был длительный перерыв, а после я запал на Cinema 4D. Затем я понял, что синема меня во многом не устраивает и, «по совету друзей», перешел на Maya. Ни разу не пожалел, кстати.
Это мой первый урок, прошу не судить строго. ;-)
Я хочу поделиться с вами знаниями, полученными на основе собственного опыта. Сегодняшним уроком я обязан просмотру видеороликов по возможностям Maya 2008, как это ни покажется странным. В одном из рекламных роликов там рассказывалось о новых возможностях nCloth, где комментатор использовал гаражные ролетты для экранирования ветра. Меня очень заинтересовало, как можно сделать, чтобы при простом движении одного объекта, поднимались и опускались гаражные ролетты. Вначале я как программист пытался реализовать такое поведение с помощью скриптов MEL, где использовалось много expressions и расчетов положения в пространстве деталей ролетты, и у меня даже все получилось (желающие могут получить исходник первоначальной сцены). Однако не давала покоя мысль, что это можно сделать гораздо проще. Затем настало «озарение», которым я и хочу поделиться с вами.
Создадим новую сцену, и в ней – полигональный куб, который станет элементом ролетты. В Channel Box выберем INPUTS > polyCube1 и зададим следующие значения: Width=2, Height=0.45, Depth=0.1:
Далее мы сдублируем этот объект, чтобы создать основу для ролетты, для чего выберем Edit > Duplicate Special > , сделаем Edit > Reset Settings, поставим Translate: 0; 0.5; 0 и Number of copies: 10:
Теперь перейдем в вид сбоку, для этого выберем Panels > Orthographic > Side и нажмем F2 для выбора меню Animation. Выбираем Skeleton > Joint Tool из меню, либо кликаем на кнопку Joint Tool из закладки Animation:
Теперь мы создадим топологию нашей ролетты при помощи «костей». Для этого в выбранной нами проекции мы расставим «суставы» в местах, где расположены петли нашей ролетты (кликаем мышкой между планками):
Мы получили «скелет» нашей ролетты, давайте перегруппируем объекты, чтобы назначить привязку «костей» к реальной геометрии. Выберем Window > Hypergraph: Hierarchy и нажмем кнопку Frame all, чтобы отобразить все объекты сцены. Вы должны получить что-то подобное:
Далее мы сгруппируем наши планки с соответствующими «костями». Перетаскиваем средней кнопкой мыши объект «pCube1» на «joint1», «pCube2» на «joint2», и т.д., пока мы не получим следующую иерархию:
Вот теперь самое время назначить нашим «костям» solver – механизм, который будет рассчитывать положение «костей» и сгруппированных с ними объектов.
Выбираем Skeleton > IK Spline Handle Tool (если вы не можете найти это меню, убедитесь, что у вас выбрана группа меню анимации – F2) и выбираем щелчками мыши первый и последний сустав, после чего должно получиться следующее:
Если мы теперь перейдем в режим Outliner, мы увидим, что в нашей сцене появилось два новых объекта: ikHandle1 и curve1:
Первый – это solver, о котором мы говорил ранее, а второй – это кривая, к которой будут стремиться наши «суставы». Выделите в Outliner объект curve1 и перейдите в режим редактирования точек, нажав F8, либо выбрав кнопку Select by component type:
Выделите несколько средних точек на этой кривой и переместите их на зрителя в направлении +Z:
Обратите внимание, как сместились «кости» и геометрия нашей ролетты. Вот этим эффектом мы и воспользуемся для достижения нашей конечной цели.
Выберите из меню Edit > Undo, чтобы вернуть вертикальную форму нашей ролетте, и перейдите опять в вид сбоку, из которого мы рисовали «кости». Для этого выберите снова Panels > Orthographic > Side и потом Edit > Deselect:
На этот раз мы будем рисовать профиль, по которому будет двигаться наша ролетта. «Отъедем» камерой немного назад, выберем Create > CV Curve Tool, зажмем клавишу «X», чтобы точки «прилипали» к сетке, и нарисуем такую кривую (в конце нажмем Enter):
Теперь опять вызовем Window > Hypergraph: Hierarchy и снова нажмем кнопку Scene hierarchy, чтобы увидеть все связи нашей сцены:
Сейчас мы «подменим» первоначальную кривую curve1 на только что созданную curve2. Для этого выделим две кривые: curve1 и curve2 (кликнем на curve1, затем с зажатой клавишей Shift кликнем на curve2), нажмем на кнопку Input and output connections и получим похожую картинку:
Вы видите, что ikHandle1 связан с кривой curve1. Посмотрим, как они связаны между собой, и попробуем связать ikHandle1 с нашей кривой curve2, разорвав первоначальную связь:
Перетяните, удерживая клавишу Shift, средней кнопкой мыши ноду curveShape2 на ikHandle1. Откроется Connection Editor:
Слева мы видим атрибуты нашей кривой, справа – атрибуты ikHandle1. Так как мы уже посмотрели, какие атрибуты кривой нам надо связать с какими атрибутами ikHandle1, то мы можем сразу кликнуть в левой колонке на worldSpace, а в правой – на inCurve (inCurve выделена курсивом, что означает, что она уже привязана к кривой curve1, пусть это нас не смущает, нам надо разорвать эту связь):
Заглянем в Hypergraph:
Как мы видим, мы успешно поменяли связь ikHandle1 с изначальной curve1 на нашу нарисованную curve2. Посмотрим, что изменилось в сцене… Кажется ничего, наша ролетта осталась на своем месте. Однако изменилось многое.
Перейдем на перспективную камеру, для этого выберем Panels > Perspective > persp. Выберем в Outliner объект ikHandle1 и включим Channel Box:
Найдем поле Offset и впишем туда вместо нуля значение 3, и смотрим, что получилось:
Ура! Наша ролетта начала заворачиваться по нарисованному пути. Это уже 99% нашей задачи. Теперь внесем пару финальных штрихов.
Создадим локатор, который будет управлять нашей ролеттой, для этого выберем Create > Locator и сдвинем его в сторону от ролетты, задав ему значение TranslateX: -2...
...и привяжем значение ikHandle1.offset, которое определяет положение нашей ролетты на кривой, к вертикальному положению нашего локатора locator1.translateY. Выберите в Outliner либо в Hypergraph наш ikHandle1 и вызовите Window > Animation Editors > Expression Editor:
В колонке Objects у нас уже выбран наш ikHandle1, в колонке Attributes найдем offset и выберем его. Скопируем из поля Selected Object and Attribute значение ikHandle1.offset, вставим его в поле Expression, дописав в конце “=locator1.translateY;”, и нажмем кнопку Create (прежде проверьте, чтобы форма выглядела как на следующей иллюстрации):
После этого можно закрыть этот редактор и посмотреть, что у нас получилось. Как мы видим, наша ролетта вернулась на исходную позицию, поскольку локатор находится на нулевой высоте, а мы привязали положение ролетты на кривой к его вертикальной координате. Выделите локатор и подвигайте его вверх-вниз по оси Y и порадуйтесь, как прикольно ездит наша ролетта, поддаваясь его управлению!
Спасибо, что дочитали до конца, надеюсь этот урок хоть немного помог вам в освоении Maya!
С уважением,
Андрей Бабак.