Уроки: Maya

Имитация развевающегося флага



Имитация развевающегося флага
с помощью модуля CLOTH в Maya 3.0


Уроки по иммитации развевающейся ткани или флага достаточно часто встречаются в Интернете. Но попыток сделать это с помощью модуля Cloth нам еще не встречалось. Поэтому мы хотели бы поделиться своим опытом, полученным при изучении сцен из примеров к модулю Cloth еще в Maya 2.0. Хотя сцена с развевающимся флагом входила в комплект поставки Maya, описания того как сделать эту сцену нам не встречалось.

Итак, приступим.

Шаг 1.

Создайте новую сцену, а лучше всего проект под любым названием. Например: flag.
Убедитесь, что модуль Cloth у Вас подгружен. Для этого откройте окно Window > Settings/Preferences > Plug-In Manager и проверьте включен ли plug-in CpClothPlugin.mll. Если нет, то включите его.

Шаг 2.

Создайте Polygonal Plane с параметрами:

Width - 7
Height - 14
Subdiv.Width - 5
Subdiv.Height - 10


Переместите его на 7 единиц по оси Y и на 9 единиц по оси Z, также поверните на -90 градусов по оси X. Переименуйте в "windSourse".

Создайте Polygonal Cylinder с параметрами:

Radius - 0.1
Height - 12


Остальные параметры по умолчанию. Также переместите его на 6 единиц по оси Y и на 5 единиц по оси Z. Переименуйте во "flagshtok".

Создайте 4 кривые с Curve Degree - 1 Linear, так чтобы они пересекались в конечных и начальных точках (согласно требованиям модуля Cloth) и описывали прямоугольник с вершинами в точках:

1 вершина - (0, 11, 4.5)
2 вершина - (0, 11, -9)
3 вершина - (0, 5, -9)
4 вершина - (0, 5, 4.5)



Сгруппируйте эти кривые в группу "curves_for_Flag" и временно сделайте эту группу невидимой.

Шаг 3.

Выделите план windSourse и сделайте его источником частиц. Для этого, выделив windSourse, перейдите в Меню Dynamics, выберите Particles > Emit from Object. После этого у windSourse появится потомок emitter1. Выберите его и в Channel Box измените следующие параметры:

Emitter Type - Surface
Rate - 2
Scale Rate by Object - on
Speed - 0.05


Переименуйте emitter1 в emitterWind.
Проиграйте анимацию и убедитесь что частицы двигаются в отрицательном направлении оси Z. Выделите созданные при этом частицы particle1 переименуйте в "particleWind", вызовите Attribute Editor, откройте закладку Per Particle (Array) Attributes и, если отсутствует раздел lifespanPP, добавьте этот атрибут. Для этого выполните команду меню Attributes > Add Atributes, в появившемся окне выберите закладку Particle, найдите параметр lifespanPP и нажмите кнопку Add. Закройте окно Add Attributes.
В появившемся поле lifespanPP нажмите Правую Кнопку Мыши (ПрКМ) и удерживая ее в контекстном меню выберите Creation Expression. В появившемся окне Expression Editor в поле Expression наберите следующее:

particleWindShape.lifespanPP = 5;

и нажмите Create.

Затем переключите закладку Particle на Runtime и введите следующее:

vector $pos = particleWindShape.position;

if ( ($pos.y > 14) || ($pos.y < 3) || ($pos.z < -5) )
{
particleWindShape.lifespanPP = 0;
}


нажмите кнопку Create.
Данный Expression будет уничтожать частицы если их позиция больше 14 единиц по оси Y, меньше 3 единиц по оси Y и меньше чем на -5 единиц по оси Z. В Channel Box измените параметр Lifespan Mode на lifespanPP only.
Проиграйте анимацию и убедитесь что частици испускаются из windSourse не ниже 3 единиц и не выше 14 удиниц по оси Y и двигаются в отрицательном направлении оси Z.

