Риг животного в максе

A horse, a horse

A kingdom for a horse

W. Shakespeare

Описание создание скелета животного в максе крайне редкое явление. Ну что ж попытаемся исправить это досадное упущение. И так темой сегодняшнего рассказа будет создание жизнеспособного рига непарнокопытного животного (хотя риг парнокопытного животного делать почти точно также).

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

Рисунок 1

Я не буду рассказывать как создавать кости - надеюсь любой, кто столкнется с данной задачей найдет в Интернете анатомию и срисует скелет (лично я так и сделал). Единственное о чем стоит упомянуть - хотя передние ноги стоят ровно, я создавал кости в согнутом положении. А потом их выравнивал (этим я добился правильной ориентации Preferred Angles, то есть если мы посмотрим на ориентацию костей, ось ротации Z (Gimbal) находится в той же плоскости, что и плоскость сгиба, только в этом случае можно гарантировать, что кости не будут крутиться, когда мы назначим IK-решатель). Маленький совет - двигайте кости только в плоскости изгиба, Если это невозможно (например скинпоза человека с полусогнутыми и полуопущенными руками (так действительно будет настраивать скин удобнее), то начиная от родителя и вниз по иерархии сначала поворачиваем кости - ставя плоскость изгиба в нужное нам положение и только потом двигаем суставы в нужное нам место.

Рисунок 2

Прежде чем приступить к настройке скелета встаньте на четыре свои конечности, на кончики пальцев, и сделайте пару кругов по комнате. Спросите зачем? Ну на это есть три важные причины:

  • Ну сколько можно сидеть за компьютером? - разомнитесь.
  • Своими выбрыками вы весьма повеселите окружающих.
  • Важно понять, где у лошади, какие суставы- то есть самый верхний (по середине туловища) это ваше плечо, второй (где начинаются ноги) - это локоть, третий (на <коленке>) - это запястье, ну и пальцы - это я про ваши передние ноги, с задними немного легче, там суставов поменьше, поэтому сами разберетесь, если нет то возвращайтесь к началу абзаца. Теперь мы знаем, например, что в передней ноге вторая и третья кости не могут разогнуться, образовав угол направленный вперед - ведь это наш локоть, ну и т.д.

Задняя нога

Рисунок 3

Итак, приступим. И начнем с задней ноги - три длинных кости - значит две пересекающихся IK (для тех, кто не знает, как создавать решатели инверсионной кинематики - Animation/IK Solvers/HI Solver именно этот тип мы будем использовать чаще всего). То есть создаем одну Ik от первой кости до третей, другую ik от второй до четвертой (я хочу, что бы вторая ik отвечала за положение ноги, а первая за углы наклона между костями). Проверяем, что получилось - действительно вроде первая икушка меняет углы, но не сдвигает всю ногу. А вторая делает что то странное и не то что я хотел. Отменяем все сдвиги которые мы только что сделали и создаем два shapes-линии которыми мы будем управлять ногой - копыто и стрелочку. Подвинем их на нужное место, и назначим стрелочке Position Constrain относительно копыта ( Animation/ Constrains/ Position Constrain-появится пунктирная линия которой вы тыкаете в копыто)- стрелочка прыгнет на копыто и все ваши попытки поставит ее на место нагло проигнорируются.

Position Constrain позволяет связать положение одного объекта с другим.

Мы выбрали этот способ создания констрейна (есть еще парочка) потому, что при этом автоматически был создан Position List-контроллер который правда ни чего не делает, но сильно облегчает жизнь. И так, что же мы наделали, давайте разберемся - для этого делаем раз ( c)

Рисунок 4

мы попали в motion панель, здесь мы можем узнать все о контроле над объектом, то есть что его контролирует,

если б это был объект, на который ни чего не назначено, то в окошке Assign controller было бы рядом с Position-

Position XYZ -то есть объект управляется с помощью трех треков x y z -мы его можем просто подвинуть или с анимировать -при чем у нас три трека -на каждую из осей, мы можем создавать ключи отдельно для каждого направления. Давайте разберемся, какие еще мы можем назначить контроллеры - выбираем position и кликаем на маленький знак вопроса в самом верху:

Attachment-позволяет присоединить объект к любому фейсу другого объекта, при чем его положение и номер фейса анимируется.

AudioPosition -положение согласуется с аудиотреком (скачет под музыку)

BezierPozition -один общий трек на положение объекта в кривых Безье (кривые имеет тангенсы и очень легко управляются -мои любимые кривые) но так как трек один ключи ставятся сразу на три оси и разделить вы их не сможете

Liner Position -то же самое , но кривые линейные, то есть кривая движется по прямой от ключа к ключу -не возможно сделать ускорение или замедление параметра, в некоторых случаях оно и не нужно -например равномерное движение камеры( то же самое можно сделать и с Безье задав линейность нужным ключам)

TCB Position то же самое -кривые ТСБ -плохо управляются, (пережиток от старых версий макса -раньше других кривых и не было) и я их не люблю и ими не пользуюсь, и рассказывать о них не буду

Path Constraint-движение по пути

Position Constraint -ну это я уже говорил

Position Expression- задает положение с помощью математического выражения, здесь мы можем использовать математические функции и задавать переменные связанные с другими параметрами других объектов -вполне разумная замена скриптам -мы с ним столкнемся по позже когда будем разбираться с шеей

Position List-позволяет сводить несколько контроллеров в месте-до его использования мы дойдем довольно скоро

Position Reactor -можем задать несколько положений которые будут контролироватса каким то параметром -максовский аналог драйвен киз но реализован не лучшим способом (на мой личный взгляд)

Position Script -просто пишем скрипт

Position XYZ- назначаемый по дефолту, и разделяет матрицу на три трека для каждой оси

Spring-объект при анимации будет вести себя как на пружинке, полезная вещь, но одно "но"-тормозит

Surface -позволяет привязать объект к поверхности (Поверхность должна быть NURBS) вы не сможете контролировать положение на прямую - вам придется в моушен панели задавать координаты УВ ручками :(

Noise Position- настраиваемый шум- объект будет трястись случайным образом, но под вашим контролем

Я пропустил несколько контроллеров по простой причине - Совершенно не знаю, что они делают - Кто знает - подскажите, пожалуйста.

Почти те же контроллеры мы можем назначить и на любой единичный параметр (позишн контроллеры возвращают матрицу из трех величин - три оси - но мы можем назначать контроллеры и на каждую ось в отдельности, так же как и на любой анимируемый параметр, а таких много - некоторые будут созданы при назначении одного из выше приведенных контроллеров, многие появятся вместе с модификаторами)-

единственно тут добавилось

Boolean Controller-или 0 или 100

On/Off-выключает контроллер с сохранением анимации, потом можно вернуть предыдущий контроллер и все встанет на место

Waveform Float-изменение по синусоиде

Для ротации -

Oriental constraint -связать с ротацией другого объекта

LookAt Constrain-направляет одну из осей на выбранный объект

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

Может в следующий раз.

В нашем случае написано Position List- внутри которого находятся PositionXYZ и Position Constrain-то есть два контроллера - но почему тогда мы не можем подвинуть shape, потому что один из контроллеров не активен, и я знаю какой. Опускаемся по панели ниже - находим Position List-Выбираем PositionXYZ (Делай два), нажимаем на кнопку ( Set Active) (делай три) и последнее - делаем четыре - ставим галочку Average Weights- теперь на наш шейп действуют оба контроллера, причем делят между собой воздействие по отношению весов-100/100, то есть поровну. Потом мы сюда еще вернемся. Приlinkовываем стрелочку к жо.. к первой кости спины, и ставим на место - к первой ик, вы заметили, что шейп прошел половину расстояния от пройденной курсором мышки - потому, что на него действует два контроллера - если вы подвинете копыто, то он пройдет половину расстояния пройденного копытом. Создаем еще одну ик и прилинковываем все как на картинке. Не знаю как у вас, а у меня работает, правда стрелочка как то сильно кости равняет, (при беге лошадь старается поставить ногу так что бы первая и третья кость были параллельно ,по этому ставлю копыто в максимальное переднее положение и подвигаю стрелочку, так что бы кости были параллельны, отодвигаю в крайнее заднее положение копыто и в motion панели добавляю вес на Position Constrain пока кости не выровняются. То есть система получившаяся в ходе наших манипуляций действует автоматически, когда мы двигаем копыто - работает вся нога, но в тоже время мы в любой момент можем подкорректировать положение - такой полуавтомат получился. ( Мы не смогли бы этого сделать, если бы назначили одну ик на все ногу.) Маленькое замечание - так как на один из управляющих объектов действует два объекта, то при анимации следите, чтобы ключи ( пиковые)на оба шейпа были на одном кадре, позволяет избежать не нужных нам замедлений и внезапных ускорений. Теперь по вращаем копыто - у меня у нижней кости угол наклона такой же, как и у шейпа, но положение меняется (чуть не забыл пивот - то есть точка оборота, не только является тем, чем есть, но также эта точка, по которой пишется вся анимации ,положение объекта, например по оси х это положение не самого объекта, а его пивота - ведь пивот может быть смещен, по этому, прежде чем приступать к ригу - поставьте центр трансформаций по пивоту), Кость вращается вокруг пивота копта - мы можем убрать вращение, поставив пивот шейпа на мест третей ика, но мы сделаем немного по-другому - заходим в иерархи панель (рядышком с motion), и включаем Effect pivot only, ставим пивот на краешек копыта спереди - так как копыто топает не заметно при беге, но в самой дальней точке поворачивается на носке, то можно избежать добавочных контролеров сзади и посередине. Создаем пару Points -спереди и сзади. Назначаем на обе ik в Motion панели таргеты- точки куда будет повернута плоскость изгиба ( Pick Target) .

Написать это было намного труднее, чем сделать - честное слово.

Передняя нога

Рисунок 5

Буду краток - тоже самое, что и задняя.

Спина

Рисунок 6

Прежде чем приступать к созданию рига создадим несколько линий- для контроля сзади и назовем Ass , для контроля переда ( Brest) , для середины ( называйте как хотите) и еще одну линию при создании которой будем использовать Smooth vertices , для чего перед тем как создавать линию включим initial type - smooth - начинается эта линия в начале цепочки костей , вторая точка посередине и точка три в конце ( эта линия понадобится при создании spline IK)

Далее - Animation/IK Solvers/ SplineIK Solver-выбираем первую кость потом последнею и нашу линию. Появится Ik Goal (синенький крестик ) и три points .Совмещаем пивоты управляющих элементов с надлежащими points( Hierarchy panel/ Effect pivot only - Alt A , выбираем точку) , прилинковываем (см/ рис. 6). Теперь нужно написать скрипт на поворот спины вдоль продольной оси. Но прежде чем мы приступим к этой процедуре, мы должны выбрать правильную ось вращения для наших shapes , а для этого придется сделать маленькое отступление и познакомить вас с отстойной системой Gimbal .

Gimbal

Система в которой пишутся все повороты в программах по 3 D-графике ( макс отнюдь не исключение). И главное что стоит понять это зависимость осей вращения друг от друга и от порядка обхода

Рисунок 7

Порядок обхода мы можем узнать в motion панели, у данного объекта X Y Z - и это значит что ось Z не зависит от поворотов самого объекта, а зависит только от положения его родителя (предыдущего по иерархии объекта, в данном случае Scene Root и повернуть вы ее не сможете) ось Y -зависит только от оси Z .X - зависит от обеих осей вращения и (какое счастье) совпадает с локальной осью на туже букву, вот на эту ось (не на X, а на первую ось в обходе) и приходится львиная доля скриптов , wire parameters and expressions . Но как повернуть нужную нам ось в нужное положение? Если мы просто повернем объект, то получим вот такую картину-(см рис 7), то есть две оси схлопнутся в одну, так называемый Gimbal Lock ( кстати это основное положение для столь частых глюков в 3д программах) и если писать анимацию в другой системе, например Local, то скрипт будет выполняться на половину и или не будет вообще. По этому можно добавить еще одного родителя и поворачивать его или, что более правильно, поменять порядок обхода и сделать, так что бы нужная вам ось была первой в порядке обхода.

Обратно к лошади

У меня ось, которая мне нужна, это ось Y , по этому я выбираю обход YZX и приступаю к написанию скрипта. Выбираю IK Goal и перехожу в панель Motion.

Рисунок 8

Выбираю Twist End Angler, кликаю на знак вопроса и выбираю Float Script

Строка первая -

DependsOn $Ass $Brest

Описание влияющих объектов. Спереди и сзади .

p=DegToRad $Ass.Rotation.Y_Rotation.Controller.Value

присваиваю переменной p значение Y вращения объекта Ass

o=DegToRad $Brest.Rotation.Y_Rotation.Controller.Value

Переменная o , объект Brest

i=o-p

От вращения переднего объекта ( он задает поворот грудины ) отнимаю вращение задницы ( до этого она влияла на поворот всего туловища, теперь влияет только на заднюю часть.)

Ну вот и все. Может человек, который добросовестно прошел туториал макса, спросит, почему так просто, а где умопомрачительная иерархия, где второй скрипт на начальный угол. Отвечаю: во-первых, зачем усложнять? А во-вторых, если вы <правильный> скелет положите на бочок и покрутите, то ваш персонаж превратится в выжатую тряпочку - произойдет резкое перекручивание костей ( а ведь анимация смерти и падения входят в основной набор игровых анимаций Вы рожаете его в творческих муках, на ваших глазах он делает первые неуверенные шаги, как вы радовались, когда он побежал, а потом вы его убиваете. Убиваете! УБИВАЕТЕ!!!).

Я не знаю, где Discreet заказывал уроки, но мне интересно, откуда такие ошибки, и почему ни слова о Gimbal.

Шея

Рисунок 9

Шея последний элемент в настройке нашего скелета, и здесь мы будем использовать все то, что использовали раньше на полную катушку. Начнем с создания управляющих элементов и сплайна для ик решателя( особое внимание уделите голове, вы не должны вращать сам объект, и должны правильно выбрать порядок обхода) . Назначаем Spline IK .Назначаем на треугольники Position Constrain и прилинковываем. Настраиваем веса отношений приблизительно по отношению расстояний до управляющих элементов. Прилинковываем points . Создаем для кости головы orientation constrain относительно управляющего голову сплайна ( Animation/ Constrains/ Orientation) кость повернется под не нужным нам углом. Для того что бы избавится от этого выбираем кость и переходим в Motion панель и кликаем на Rotation (рис 10 )

Рисунок 10

Опускаемся ниже по панели. И ставим <сохранить смещение> (рис 11)

Рисунок 11

Рисунок 12

и теперь приступаем к написанию зависимости поворота продольной оси, но будем для разнообразия использовать Float Expression . Для этого выберем ик и в Motion панели (рис 12) на Twist End Angler (1.) назначаем (2.) Float Expression. В появившемся окне создаем две скалярные переменные < а> и < b> (3.) , выбираем переменную <а> (4.) и кликаем на Assign to controller (5.) (назначить контроллеру) и выбираем ротацию по игреку объекта head (6.) ( что бы легче было выбирать объект -перейдите в Isolate Selection), закрываем окошко(7.) и по аналогии назначаем переменной < b> ротацию < y> объекта Brest .

Пишем в окошке Expression -< a- b> , вот и все. Этот екпрешен делает то же самое, что и ранее написанный скрипт, но мне намного симпатичнее этот вариант - я не очень люблю писать длинные выражения J.

Заключение

Ну вот и все. У вас есть готовый скелет, на который осталось положить скин и можно приступать к анимации. Надеюсь, мои старания не прошли даром, и кому-нибудь эта статья помогла в чем-то разобраться, чему-то научила. Меня она научила одной вещи - никогда не садится за писанину еще раз - очень нудное занятие. И хотя я планировал написать еще статью по анимации, но увы. Я стараюсь не наступать на одни грабли дважды.

733 0 850 12
7
2006-02-25
Отличный урок. Зря все так его проигнорировали.
2006-06-12
Только настоящий аниматор поймёт этот урок. Спасибо, Шекспир!
2006-10-31
Как аниматор снимаю шляпу.Отлично!
2007-04-02
О Великий Лосевод и Конезаводчик Калашник.....
2008-07-10
Урок очень хороший только путанный. Друзья, помогите пожалуйста кто-нибудь со следующими вопросами: 1. Независимо где я создаю кости во фронтальной плоскости или в Left, коленка у передней ноги гнется в обратную сторону и поворачивается вокруг своей оси. Навсякий случай прикладываю картинку 2. "Pivot у копыта ставим на краешек" Это имеется ввиду у последней кости, у шэйпа или может быть у IK? Если у кости, то просто растет родительская. Если у шейпа, то смещается коленка и потом приходится ровнять. Если у IK, то последние две кости просто поворачиваются. У кого пайвот трогать то и для чего? 3. Дальше вобще не понятно. "Создаем пару Points -спереди и сзади. Назначаем на обе ik в Motion панели таргеты- точки куда будет повернута плоскость изгиба" Вопрос - Какие оба IK привязывать? И какой к какому поинту?
2008-07-10
Прошу прощения, картинка [URL=http://img90.imageshack.us/my.php?image=dswfba9.jpg][IMG]http://img90.imageshack.us/img90/9412/dswfba9.th.jpg[/IMG][/URL]
2013-09-21
Спасибо вам большое за урок! Вы даже не представляете насколько он мне пригодился! Спасибо!
RENDER.RU