1. Какво е Particle Flow ?

     Според описанието към MAX-a това е система от Event-based particles, т.е. частици, реагиращи на събития. Общо взето, измененията в частиците не се задават с ключови кадри, а със събития - задаваш закона (какво да правят частиците), дефинираш събитието и това е - когато настъпи събитието, тогава се изменят частиците. По този начин не се ангажираме с времето (в смисъл на ключови кадри). 

      На всеки се е случвало (предполагам) да направи сложна система частици и след време да се наложи да промени нещо в нея (взривът да почва 10 кадъра по- късно, например). Това налага преместването на доста параметри 10 кадъра напред, и то не само на една система частици. ParticleFlow ни избавя от тези неудобства - при една добре дефинирана система ParticleFlow единственото, което е нужно да се промени в горния пример, е инициатора на взрива да се удари във взривявания обект 10  кадъра по- късно. 

     В този урок ще разгледам пример за създаване на дъжд. При удар в земята капките ще образуват вълнички , ще се пръскат на по- малки капчици, които ще отскачат и при удара в земята ще образуват по- малки концентрични вълнички.

 

Нека направим алгоритъм на системата:


2. Създаване на началните частици.

 

     Създаваме обикновено Plane, което ще играе ролята на земя и  от което ще отскачат частиците. Създаваме дефлектор (Create Panel -> Space Warps -> Deflectors -> UDeflector) и в неговите Basic Parameters -> Object-Based Deflector -> Item: избираме Plane01. Няма значение къде в сцената се намира иконката на UDeflector, т.е. може да я отместим извън работната площ, но е удобно да е на едно ниво с Plane-то,  и да е по- толяма, за да се вижда добре в страничните изгледи

     От Create Panel -> Geometry -> Particle System -> PF Source, с влачене си създаваме подходящ по големина емитер. Наместваме го на нужната височина в сцената. Стрелката на иконата определя посоката на движението на частиците.  Ако преместим слайдера на времето напред, ще видим падащите от Емитера частици.

     От Graph Editors -> ParticleView  (или shortcut " 6 ") отваряме екрана за настройка.

     Най голямата площ е на работното пространство, в което  се създават събитията и тестовете. Вдясно е полето за настройки на избрания обект (оператор, тест). Най- долу е депото за оператори и тестове.

     В нашия случай имаме един обект ( PF Source 01) и едно събитие (Event 01). Ако селектираме PF Source 01, вдясно ще се появят неговите настройки. Събитието Event 01 по подразбирне има няколко оператора (Birth, Position Icon, Speed, Rotation, Shape и Display). При избиране на някой от тези оператори, в дясната лента се появяват настройките му.

     Оператора Birth управлява създаването на частиците и е аналогичен на опциите на стандартните емитери. Нека  за примера му зададем Emit Start = -20 (цифрата във вашия случай може да бъде друга, идеята е в кадър 0 да имаме вече падащи капки ), Emit Stop = 50 ( за илюстрация на работата на PFlow 50 кадъра са достатъчни, но за сериозна сцена с дъжд - по ваше усмотрение), Rate = 10 (за проверка на алгоритъма е добре да са по- малко частиците, за да могат да се следят; след като сме се убедили във верността на законите, ще ги  увеличим - в моята сцена изглеждат добре при Rate = 800, но това зависи и от площта, която ще покрива нашия дъжд).

     Оператора Position Icon определя от коя част на Емитера (на иконата) ще се отделят частиците - от целия обем, по оста, по ръбовете и т.н.  В нашия случай най- подходящо е Volume. Опцията Lock on Emitter  "заключва" частиците за иконата, а Inherit Emitter Movement определя дали движението на Емитера ще влияе на излъчваните от него частици (  !!! Ако по-надолу в операторите има оператор         Speed,  той определя движението на частиците, а  Inherit Emitter Movement губи значение).

Оператора Speed определя скоростта ( в единици за секунда )  и посоката на движение  на частиците. За случая  - Speed = 300, var = 10, Direction = Along Icon Arrow

Експериментирайте с движещ се ( въртящ се)  Емитер и различни направления.

 

     Оператора Shape  определя формата на частицата. За конкретниа случай - Shpere, с големина - в зависимост от големината на сцената.  Ако частиците ни са ято птици, или паяци, е удачно за задаване на формата да се използва Shape Instance, а за илюстрация  на работата му ние ще го използваме по-нататък за задаване формата на вълничките.

     Последния оператор в тека на нашето събитие е Display, който определя (каква изненада !) в какъв вид да се изобразяват частиците на екрана. Дали като Geometry (тогава ще се рисуват в зависимост от зададеното в Shape), дали като Ticks, Dots, Lines.....при сложен алгоритъм на поведение често външния вид е единственото нещо, по което можете да разберете дали е изпълнено някое условие (дали всъщност работи вашият алгоритъм), така че за всяко Event задавайте различен външен вид и цвят на частиците.

     Формата на частицата при рендер зависи от само от зададеното в Shape, а оператора Display определя само изгледа.

     След това описание на създаването на частиците можем да преминем към


