È possibile creare una varietà di effetti con i sistemi di particelle. In questo articolo descriverò un modo semplice per migliorarli aggiungendo qualche turbolenza. Inizierò con un sistema di particelle 2D per semplicità. Gli esempi di codice sono in Javascript, ma sono per lo più matematici, quindi è facile adattarli a qualsiasi altra lingua.
Post correlatiIniziamo creando un sistema particellare regolare in 2D. Useremo semplici folletti con:
X
, y
.vx
, vy
.Per ogni particella, aggiorniamo prima la velocità. In questo caso, lo smorziamo un po 'per rendere il movimento più interessante e realistico. Anche qui forze come la gravità o il vento possono essere applicate.
var damping = 1-0.005 this.vx * = smorzamento this.vy * = damping
Quindi, aggiorniamo la posizione usando la velocità. Useremo un passo temporale fisso per questo tutorial. Se il tuo passo temporale varia, dovrai moltiplicare la velocità in base al delta temporale per ottenere il cambio di posizione.
this.x + = this.vx this.y + = this.vy
Ridimensioniamo le particelle un po 'per simulare l'espansione dei fumi.
this.scaleAll (1.01)
Riutilizziamo le particelle invece di rimuoverle e aggiungerle poiché vogliamo qui un flusso costante:
this.life- = 1 if (this.life<=0) this.respawn(particleLifetime)
Infine, aggiorniamo la trasparenza delle particelle per attenuarle nel tempo.
this.alpha = this.life / particleLifetime
Il respawn
il metodo imposta solo i valori iniziali per la particella. È anche usato per popolare il sistema di particelle all'avvio.
this.x = jaws.width * (Math.random () * 0.1-0.15) this.y = jaws.height * (0.45 + Math.random () * 0.1) this.vx = Math.random () * 2+ 4 this.vy = (Math.random () + Math.random () + Math.random () - 1.5) * 2 this.life = life this.scaleTo (1)
La caratteristica che definisce la turbolenza è la vorticità. Quindi il modo semplice e diretto per simulare la turbolenza è creare un oggetto a vortice che influenzi il movimento delle particelle.
Cominciamo calcolando la velocità nel vortice, come se fosse una ruota solida.
Velocità nel punto della ruota. Immagine ruota di Pearson Scott Foresman di Wikimedia Commons.Innanzitutto, abbiamo bisogno di un vettore dal centro del vortice alla particella:
var dx = particle.x-vortex.x var dy = particle.y-vortex.y
Quindi ruotiamo quel vettore di 90 gradi per fare uno ortogonale e moltiplicarlo per la velocità di rotazione del vortice:
var vx = -dy * vortex.speed var vy = dx * vortex.speed
Grande, abbiamo la velocità con cui il vortice sta cercando di forzare le particelle, ma come applicarlo?
Abbiamo bisogno di un fattore di ponderazione che sarà 1 al centro del vortice e si dissolverà con la distanza.
Useremo questa formula ad-hoc, che si basa sulla distanza quadrata inversa, ma evita la singolarità al centro:
fattore var = 1 / (1+ (dx * dx + dy * dy) /vortex.scale)
Applichiamo la velocità del vortice mescolandola con quella della particella:
particle.vx + = (vx-particle.vx) * fattore particle.vy + = (vy-particle.vy) * fattore
Ecco, ora abbiamo un vortice che colpisce le particelle!
Un singolo vortice statico è utile per capire come applicarlo alle particelle, ma vogliamo più vortici e vogliamo che si spostino. Facciamolo solo in un altro (invisibile) sistema di particelle! Quindi, ora hanno anche velocità e tempo di vita. Ciò richiederà alcune modifiche al codice.
Quando calcoliamo la velocità nel vortice, dobbiamo aggiungere anche il movimento del vortice:
var vx = -dy * vortex.speed + vortex.vx var vy = dx * vortex.speed + vortex.vy
E vogliamo che i vortici si dissolvino in entrata e in uscita senza intoppi, non solo pop improvvisamente dentro e fuori dall'esistenza. Applichiamo una curva semplice al fattore di ponderazione:
var lifeFactor = vortex.life / vortexLifetime factor * = (1-lifeFactor) * lifeFactor * 4
Nell'esempio di questo tutorial, sto usando diversi vortici che si muovono simili alle particelle ma hanno una durata un po 'più breve. Tuttavia, lo spostamento di vortici in modi diversi, nonché la regolazione della velocità e dell'intervallo di rotazione, può produrre una pletora di effetti diversi.
Ad esempio, dal momento che un vortice tenta di spostare particelle con esso, un vortice statico tenterà di bloccare le particelle che lo attraversano e le metterà in un vortice. Puoi usare questo effetto per creare un'area turbolenta che rallenta le particelle che entrano in esso.
Puoi creare vortici quando un personaggio si muove nel gioco, o quando un oggetto si schianta nel terreno.
Kármán vortice di strada causata dal vento che scorre intorno alle isole Juan Fernández al largo della costa cilena. Immagine di Bob Cahalan di Wikimedia Commons.Un effetto di turbolenza comune è Vortex Street che è facile da ricreare, per un oggetto statico nel flusso o per un oggetto in rapido movimento.
Puoi anche scontrare i vortici con l'ambiente o lasciarli influenzare dal movimento del personaggio.
Non ho ruotato le particelle nell'esempio. È facile da aggiungere e migliora il normale sistema di particelle, ma può essere ulteriormente migliorato utilizzando i vortici. Basta mescolare la velocità di rotazione delle particelle con il vortice come abbiamo fatto con la velocità lineare.
Puoi migliorare il movimento del vortice lasciando che altri vortici lo influenzino, proprio come accade con le particelle.
Diverse funzioni di ponderazione del vortice possono produrre risultati diversi. Ho appena usato uno ad hoc che ha funzionato per questo esempio, ma potresti trovare altri più adatti al tuo caso. Praticamente tutto ciò che svanisce con la distanza dal centro lo farà.
La tecnica è facile da usare anche in 3D. Usa vettori 3D per posizioni e velocità (inclusa la velocità angolare del vortice) e calcola la velocità nel vortice usando il prodotto incrociato:
Vector3 r = particle.position-vortex.position; Vector3 v = Vector3.Cross (vortex.angularVelocity, r);
Certo, non è l'unico modo per fare turbolenze e non l'unico modo per fare i vortici. Diamo un'occhiata ad alcuni altri.
Stavamo usando l'elenco dei vortici a livello del sistema di particelle. È abbastanza efficiente, ma è possibile memorizzare un vortice (o più) in ogni particella.
Mentre ha bisogno di più memoria, migliora la localizzazione dei dati e consente di personalizzare ulteriormente il movimento delle particelle. Puoi randomizzare il vortice un po 'per ogni particella o utilizzare diversi strati di vortici per rendere il sistema di particelle 2D più 3D.
Invece di memorizzare l'elenco dei vortici nel sistema di particelle, può essere reso globale. Ciò consente di risparmiare memoria e tempo di CPU durante l'aggiornamento dei vortici. È anche facile aggiungere nuovi vortici causati dal movimento dei personaggi, si scontrano i vortici con l'ambiente ecc.
Puoi seguire un percorso più realistico e fare una simulazione fisica reale del flusso. È probabilmente troppo pesante per qualcosa di dimensioni moderate in 3D senza GPU computing, ma abbastanza fattibile in 2D. Esistono metodi basati sulla griglia (vorrai quelli multi-risoluzione per le prestazioni) e quelli basati su particelle. Inoltre, cerca di aggiungere la vorticosità persa usando il rumore, ci sono documenti su questo.
Invece di eseguire una simulazione fisica completa o vortici simili a particelle, è possibile memorizzare la vorticità in una griglia. Memorizza le velocità angolari e lineari e le propaghi su ogni fase temporale. Quindi, nel tuo sistema di particelle, campiona la griglia per trovare la velocità del vortice che influenza la particella.
Non è realistico come la simulazione dei fluidi, ma è molto più veloce poiché non hai bisogno di risolvere equazioni di pressione a griglia piena, basta propagare e smorzare le velocità.
Se vuoi solo molta turbolenza caotica senza vortici pronunciati ("bubbling"), usare il rumore procedurale potrebbe essere un'idea migliore. Cerca Perlin o rumore simplex. Avrai bisogno di una dimensione extra in modo da poter animare il rumore. Quindi per il 2D avrai bisogno del rumore 3D che scorre nella terza dimensione con il tempo e del rumore 4D per il 3D.
Puoi campionare il rumore più volte con alcune correzioni fisse per ottenere componenti della forza che influenzano la tua particella.
Ora puoi migliorare i tuoi effetti particellari aggiungendo un sistema secondario di particelle vortex. Immagina un'esplosione causata da un razzo che costringe il fumo nelle vicinanze a girare intorno al raggio dell'esplosione, o le foglie che turbinano mentre galleggiano lungo un fiume. Sperimenta come generare e spostare i vortici per ottenere l'effetto desiderato o scoprire qualcosa di nuovo!