by Luca Sorace 1910722
⚠️⚠️⚠️⚠️⚠️⚠️⚠️
⚠️⚠️⚠️⚠️⚠️⚠️⚠️
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:
- spesso la distanza normalizzata
D
viene remappata attraverso una sigmoid function in modo da rendere non lineari tutte le proporzioni
- All’angolo di rotazione
A
viene aggiunto un angolo casuale più grande se più vicino al centro
- La dimensione del vettore
V
viene aumentata o diminuita più si è vicini al centro, in modo di avere le particelle più “interne” che girino più in fretta delle esterne
.\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:
- Le particelle, al posto di convergere verso il centro, convergono tutte ad una determinata distanza dal centro. Ciò è ottenuto aggiungendo uno step ulteriore di normalizzazione alla distanza già normalizzata
D
: più si è vicini alla distanza dal centro che rappresenta la dimensione del nostro tornado, e più la distanza è prossima allo zero. Più ci si allontana in entrambi le direzioni e più aumenta.
- Se la particella si trova all’interno del tornado, allora la rotazione
A
viene invertita di 180 gradi per farla girare insieme alle particelle esterne
- Viene casualmente aggiunta una velocità che spinge le particelle verso l’alto, per dare l’effetto tridimenzionale al tornado
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”
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:
incertHeightMax
venga applicata alle particelle di un vorticesize
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 dimensionesize
ed una particellaP
.Inizia col calcolare la distanza
D
traP
eC
. Se è <= asize
allora procede normalizzandola rispetto asize
. Successivamente calcola il vettoreV
per fare spostareP
suC
comeV = C - P
. Viene calcolato l’angoloA
di rotazione diV
proporzionalmente alla distanza normalizzataD
, 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’angoloA
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:
D
viene remappata attraverso una sigmoid function in modo da rendere non lineari tutte le proporzioniA
viene aggiunto un angolo casuale più grande se più vicino al centroV
viene aumentata o diminuita più si è vicini al centro, in modo di avere le particelle più “interne” che girino più in fretta delle esterne.\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:
D
: più si è vicini alla distanza dal centro che rappresenta la dimensione del nostro tornado, e più la distanza è prossima allo zero. Più ci si allontana in entrambi le direzioni e più aumenta.A
viene invertita di 180 gradi per farla girare insieme alle particelle esterneAppunti 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”