|
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© |
| |
| |
| |