Puteți crea o varietate de efecte cu sistemele de particule. În acest articol voi descrie o modalitate simplă de a le îmbunătăți prin adăugarea unor turbulențe. Voi începe cu un sistem de particule 2D pentru simplitate. Exemplele de coduri sunt în Javascript, dar sunt mai mult matematice, deci este ușor să le adaptați la orice altă limbă.
postări asemănatoareSă începem prin a face un sistem obișnuit de particule în 2D. Vom folosi sprite simple cu:
X
, y
.vx
, vy
.Pentru fiecare particulă, mai întâi actualizăm viteza. În acest caz, îl umezim puțin pentru a face mișcarea mai interesantă și mai realistă. Se pot aplica și forțe ca gravitatea sau vântul.
var amortizare = 1-0.005 this.vx * = amortizare this.vy * = amortizare
Apoi, actualizăm poziția folosind viteza. Vom folosi un pas de timp fix pentru acest tutorial. Dacă pasul dvs. de timp variază, va trebui să înmulțiți viteza cu delta dvs. de timp pentru a obține schimbarea poziției.
this.x + = this.vx this.y + = acest.vyv
Scalam particulele un pic pentru a simula infuzii de fum extinse.
this.scaleAll (1,01)
Reutilizăm particule în loc să le eliminăm și să le adăugăm, deoarece vrem să curgă constant aici:
this.life- = 1 dacă (this.life<=0) this.respawn(particleLifetime)
În cele din urmă, actualizăm transparența particulelor pentru a le estompeze în timp.
this.alpha = this.life / particleLifetime
respawn
metoda doar stabilește valorile inițiale ale particulei. De asemenea, este folosit pentru a popula sistemul de particule la pornire.
acest.x = jaws.width * (Math.random () * 0.1-0.15) this.y = jaws.height * (0.45 + Math.random () * 0.1) this.vx = Math.random 4 this.vy = (Math.random () + Math.random () + Math.random () - 1.5) * 2 this.life = durata de viață this.scaleTo (1)
Caracteristica definitorie a turbulenței este vorticitatea. Deci, modul simplu și direct de a simula turbulența este de a crea un obiect vortex care afectează mișcarea particulelor.
Să începem prin calcularea vitezei în vortex, ca și cum ar fi o roată solidă.
Viteza în punctul de pe roată. Imagine pe pneuri de Pearson Scott Foresman de la Wikimedia Commons.Mai întâi, avem nevoie de un vector de la centrul vortex la particula:
var dx = particula.x-vortex.x var dy = particle.y-vortex.y
Apoi rotim acel vector la 90 de grade pentru a face unul ortogonal și pentru a-l multiplica prin viteza de rotație a vortexului:
var vx = -dy * vortex.speed var vy = dx * vortex.speed
Excelent, avem viteza pe care vortexul încearcă să o forțeze asupra particulelor, dar cum o aplicăm?
Avem nevoie de un factor de ponderare care va fi 1 în centrul vortexului și va dispărea cu distanța.
Vom folosi această formulă ad-hoc, care se bazează pe distanța inversată pătrată, dar evită singularitatea în centru:
factorul var = 1 / (1+ (dx * dx + dy * dy) /vortex.scale)
Să aplicăm viteza de vârtej amestecând-o cu cea a particulelor:
particle.vx + = (vx-particle.vx) * factor particle.vy + + (vy-particle.vy) * factor
Asta e, acum avem un particule care afectează particulele!
Un singur vortex static este bun pentru a afla cum să-l aplicăm particulelor, dar vrem vartejuri multiple și dorim ca acestea să se deplaseze. Să le facem doar într-un alt sistem de particule (invizibil)! Deci, acum au și viteză și timp de viață. Asta va avea nevoie de câteva modificări la cod.
Când se calculează viteza în vortex, trebuie să adăugăm și mișcarea turbionară:
var vx = -dy * vortex.speed + vortex.vx var voi = dx * vortex.speed + vortex.vy
Și vrem ca vartejurile să se estompeze și să dispară fără să apară dintr-o dată, dintr-o dată, dintr-o dată în și din existență. Să aplicăm o curbă simplă factorului de ponderare:
var lifeFactor = vortex.life / vortexLifetime factor * = (1-lifeFactor) * LifeFactor * 4
În exemplul acestui tutorial, folosesc mai multe vârtejuri care se mișcă similar cu particulele, dar au o durată de viață mai mică. Cu toate acestea, mișcările vartejului în diferite moduri, precum și reglarea vitezei și gamei lor de rotație pot produce o mulțime de efecte diferite.
De exemplu, deoarece un vortex încearcă să transfere particule cu el, un vortex static va încerca să oprească particulele care zboară prin el și le va pune într-o turbionare. Puteți utiliza acest efect pentru a crea o zonă turbulentă care încetinește orice particule care intră în ea.
Puteți crea vortexuri atunci când un personaj se mișcă în joc sau când un obiect se sparge în pământ.
Strada Kármán vortex cauzată de vântul care curge prin insulele Juan Fernández de pe coasta chiliană. Imagine de Bob Cahalan de la Wikimedia Commons.Un efect comun de turbulență este străzile vortex care sunt ușor de recreat, de asemenea, pentru un obiect static în flux sau pentru un obiect în mișcare rapidă.
Puteți, de asemenea, să colizați vârtejurile cu mediul sau să le afectați mișcarea de caractere.
Nu am rotit particulele în exemplul respectiv. Este ușor de adăugat și îmbunătățește sistemul obișnuit de particule, dar poate fi îmbunătățit și mai mult prin utilizarea de vârtejuri. Doar amestecați viteza de rotație a particulelor cu vortexul, așa cum am făcut-o cu viteza liniară.
Puteți îmbunătăți mișcarea vortexului permițându-i să afecteze alte vortexuri, la fel ca și particulele.
Diferitele funcții de ponderare a vortexului pot produce rezultate diferite. Tocmai am folosit un grup ad-hoc care a lucrat pentru acest exemplu, dar ați putea găsi și alții mai potriviți pentru cazul dumneavoastră. Destul de mult se va distruge totul cu distanța de la centru.
Tehnica este ușor de folosit și în 3D. Utilizați vectori 3D pentru poziții și viteze (inclusiv viteza unghiulară a vortexului) și calculați viteza în vortex folosind produsul cruce:
Vector3 r = poziția particulelor-vortex.position; Vector3 v = Vector3.Cross (vortex.angularVelocity, r);
Desigur, nu este singura modalitate de a face turbulențe și nu singura modalitate de a face vortexuri. Să ne uităm la alții.
Folosim lista vârtejelor la nivelul sistemului de particule. Este destul de eficient, dar puteți stoca un vortex (sau mai multe) în fiecare particulă.
În timp ce are nevoie de mai multă memorie, îmbunătățește localizarea datelor și permite personalizarea mișcării particulelor chiar mai mult. Puteți randomiza virful un pic pentru fiecare particulă sau utilizați mai multe straturi de vârtejuri pentru a face sistemul de particule 2D să arate mai mult 3D.
În loc să stocheze lista de vârtejuri în sistemul de particule, poate fi făcută la nivel global. Aceasta economisește memoria și timpul de procesare a vortexurilor. De asemenea, este ușor să adăugați noi vârtejuri cauzate de mișcarea caracterului, să colizați vârtejurile cu mediul etc..
Puteți merge pe o cale mai realistă și puteți efectua o simulare fizică reală a fluxului. Probabil este prea greu pentru orice dimensiune moderată în 3D, fără procesarea GPU, dar destul de fezabilă în 2D. Există metode bazate pe grile (veți dori mai multe pentru rezoluție pentru performanță) și pe cele bazate pe particule. De asemenea, uită-te în adăugarea înapoi vorticit pierdut folosind zgomot, există documente despre asta.
În loc să faci o simulare fizică completă sau vortexuri asemănătoare particulelor, poți stoca vorticitatea într-o rețea. Păstrați viteze unghiulare și liniare și le propagați la fiecare pas de timp. Apoi, în sistemul de particule, eșantionați grila pentru a găsi viteza de vârtej care afectează particula.
Nu este la fel de realistă ca simularea fluidului, dar este mult mai rapidă, deoarece nu este nevoie să rezolvați ecuații de presiune de rețea, să propagați și să umezi vitezele.
Dacă doriți doar o mulțime de turbulențe haotice fără vîrtej pronunțat ("bubble"), folosirea zgomotului procedural ar putea fi o idee mai bună. Căutați perlin sau zgomot simplu. Veți avea nevoie de o dimensiune suplimentară pentru a putea anima zgomotul. Deci, pentru 2D veți avea nevoie de zgomot 3D derulat în cea de-a treia dimensiune cu timpul și zgomot 4D pentru 3D.
Puteți încerca zgomotul de mai multe ori la unele compensări fixe pentru a obține componente ale forței care afectează particula.
Acum puteți îmbunătăți efectele particulelor prin adăugarea unui sistem secundar de particule vortex. Imaginați-vă o explozie provocată de o rachetă care forțează fumul din apropiere să se învârte în jurul razei exploziei sau se lasă să se învârte în timp ce plutesc pe un râu. Experimentați modul în care faceți apariția și deplasați vîrtejurile pentru a obține efectul dorit sau pentru a descoperi ceva nou!