3. Създаване на събития и тестове.

3.1. Създаване на пръски.

     За начало, нека направим така, че частиците да се разбиват на по-малки пръски  в Дефлектора. Обяснено като за ParticleFlow : пада една частица, когато се удари в дефлектора, от нея се генерират няколко по-малки частици, което отскачат.

     Значи, трабва ни тест за удар (колизия - collision). Поглеждаме в депото (долу) и виждаме два теста - Collision  и Collision Spawn. Първият само регистрира удара, без да прави нищо  и ако използваме него, трябва да създадем и нов оператор Spawn за отскачащите частици.  Вторият вариант - Collision Spawn, създава дъщерни частици при удар в дефлектора.

Чрез влачене и пускане добавяме оператора Collision Spawn в Event 01, точно под  Display 01.

     Указваме дефлектора в сцената - чрез Add и избирането му в изгледа или чрез  By List   и избирането му от списъка с дефлектори (ако има повече от един). Ако сега преместим плъзгача на времето напред, ще видим, че частиците се отразяват от  Plane01 и отскачат нагоре.

Нека настроим оператора Collision Spawn:

- трябва ни да регистрира само първата колизия, затова отбелязваме Spawn on First Collision;

- всяка частица да се разбие на 4 дъщерни (примерно), затова:  Spawnable = 100%, Offspring = 4, Variation = 20% (използвайте вариации - в природата няма точни неща);

- полезно е да се отметне Restart Particle Age, за да се брои възрастта на новосъздадените частици от момента на удара, а не от момента на създаването на родителската частица (от Емитера)

       в графата Size ностройваме ScaleFactor = 50%, var =10% (с което правим новосъздадените частици наполовина на размера на родителските);

       в графата Speed може да се настрои скоростта и разсейването, но по- добре това да се направи с външен оператор.

Drag-&-Drop оператора Speed някъде в празното поле.

     Създава се събитие Event 02 с  оператори Speed 02  и  Display 02.

     Нека свържем теста за колизия с новото събитие - кликваме върху синята точка вляво на теста (курсорът приема формата на кръгче, с четири стрелки, сочещи навътре) и влачим до кръгчето в горния ляв край на Event 02.  Появява се свързваща стрелка.

     Сега вече свързахме събитието Event02 към теста за колизия - т.е. "когато една частица се удари в дефлектора, да се генерират нови частици (както е указано в настройките на Collision Spawn) и новите частици да се управляват така,  както е указано в Event 02".

     Ако сега преместим слайдера на времето, ще видим,  че новите частици не отскачат от Дефлектора, а преминават през него, като само си променят цвета и формата, съобразно Display 02.  Тази промяна показва всъщност, че теста работи правилно (т.е. открива колизии), но е необходимо да дефинираме движението на новосъздадените частици. Ако визуалната разлика преди и след колизията не е ясно видима, настройте Display 02 с цвят и форма, доста различни от цвета и формата в Display 01.

     В опциите на оператора  Speed 02 настройте Direction = Along Icon Arrow; Reverse (с което новите частици тръгват нагоре), Divergence = 60 (примерно) - разсейка; Speed = 200, var = 30 %.

   Да добавим и гравитация:

     От Create Panel -> Space Warps -> Forces -> Gravity създаваме обект Гравитация. От депото за оператори добавяме Force 01(между Speed 02 и  Display 02) и указваме създадената Гравитация. Сега вече новите частици се влияят от гравитацията. Настройваме силата на гравитацията или от обекта Gravity01 -> Strength,  или от ParticleView -> Force01 (Gravity01) -> Influence.

     До момента нашето ParticleView изглежда така:

     Ако силата на гравитационния обект (Gravity01) е анимирана (това важи за която и да е сила),  от ParticleView -> Force01 (Gravity01) -> Offset Influence: By:   може да се синхронизира анимацията или глобално (Absolute) или според възрастта на частиците ( by Particle Age)  или според настърване на събитието (by Event Duration)

     Ако е нужно (в друга ситуация) частиците да променят формата си при удара, се добавя в Event02 оператор Shape. Ако не се добави, новите частици наследяват формата на родителските.

     Панелите на събитията могат да се преместват  и подреждат, като се хванат за заглавната лента (сивото поле, ако не сте променяли UI-scheme). Също така с десен клик върху заглавната лента излизат доста опции, които улесняват живота. Rename е едно от тях - променете името на Event 01  на "Create Rain", името на Event 02  на "Create Splashes" (или каквото и да е по ваше усмотрение).

3.2. Създаване на концентрични вълни.

     При удар в Дефлектора (т.е. при колизия), освен отскачането на пръски, трябва да се появяват и концентрични вълни, които да увеличават размера си и да изчезват. Удобно е тези вълнички да се представят с частици - Planes, с радиален градиент в бъмп-мапа.