Шаг 4.

При выделенных частицах particleWind создайте два поля:

airField1
turbulenceField1


(Меню Dynamics, закладка Fields, разделы Air и Turbulence, а выделение частиц необходимо для автоматической привязки воздействия этих полей на частицы particleWind).
Выделите airField1 и измените следующие параметры в Channel Box:

Magnitude - 7
Attenuation - 1
Max Distance - 20
Apply Per Vertex - off
Use Max Distance - on
Direction X - 0
Direction Y - 0
Direction Z - -1


Переименуйте airField1 в airField_Particles.

Выделите turbulenceField1 и измените следующие параметры в Channel Box:

Magnitude - 11
Attenuation - 1
Max Distance - -1
Apply Per Vertex - off
Use Max Distance - off

Щелкните в Channel Box на поле атрибута Phaze Z ПрКм и во всплывающем меню выберите Expressions, в появивщемся окне Expression Editor наберите следующее:

turbulenceField1.phaseZ = time;

Нажмите кнопку Create и закройте окно Expression Editor. Переименуйте turbulenceField1 в turbField_Particles. Проиграйте анимацию, частицы particleWind должны двигаться хаотично, ускоряться и исчезать при достижении по оси Z координаты -5.

Шаг 5.

Щелкните Левой Кнопкой Мыши (ЛКМ) в любом окне видов для отмены выделения. Создайте непривязанное к чему-либо radialField (Dynamics > Fields > Radial). Измените в Channel Box следующие параметры:

Magnitude - 250
Attenuation - 0.33
Max Distance - 3.3
Apply Per Vertex - on
Use Max Distance - on

Переименуйте radialField1 в "radialField_Wind". Теперь необходимо выполнить несколько связей. Мы предпочитаем использовать для этого Hypershade и его Work Area. Но можно настроить связи и не прибегая к его помощи.
Во-первых вызовите окно Connection Editor (Window > General Editors > Connection Editor).
Во-вторых вызовите окно Outliner (Window > Outliner) и в меню Display включите Shapes. В поле Outliner найдите и выделите particleWindShape. Перейдите в окно Connection Editor и нажмите кнопку Reload Left. Затем в Outliner выберите radialField_Wind, перейдите опять в окно Connection Editor и нажмите кнопку Reload Right. В меню Left Side Filters окна Connection Editor включите Show Hidden и затем аналогично в меню Right Side Filters окна Connection Editor включите Show Hidden. Теперь вы готовы для установки связей. В левом поле Connection Editor найдите и выделите параметр Centroid, затем найдите и выделите в правом окне параметр Translate. Таким образом Вы установили связь между параметрами:

particleWindShape.centroid > radialFieldWind.translate

Аналогично создайте связи:

particleWindShape.cachedWorldCentroid >
> radialFieldWind.ownerCentroid

particleWindShape.cachedWorldPosition >
> radialFieldWind.ownerPosData

particleWindShape.cachedWorldVelocity >
> radialFieldWind.ownerVelData

particleWindShape.auxiliariesOwned >
> radialFieldWind.owner




Проиграйте анимацию. Поcле первого кадра иконка radialFieldWind должна находиться в центре частиц particleWind и совершать небольшое хаотическое движение. Теперь можете отменить режим Shapes в Outliner.
Выделите windSourse, particleWind, radialFieldWind, airField_Particles, turbField_Particles и сгруппируйте их в группу "wind_Group" (это только для удобства работу, можно не выполнять этого).

Шаг 6.

В Outliner выделите группу "curves_for_Flag" и сделайте ее видимой. Затем выделите все 4 кривые в группе "curves_for_Flag", перейдиле в меню Cloth и создайте Garment (Cloth > Create Garment). При этом будет автоматически создана и панель panel1. Выделите panel1 и переименуйте на "panel_Flag". Теперь Channel Box в разделе INPUTS > cpDefaultProperty измените следующие параметры:

U Bend Resistance - 3.3
V Bend Resistance - 3.3
U Bend Rate - 0
V Bend Rate - 0
U Stretch Resistance - 210
V Stretch Resistance - 210
Shear Resistance - 99
U Scale - 1
V Scale - 1
Density - 0.007
Thickness - 0.2
Thickness Forse - 3
Cloth Friction - 0.1
Cloth Damping - 0.01
Air Damping - 0.05
Static Friction - 0.6
Dynamic Friction - 0.1

Затем в разделе OUTPUTS > cpStitcher измените параметр:

Base Resolution - 150

В разделе OUTPUTS > cpSolver измените параметры:

Start Frame - 0
Frame Samples - 1
Relax Frame Length - 0


Шаг 7.

Выделите созданный модулем меш cloth1. В любом окне видов нажмите ПрКМ и удерживая ее из Pop-up меню выберите Vertex, выделите 2 верхние и 2 нижние, ближайшие к flagshtok вершины, затем, удерживая клавишу "Shift", выделите сам flagshtok и выберите Cloth > Constrains > Transform. Данная операция создаст эффект привязки флага к флагштоку. Проиграйте анимацию. Вы должны видеть как cloth1 спадает вниз и повисает на флагштоке.



Аналогично при выбранном cloth1 из Pop-up меню выберите Vertex, выделите все вершины и, удерживая "Shift", выделите radialField_Wind и выберите Cloth > Constrains > Field. Данная операция создаст воздействие поля radialField_Wind на cloth1.
Выберите частицы particleWind, удерживая "Shift" выделите Cloth1 и выполните Dynamics > Particles > Make Collide. Выделите particleWind и в Channel Box в закладке INPUTS > geoConnector2 измените параметры:

Tessellation Factor - 200
Resilience - 0.5
Friction - 0.1


Переименуйте cloth1 на "flag".

Шаг 8.

Выберите Cloth > Simulation > Delete Cache и проиграйте анимацию. В зависимости от ресурсов Вашей машины расчет Cache может занять от 30 секунд до 3 минут для 300 кадров анимации.

Шаг 9.

При проигрывании Вы можете заметить, что флаг колышется достаточно нереально. Решить эту проблему можно варьируя параметры panel_Flag в Channel Box > OUTPUTS > cpSolver1. Наиболее действенными будут изменения параметров Solver Scale в пределах 1-50 и Gravity1 в пределах -100 - -900. На одним из наших компьютеров удачными оказались значения:

Time Step Size - 0.02
Solver Scale - 21
Gravity1 - -330


А при проверке данного урока на второй машине подошли значения

Solver Scale - 17
Gravity1 - -100


Послесловие.


Наиболее трудоемкой окажется именно удачная настройка этих двух параметров. Так же попробуйте изменить длину и ширину флага.
А теперь запаситесь терпением и вперед.

С уважением работники Агенства "АРКА"
Акманов Руслан, Гасымов Самир и Агаев Имран

17816 Автор:
Актуальность: 0
Качество: 0
Суммарный балл: 0
Голосов: 4 оценки

Отзывы посетителей:

аватар
 
Mark Nesterov 1 0
зачем так ломаться в максе это делается проше
аватар
 
shramic 5 0
здрасте ребята.
у меня таже малина,все делаю как написано, но до конца невиходит,немножко подував поломав голову и поменяв немножко параметры на глаз вроде получилось,спасибки работникоам Арки.
аватар
 
Vodi 5 0
Здравствуйте , делаю всё как написвно. НО получается частичы работают а флаг не колышится да же не повисает на флагштоке.
если создаю отдельный флаг ставлю все пораметры как у вас, то флаг повисает, но естественно без связеё не колышится.
Ч то мне делать?
Заранее благодарен.
Зарегистрируйтесь, чтобы добавить комментарий.
Эту страницу просмотрели: * уникальных посетителей