Анимация гаражных ролетт в 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, зажмем клавишу «, чтобы точки «прилипали» к сетке, и нарисуем такую кривую (в конце нажмем 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!

С уважением,
Андрей Бабак.

785 0 850 18
30
2007-10-16
хороший урок, пытался только что попробывать сделать без костей так ниче в голову и не пришло :)
2007-10-16
Good tutorial,Thanks:)
2007-10-16
гдето на просторах буржуй нета я видел подобный урок... ничего сказать не хочу.. но блин... сомнения у меня...
2007-10-16
Сомнения? Ну, ну.
2007-10-16
2 автор.... мен извини был не прав... нашел видяху.. там не так сделано и не показывалось как делается... 5/5
2007-10-17
такая штука показывалась в одном из презентационных роликов Maya 2008. но там действительно особо не вдавались в объяснения. Так что спасибо за детализацию :)
2007-10-17
http://maya-training.narod.ru/b_education/tutors/maya/t_snake/snake.htm Вот здесь реализовано проще, а результат тотже.
2007-10-17
Михаил Куркубет, спасибо, я посмотрел ссылку и, честно говоря понял не многое. Что Вы имели в виду под "проще"? То что автор вместо рассказа на две страницы c иллюстрациями говорит "прицепим к колбасе скелет", а вместо моих последних двух страниц говорит "покрутим параметр offset"? Для тех людей, кому это понятно, туториал не нужен. Единственное, что там сделано проще, это прикрепление пути движения сразу, а не через Connection Editor, не знал, что можно сделать на два нажатия мыши быстрее. Хотя так как показал я - тоже не так плохо, это альтернативный способ, про который хорошо знать. Вы правда считаете, что для урока это минус? ;-) J-A-G-U-A-R, я писал про ролики во вступлении. Они и были той отправной точкой, мне захотелось придумать, как такое повторить.
2007-10-17
[b]friendly[/b]По моему вы слишком агрессивно воспринимаете критику в свой адрес. ;) Проще - это как раз и значит сделать меньше шагов для достижения нужного результата, не делать ничего лишнего и т.д. Скажем так: у автора урока по ссылке более рациональное решение, я не говорю про описание этого решения, а именно про само решение. Конечно это не минус, пусть народ знает что в майке существует такая полезная штука, как конекшн эдитор. :)
2007-10-17
Спасибо!)
2007-10-17
[b]friendly[/b] Хорошо,когда тема цепляет.Лучше пусть критикуют и добавляют "отсебятину",только так рождается рациональный способ достижения результата. Всего предугадать не возможно,если люди советуют более простой выход,стоит прислушаться...альтернатива,тоже хорошо,поучительно.
2007-10-17
Неплохой урок для новичков, единственное смутило ненужная возня с конекшен едитором 4/4
2007-10-17
[quote]хороший урок, пытался только что попробывать сделать без костей так ниче в голову и не пришло :)[/quote] с лету могу подсказать 3 решения без костей: 1: навешиваем на елемент ролеты geometry constrain и orient constrain к кривой, ставим по 3 driven key на перемещение в плоскости кривой(начало, середина и конец искривления) и offset Y(0,45,90), вяжем все элементы на локатор через parent(translate), а локатор вяжем geometry constrain к кривой(ну шоб красиво твикалось), - самое плохое из трех; 2: пускаем елементы по motion path, делаем break connections U value, ставим смещение для каждого елемента на U value motion path чтоб елементы образовали ролету, добавляем аттрибут(от 0 до 1) на кривую, который собсна и будет контролировать езду ролета, и ставим на него driven key и рулим им параметр U value для всех елементов(удобней всего при установке второго ключа при всех выбраных элементах ролета вбить в компонент едиторе +=5 например, тем самым равномерно сместив весь ролет одним махом ), от и все, один аттрибут рулит ролетом. 3: тоже что и в первом случае, но вместо гемора с orient constrain наваливаем tangent constrain и радуемся.- самый простой способ из всех ваще. любые проблемы с перекручиванием легко решаются добавлением констрейнов и/или настройкой существующих, плюс вариации куда прилипить окончательное управление ролетом т.к. это майя и наивно предпологать что проблему в майе можно решить только одним способом. ээээ, надеюсь автор не обидется что я так нетактично вломился в его урок...
2007-10-17
2 sich: Да нет, как раз наоборот, ужасно интересно читать про другие методы. Я-то новичек, все-же, в какой-то мере... Причина, по которой я написал этот урок - отсутствие внятной информации, понятного порядка действий. Сейчас попробую Ваши методы. Ваша "педагогическая" проблема в том, что то, что понятно Вам, и на Ваш взгляд не требует подробных объяснений - совершенно непонятно тем, кто только начал осваивать маю. То же самое я бы мог сказать про ссылку от Михаила. Сам же я благодарен. ;-)
2007-10-18
я вот как раз пытался с моушн path сделать но чето не понял как добавить смещение для каждого кубика одним махом, ведь их может быть несколько десятков.....
2007-10-18
спасибо friendly за урок и спасибо sich - получилось сделать по второму варианту (он мне больше как то нравится, я просто не мог понять как задать смещение )
2007-10-18
... Что-то мне подсказывает, что в том видео ворота тоже с помощью ncloth'a сделанны, я почему-то уверен что ncloth'ом проще на порядок ...
2007-10-18
Kopch персонаж поговорки про звон... , а если по сути, то что-то мне подсказывает что у меня завтра будет ламборджини..
2007-10-19
sich, Посмотри видео ещё раз, когда он выберает ворота – справа активизируются вкладки nrigshape1 и nucleus1, кроме того ворота он поднимает и опускает во время воспроизведения анимации, я конечно не знаток майя, но звон у меня как раз от туда и раздался ...))...
2007-10-19
так и быть просветлю любопытсвующих как сделано в видео)) хотя собсна ниче там космического нет. Ролетт там цельный плаеин, хотя для сгрупированного набора пластин это тоже прокатило бы.. так вот на плеин или группу вешаем деформер bend, вбиваем параметры envelope = 1, curvature=1.57, low bound=0, high bound=1. дергаем за плеин/группу по вертекали.... и о чудо!). магическая и подозрительная вкладка nucleus является вполне закономерной тк чувак сделал из ролетта блокирующую геометрию, и никакого отношения к деформации самого ролетта это не имеет отношения. да и в принципе использование динамики нецелесообразно для таких простых задач, ведь можно сделать персонаж мягким телом и пытаться его анимировать почередно поддувая на ноги и руки каким нить полем, но зачем ...
2007-10-19
да какая разница че вы спорите :)
2007-10-21
хороший урок!
2007-10-22
friendly Хороший урок. А на счет критики - не надо забывать, что урок на то он и урок, что бы подсказывать именно новичкам решение определенных задач, а не профессионалам. Удачи.
2007-10-26
Респект.
2007-11-26
А мне как начинающему Майщику ваш урок пошел на пользу,СПАСИБО,жду уроков на другие темы.
2007-11-26
А мне как начинающему Майщику ваш урок пошел на пользу,СПАСИБО,жду уроков на другие темы.
2008-05-01
А я знаю человека, который эти ролеты придумал (для окон)..
2008-10-26
IK, это интересно. Всю жизнь (3 года:)) работал в 3ds max, решил перейти на Maya. Для новичков типа меня, это ценный материал.
2009-10-31
Очень полезный урок! спасибо!
2012-02-09
кстати зачем такие сложности с конекшн эдитором? в свойствах убрать галку атоматического создания кривой и после выбора первого и последнего джоинта ткнуть в нужную кривую
RENDER.RU