CG HW4: Extra credit

by Luca Sorace 1910722

⚠️⚠️⚠️⚠️⚠️⚠️⚠️

⚠️ NOTA: Tutti gli extra credit funzionano solo con il simulatore PBD

⚠️⚠️⚠️⚠️⚠️⚠️⚠️

Ecco la lista di parametri aggiunti al programma:

Nome valore Tipo Range di accettazione Descrizione
windHeight float 0 - +inf Altezza massima del vento. Tutte le particelle sopra questa altezza non saranno soggette alla forza del vento
windRand{X, Y, Z} float -inf - +inf Forza massima del vento che viene aggiunta alle particelle in maniera randomica
windFixed{X, Y, Z} float -inf - +inf Forza costante del vento che viene aggiunta sempre ad alle particelle
blackHoleEnabled boolean - Attiva l’effetto blackhole
vortexEnabled boolean - Attiva l’effetto vortice
size float 0 - +inf Estensione massima del blackhole/vortice
convergenceVelocity float 0 - 1 Velocità con cui le particelle vengono risucchiate all’interno del vortice/blackhole
vortexSpin float 0 - +inf Velocità con cui le particelle girano all’interno del vortice/risucchio del blackhole
gravityAmplifier float 0 - +inf Moltiplicatore della gravità del buco nero/vortice
incertRotationMax flaot 0 - 180 Angolazione massima che viene applicata randomicamente in proporzione inversa con la distanza dal centro del blackhole/vortice alle particelle
incertHeightMax float 0 - +inf Spinta massima verso l’alto che viene applicata randomicamente in proporzioben inversa con la distanza dal centro del vortice alle particelle
incertHeightProbability flaot 0 - 1 Probabilità che incertHeightMax venga applicata alle particelle di un vortice
midCircleRatio float 0 - 1 Grandezza dell’anello di un vortice in percentuale alla sua size
center{X, Y, Z} float -inf - +inf Centro del buco nero/vortice
bounceRatio float 0 - 1 Dispersione della velocità dopo che una particella rimbalza contro un ostacolo

Vento PBD

Viene precalcolata la forza del vento prima del loop principale del PBD sulle shape. Tale forza viene aggiunta alla velocità di una singola particella solo se essa si trova sotto una determinata altezza (A scelta dell’utente)


.\bin\yparticle.exe --scene tests/03_cloth/cloth.json --frames 250 --solver position_based --windHeight 0.15 --windRandX 5 --windRandY 2 --windRandZ 25 --windFixedX 0 --windFixedY 0 --windFixedZ 10 --output “out/position_based/wind_250.jpg”

Rimbalzi PBD

Ogni volta che una particella ha una collisione, la propria velocità viene cambiata con reflect() sulla normale della superficie con cui abbiamo colliso. Tale velocità viene applicato un valore minore di 1, per far si che ad ogni rimbalzo la particella perda un po’ di velocità.


.\bin\yparticle.exe --scene tests/02_particles/particles.json --frames 35 --solver position_based --bounceRatio 0.9 --output “out/position_based/bounce_ratio0-9_150.jpg”

Buco nero PBD

L’algoritmo “base” per l’animazione di un buco nero prende in input il centro C del suddetto, la sua dimensione size ed una particella P.
Inizia col calcolare la distanza D tra P e C. Se è <= a size allora procede normalizzandola rispetto a size. Successivamente calcola il vettore V per fare spostare P su C come V = C - P. Viene calcolato l’angolo A di rotazione di V proporzionalmente alla distanza normalizzata D, con un massimo di 90°, in modo da fare girare più “in cerchio” le particelle esterne al buco nero e far “attrarre” di più verso il centro le particelle più vicine. Infine giriamo il vettore a seconda dell’angolo A e impostiamo quest’ultimo come velocità della particella (MA sommato in proporzione alla velocità “originale” della particella: più siamo lontani dal centro del buco nero e più la velocità originale della particella virne preservata).

Questa è solo la base dell’algoritmo. Alla fine ho dovuto modificare qualche cosina per farlo sembrare più reale:


.\bin\yparticle.exe --scene tests/01_particles/particles.json --frames 150 --solver position_based --blackHoleEnabled --output “out/position_based/blackHole_Default_150.jpg”


.\bin\yparticle.exe --scene tests/01_particles/particles.json --frames 150 --solver position_based --blackHoleEnabled --centerY 0.04 --output “out/position_based/blackHole_Default_CenterY0-04_150.jpg”

Tornado PBD

Ho notato che molti altri studenti, per realizzare un tornado, hanno banalmente fatto girare orizzontalmente le particelle in cerchio, oppure le hanno spinte tutte verso “fuori” (ergo in un unica direzione) creando un anello ai margini. Entrambi le soluzioni però portavano a risultati che non mi soddisfacevano: un tornado è si un anello, ma che risucchia tutto ciò che gli sta sia dentro che fuori (quindi da entrambe le direzioni). Per ottenere tale risultato ho implementato prima il buco nero nel paragrafo superiore, e successivamente il tornado come “derivazione” del suo algoritmo. Sia buco nero che tornadi sono comunque stati realizzati ad intuito e senza reference. Spero di avere avuto delle buone idee

L’algoritmo dietro la generazione dei tornadi è quindi lo stesso per i buchi neri, con alcune differenze:


Appunti che ho preso mentre pensavo all’algoritmo. Si notano i calcoli per la seconda normalizzazione e la direzione delle partice base alla vicinanza all’anello interno su cui gira il ciclone


.\bin\yparticle.exe --scene tests/01_particles/particles.json --frames 150 --solver position_based --vortexEnabled --centerY 0.04 --output “out/position_based/vortex_Default_CenterY0-04_150.jpg”