|

Имитация развевающегося флага
с помощью модуля 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
|
Послесловие.
Наиболее трудоемкой окажется именно
удачная настройка этих двух параметров. Так
же попробуйте изменить длину и ширину флага.
А теперь запаситесь терпением и вперед.
С уважением работники Агенства "АРКА"
Акманов Руслан, Гасымов Самир и Агаев Имран
|