(Т.е. понеже ще се работи с огромно количество "вълнички", които се застъпват, малки са по размер  и изчезват бързо, няма смисъл да се използва сложна геометрия - по един полигон с бъмп карта е достатъчно)

     Нека създадем някъде извън полезрението едно Plane с квадратни произволни размери. Това ще бъде нашият еталон- образец  за "вълничка". За да се увеличава и после да намалява размера на вълничките, ще анимираме размера на еталона. При включен режим на анимиране ( "N") в кадър 0 задаваме размер 2.0 х 2.0 (начален размер), в кадър 5 - 12х12 (максимум), и в кадър 15 - 0.1х0.1 (изчезва).

     Понеже ще ползваме Instance geometry, от депото хващаме оператора Shape Instance и го тръшваме на празно място в работното поле. Ако няма такова място - сега е момента да попреместите вече създадените събития, или да помислите за по- голям монитор. Току-що създадохме още едно събитие  (Event 03, което може да го преименувате на "Big Ripples").

     Селектирайте оператора Shape Instance и  му задайте като Particle Geometry Object = Plane02 (ако няма своеволия, Plane 01 е "земята", така че анимирания ни полигон е Plane 02). Уверете се, че са включени отметките Acquire Mapping, Acquire Material, Animated Shape (т.е. частиците да ползват мапинга, материала и анимацията на нашия "образец").  За да се съгласуват правилно анимацията на размера със създаването на частицата, трябва   Animation Offset Keyind - Sync by: Event Duration. Така анимацията на размера ще започне от момента на създаването на частицата.

     Оператора Display го настройте да показва Geometry (т.е. реалната геометрия - в случая - променящите размера си полигони), в някакъв неизползван досега цвят, за по- ясна визуална представа.

Ако се опитаме сега да свържем ползвания тест за колизия (Collision Spawn 01) с новото събитие,  ще видим, че се създава връзка (синята стрелка), но се премахва връзката между теста и Event 02 (създаването на пръските).

Явно е, че един тест може да породи само едно събитие, и затова след Collision Spawn  добавяме нов тест Collision. В неговите настройки указваме Дефлектора, а също и че при удара частицата трябва да спре (Test True Is Particle -> Collides -> Speed = Stop). Ако на същото място се укаже Continue,  то нашите вълнички ще продължат да падат под Дефлектора. 

     Ако разгледаме добре направеното до тук

ще видим, нашите "вълнички" са всъщност първоначалните (родителските) частици. След първия тест и генерирането на пръските,  те преминават втория тест, и понеже са в момента в колизия, изпълняват условието и попадат в Event 03 (Big Ripples). Това е смисълът при Collision Spawn 01  да не се отмята Delete Parent. След изпълняването на 15-те кадъра анимация (вълничката), те остават да съществуват, с размер, даден в последния кадър на анимацията (в нашия случай – практически невидими). Реално "полезният" живот на една такава частица е равен на [времето за достигане до Дефлектора] + [времето на анимацията на размера].  В моята сцена (времето на падане  зависи от височината, на която е разположен емитера и от скоростта на частиците), това е ~ 20 + 15 = 30. Ако оставим и няколко кадъра застраховка, можем да приемем за живот на родителските частици 40 кадъра..

     Представете си при продължителен проливен дъжд колко такива "баластни" частици ще тежат на сцената, и ще се изчисляват на всеки кадър, след като са изпълнили ролята си.  Затова добавяме оператор Delete, в който указваме да се трият по възраст - Remove By Particle Age -> Life Span = 40.

     Малките частици (пръските) също трябва да образуват малки вълнички. Вместо да се прави цялото събитие отначало, по- добре да се копира. Избираме заглавната лента на Event 03 (Big Ripples), така, че тя става бяла, десен клик ->Copy, десен клик върху празно място -> Paste. Може да го преименувате в "Little Ripples", а също така да настроите различни параметри на Display - форма и цвят.

     Така копираното събитие не е свързано с нищо.  Трябва в събитието Event 02 (Creating Splashes) да добавим тест за удар в дефлектора и да го свържем с копираното събитие Little Ripples. Направете го сами. Също така, не е логично, толкова малки капки да вдигат толкова големи вълнички. Променете размера на малките вълнички да бъде 45% от оригинала.

За финал имаме тази напълно коректно работеща, самоуправляема система частици:

Ако се наложи приспособявае на "установката" към друга по размер сцена, се променят само:

- размера на Емитера и броя генерирани частици;

- размера на Дефлектора (по- точно, присвоява му се новата геометрия);

- размера на образеца за концентричните вълни (от анимацията) и  (или) дължината на анимацията;

- стойностите в Delete (By Age) = (време на падане)+(времето на анимацията)+(няколко кадъра резерва)

----------

общо време за промяна - под 1 минута. ;-))

 

Христо Христов

3DBG 2004©