3D Engineering

...Лучшее из общего.

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Одну из осей

Kalashnik

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.

Заключение

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

 

Архив статей

 авг   Сентябрь 2019   окт

ВПВСЧПС
  1  2  3  4  5  6  7
  8  91011121314
15161718192021
22232425262728
2930 
Julianna Walker Willis Technology

Случайная новость

Jenya Rvachov
От автора.
Здравствуйте.
Меня зовут Евгений.
Работаю в области 3d более трех лет. Начинал изучение трьохмерной графики с пакета 3ds max.
Сейчас работаю исключительно в пакете Maya.
Идеей написания урока послужила цель создать проект с использованием первого, как для многих тридешников так и для меня, пакета трехмерной графики 3ds max.

Финальная картинка: cocktail

В этом уроке я хочу рассказать, как создать реалистичную динамику жидкости по средствам программы RealFlow с последующей визуализацией в 3 ds max . Данный урок рассчитан для тех кто уже имеет представления о динамики жидкостей и знаком с программой RealFlow .

 

Работа состоит из следующих этапов:

 

  1. требуется отмоделить емкость, которая будет содержать наш коктейль.
  2. В программе RealFlow создать источники частиц и настроить их симуляцию.
  3. Созданную симуляцию преобразуем в анимированный меш.
  4. В среде 3 ds max загружаем секвенцию анимированного меша.
  5. Настраиваем освещение и материалы сцены.

 

Начнем.

 

1. Для моделирования емкости, я отмоделил стакан элементарной формы.

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

 

2. Запускаем RealFlow , создаем проект.

Трек анимации увеличим до 200 кадров. Импортируем нашу емкость. Для экспорта в 3 ds max я использовал формат obj .

Но если вы захотите в 3 ds max создать анимацию стакана, то для экспорта используйте формат sd . Данный формат доступен после установки плагина для 3 ds max , который можно скачать с официального сайта http://www.nextlimit.com

После того как емкость импортирована в RealFlow , следует создать источники частиц. Я использовал спрей для частиц типа Circle . Для создания силы тяжести был использован Daemon --> Gravity.

Для того чтобы наш коктейль содержал разные жидкости, было создано три источника частиц Circle и угол для спрея выбран таким образом чтобы все источники были направлены в центр стакана.

Настройки параметров симуляции частиц можно увидеть на рисунке ниже. Хочу заметить что параметр плотность ( Density ) влияет на плотность жидкой среды (в Кг/м^3). Для воды значение по умолчанию = 1000. Чем выше плотность, тем медленнее и тяжелее жидкая среда. Разрешающая способность ( Resolution ) влияет на количество частиц представляющих жидкую среду. Чем больше разрешение, тем больше количество частиц, причем более легких. Высокое разрешение дает более разнообразное и гладкое поведение жидкой среды. Но не советуется выбирать большое разрешение (требует высоких ресурсных затрат)

Настройте параметры симуляции для всех трех источников. Но для того чтобы жидкости испускаемые из трех источников отличались, параметр плотность ( Density ) настроим для каждого из спреев разным. Я взял для первого источника плотность равную 1000, для второго 1200, и для третьего 800. Поварьируйте с данным параметром.

Далее требуется настроить параметры столкновения частиц с объектом, в нашем случаи это стакан. Данная вкладка доступна только после создания источников частиц и гравитации. Все параметры оставьте по умолчанию, только измените параметр прилипание ( Sticky ). Коэффициент прилипания представляет собой силу, которая пытается удержать частицы на гранях объекта. Этот параметр имеет широкий диапазон значений, поскольку степень прилипания зависит от силы притяжения и вида жидкости. Советую взять значения силы тяжести , а затем изменяйте его до получения желаемого результата. Я использовал значение Sticky равное 50.

После того как свойства объекта настроены, переходим к симуляции частиц. Ниже на рисунке изображена симуляция частиц из трех источников.

Остановите симуляцию тогда, когда жидкость заполнит емкость на 30%. Я остановил симуляцию на 50 кадре. Поставьте по два ключа анимации для параметра speed , для 50 кадра поставьте ключ равный параметру speed = 2, на 51 кадре измените speed до 0 и поставьте ключ. Проделайте данную операцию для всех источников. Таким образом после 51 кадра частицы испускаться не будут. Смело нажимайте на кнопку Simulate , просчитайте симуляцию до конца трека.

3. Симуляция частиц закончена. Теперь следует создать и настроить три меша для каждого из источников.

Применяем для меша по одному флюиду. Жмем ОК. Для остальных двух мешов проделаем такую же операцию. В результате у вас должно получится следующее:

Настройки меша представлены ниже на рисунке. Поварьируйте с такими параметрами как Relaxation во вкладке Filters так и с параметром Radius во вкладке Field . Для остальных двух мешов создайте такие же настройки.

После того как меш настроен, просчитаем создание сетки для каждого из кадров анимации. На рисунке ниже изображен просчет меша для 47 кадра.

4. Загружаем 3 ds max . Подгружаем нашу секвенцию меша, сохраненную в вашем флововском пректе в папке meshes. Так как мы создавали меш для каждого из источников частиц, то папка meshes должна содержать 600 файлов с расширением bin , 200 файлов на каждый источник. В 3ds max создадим три сетки.

5. Создайте окружение, источники света, настройте материалы по вкусу.

Для жидкости я использовал разные материалы, что бы создать эффект смешивания.

Надеюсь, вы нашли для себя хоть что-то полезное в этом уроке.

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

Спасибо за внимание.

далее