by Luca Sorace 1910722
Ecco la lista di parametri aggiunti al programma:
Nome valore |
Tipo |
Range di accettazione |
Descrizione |
scale |
float |
0 - +inf |
Cambia la scala del rumore dentro terrain, displacement e hair |
height |
float |
0 - +inf |
Definisce l’altezza massima dei vertici che spostiamo casualmente dentro terrain e displacement |
u |
float |
0 - 1 |
Controlla il parametro u del voronoise dentro terrain e displacement, ovvero la quantità di jitter nella griglia del noise. Più è vicino ad 1 e più la griglia usata sarà quella del Voronoi, più è vicino a 0 e più la griglia usata sarà quella del Noise |
v |
float |
0 - 1 |
Controlla il parametro v del voronoise dentro terrain e displacement, ovvero la “smoothness” del noise/voronoi |
cellSize |
float |
0 - +inf |
Controlla il parametro cell_size di make_hash_grid() , usato per il sample elimination dentro hair |
radious |
flaot |
0 - +inf |
Controlla il raggio entro il quale altri sample vengono considerati vicini al sample corrente, usato per il sample elimination dentro hair |
alpha |
float |
0 - +inf |
Esponente usato nel calcolo dei pesi dei sample, usato per il sample elimination dentro hair |
terrainAlgorithm |
String |
base, voronoise |
Scegli l’algoritmo di noise da utilizzare dentro terrain |
displacementAlgorithm |
String |
base, voronoise, smoothVoronoi, cellNoise |
Scegli l’algoritmo di noise da utilizzare dentro displacement |
hairAlgorithm |
String |
base, sampleElimination |
Scegli l’algoritmo di noise da utilizzare dentro hairAlgorithm |
grassAlgorithm |
String |
base |
Scegli l’algoritmo di noise da utilizzare dentro grassAlgorithm |
Voronoise (Facile)
Voronoise è un algoritmo che combina le prioprietà di Voronoi e del Noise normale ed è utilizzato per nascondere gli artefatti della griglia alla “base” del normale Noise
Reference
https://www.iquilezles.org/www/articles/voronoise/voronoise.htm
Immagini
--terrainAlgorithm voronoise --u 1 --v 0 --scale 100 --height 0.0625
--terrainAlgorithm voronoise --u 1 --v 0.625 --scale 100 --height 0.0625
--displacementAlgorithm voronoise --u 0 --v 0
--displacementAlgorithm voronoise --u 0 --v 1
--displacementAlgorithm voronoise --u 1 --v 0
--displacementAlgorithm voronoise --u 1 --v 1
Cellnoise (facile)
Con l’algoritmo di Voronoi normale le diverse celle sono separate in maniera irregolare. Cellnoise risolve questo problema, rendendo quella separazione sempre della stessa dimensione
Reference
https://www.iquilezles.org/www/articles/voronoilines/voronoilines.htm
Immagini
Smooth Voronoi (facile)
Elimina la discontinuità e quelle linee “dure” che separano le varie celle del Voronoi, creando una funzione simile a min()
(Usato, appunto, dentro il Voronoi), ma che sia effettivamente una funzione continua
Reference
https://www.iquilezles.org/www/articles/smoothvoronoi/smoothvoronoi.htm
Immagini
Sample elimination (medio)
Se dovessimo generare casualmente nella maniera “classica” un set di sample, arriveremmo ad avere dei punti “molto vicini” tra di loro, ed altri “molto distanti”. Un modo per uniformare e rendere “più ordinata” la generazione randomica di questi punti è quella di utilizzare i dischi di Poisson, che servono appunto per generare sample circa equidistanti tra di loro. Il sample elimination è un modo molto veloce per generare dischi di Poisson.
Algoritmo
- Si generano
max(N * 5, 10000)
sample S, dove N è il numero di sample finale che vogliamo ottenere e 10000 è un numero arbitrario di sample minimo (Poiché il sample elimination funziona male se abbiamo pochi sample di partenza)
- Si costruisce un hashgrid sui sample S
- Si calcola il peso di ogni sample:
- Per ogni sample Si, si trovano tutti i vicini in un certo raggio
- Per ogni vicino Vj, si calcola il peso Pj tra Si corrente e Vj in base alla distanza tra i due, usando la formula:
pow(1 - distance(Vj, Si) / (2 * influence_radius), aplha)
- Il peso P di Si è uguale alla somma di tutti i Pj
- Si costruisce un heap su S utilizzando i vari pesi P
- Finché
S.size()
è maggiore di N:
- Si prende ed elimina il primo elemento E0 dell’heap (Che sarà il più pesante)
- Si trovano tutti i vicini V
- Per ogni vicino Vj, si calcola analogalmente a prima il peso Pj tra Vj e E0, infine si sottrae Pj dal peso P di Vj (Effettivamente rimuovendo il peso dell’elemento che eliminiamo dai vicini)
- Si aggiorna l’heap con i nuovi pesi
- Si riaggiorna la lista di sample S prendendo i primi N elementi dall’heap
Reference
http://www.cemyuksel.com/research/sampleelimination/sampleelimination.pdf
http://www.cemyuksel.com/cyCodeBase/soln/poisson_disk_sampling.html
Immagini
A sinistra, normale sample shape con 500 sample, a destra sample elimination con 500 sample finali e 2500 sample generati inizialmente
--hairlen 0.005 --hairstr 0.00000000001 --hairnum 500 --hairgrav 0 --radious 0.05
A sinistra, normale sample shape con 2500 sample, a destra sample elimination con 2500 sample finali e 12500 sample generati inizialmente
--hairlen 0.005 --hairstr 0.00000000001 --hairnum 2500 --hairgrav 0 --radious 0.05
A sinistra, normale sample shape con 100000 sample, a destra sample elimination con 100000 sample finali e 500000 sample generati inizialmente
--hairlen 0.004 --hairstr 0 --hairnum 100000 --hairgrav 0.00004 --hairstep 8 --radious 0.05
CG HW3: Extra credit
by Luca Sorace
1910722
Ecco la lista di parametri aggiunti al programma:
u
del voronoise dentro terrain e displacement, ovvero la quantità di jitter nella griglia del noise. Più è vicino ad 1 e più la griglia usata sarà quella del Voronoi, più è vicino a 0 e più la griglia usata sarà quella del Noisev
del voronoise dentro terrain e displacement, ovvero la “smoothness” del noise/voronoicell_size
dimake_hash_grid()
, usato per il sample elimination dentro hairVoronoise (Facile)
Voronoise è un algoritmo che combina le prioprietà di Voronoi e del Noise normale ed è utilizzato per nascondere gli artefatti della griglia alla “base” del normale Noise
Reference
https://www.iquilezles.org/www/articles/voronoise/voronoise.htm
Immagini
--terrainAlgorithm voronoise --u 1 --v 0 --scale 100 --height 0.0625
--terrainAlgorithm voronoise --u 1 --v 0.625 --scale 100 --height 0.0625
--displacementAlgorithm voronoise --u 0 --v 0
--displacementAlgorithm voronoise --u 0 --v 1
--displacementAlgorithm voronoise --u 1 --v 0
--displacementAlgorithm voronoise --u 1 --v 1
Cellnoise (facile)
Con l’algoritmo di Voronoi normale le diverse celle sono separate in maniera irregolare. Cellnoise risolve questo problema, rendendo quella separazione sempre della stessa dimensione
Reference
https://www.iquilezles.org/www/articles/voronoilines/voronoilines.htm
Immagini
Smooth Voronoi (facile)
Elimina la discontinuità e quelle linee “dure” che separano le varie celle del Voronoi, creando una funzione simile a
min()
(Usato, appunto, dentro il Voronoi), ma che sia effettivamente una funzione continuaReference
https://www.iquilezles.org/www/articles/smoothvoronoi/smoothvoronoi.htm
Immagini
Sample elimination (medio)
Se dovessimo generare casualmente nella maniera “classica” un set di sample, arriveremmo ad avere dei punti “molto vicini” tra di loro, ed altri “molto distanti”. Un modo per uniformare e rendere “più ordinata” la generazione randomica di questi punti è quella di utilizzare i dischi di Poisson, che servono appunto per generare sample circa equidistanti tra di loro. Il sample elimination è un modo molto veloce per generare dischi di Poisson.
Algoritmo
max(N * 5, 10000)
sample S, dove N è il numero di sample finale che vogliamo ottenere e 10000 è un numero arbitrario di sample minimo (Poiché il sample elimination funziona male se abbiamo pochi sample di partenza)pow(1 - distance(Vj, Si) / (2 * influence_radius), aplha)
S.size()
è maggiore di N:Reference
http://www.cemyuksel.com/research/sampleelimination/sampleelimination.pdf
http://www.cemyuksel.com/cyCodeBase/soln/poisson_disk_sampling.html
Immagini
A sinistra, normale sample shape con 500 sample, a destra sample elimination con 500 sample finali e 2500 sample generati inizialmente
--hairlen 0.005 --hairstr 0.00000000001 --hairnum 500 --hairgrav 0 --radious 0.05
A sinistra, normale sample shape con 2500 sample, a destra sample elimination con 2500 sample finali e 12500 sample generati inizialmente
--hairlen 0.005 --hairstr 0.00000000001 --hairnum 2500 --hairgrav 0 --radious 0.05
A sinistra, normale sample shape con 100000 sample, a destra sample elimination con 100000 sample finali e 500000 sample generati inizialmente
--hairlen 0.004 --hairstr 0 --hairnum 100000 --hairgrav 0.00004 --hairstep 8 --radious 0.05