Title: Introduzione
1Introduzione
- Quando si rappresentano modelli di oggetti 3D
costituiti da facce poligonali secondo delle
proiezioni alcune delle facce non sono visibili. - Bisogna mostrare sul piano di proiezione
solamente le facce visibili. - Esistono diverse strategie per
- determinare quali facce sono visibili
- rimuovere le superfici nascoste
2Back face culling
- Molti oggetti sono tali che il loro volume è
racchiuso da superfici (es. cubo). - Quando guardiamo questi oggetti possiamo vedere
solo le facce che stanno di fronte a noi, ma non
quelle dietro. - Quando i poliedri sono convessi è possibile
applicare la tecnica di back face culling per
determinare le superfici visibili. Nel caso di
poliedri concavi viene comunque impiegata, anche
se non elimina completamente tutte le facce
nascoste.
3Back face culling (2)
- Questa tecnica utilizza il concetto di vettore
normale alla superficie. - Un poligono è visibile se la normale alla
superficie rispetto al vettore che va
dallosservatore al punto del piano è inferiore a
90.
4Back face culling (3)
Per calcolare la normale alla superficie basta
considerare due lati consecutivi del poligono, in
ordine antiorario (per convenzione), e calcolarne
il prodotto vettoriale
5Back face culling (4)
Occorre quindi effettuare il prodotto scalare tra
questa normale ed il vettore che va
dallosservatore al punto della faccia. Se il
prodotto scalare è negativo la faccia è visibile.
Assumendo di aver già compiuto la proiezione
prospettica il prodotto scalare si riduce a
selezionare il poligono facendo semplicemente un
test sulla coordinata z della normale alla
superficie se è negativa la faccia è visibile.
6Back face culling (5)
Solitamente questa tecnica viene applicata prima
di compiere eventuali clipping, in modo da
ridurre il numero di poligoni da clippare. I
vettori normali possono essere pre-computati per
tutte le direzioni possibili della faccia (per
tutte le rotazioni e scaling non uniformi 3D). Si
noti che i vettori normali vengono utilizzati
anche per lilluminazione della superficie.
7Back to front sorting
- Il back face culling non è in grado di eliminare
tutte le superfici nascoste se il poliedro è
concavo infatti, non individua eventuali
sovrapposizioni tra poligoni. - Lo stesso problema si verifica se il mondo
contiene 2 o più poliedri (anche se convessi).
8Back to front sorting (2)
- Una tecnica per risolvere questo problema
consiste nello sfruttare le architetture frame
buffer degli hardware grafici (matrice di memoria
in cui si rappresenta il grafico). - Ogni volta che un poligono nella scena può
oscurare un altro poligono, è possibile
rappresentare correttamente la scena disegnando
(rasterizzando) le primitive in ordine inverso
dalla più distante alla più vicina
allosservatore, in modo da sovrascrivere gli
oggetti più distanti. - Questa tecnica è nota anche come algoritmo del
pittore.
9Back to front sorting (3)
- Per ottenere un algoritmo back-to-front basta
applicare un algoritmo di sorting utilizzando un
particolare criterio di comparazione. - Il criterio più semplice effettua lordinamento
rispetto alla massima coordinata z. - Algoritmi di sorting
- Bubble-sort (complessità O(n2))
- Quick-sort (complessità O(n log n))
- Radix-sort (complessità O(n) lineare!! -
richiede però più memoria!)
10Ripasso algoritmi
- ORDINAMENTO PER SCAMBIO
- void ordinamentoScambio(int vett, int dim)
-
- int ordinato int temp ordinato FALSO
- while (!ordinato)
-
- ordinato VERO
- for(int j 0 j lt dim-1 j)
- if (vettj gt vettj1)
-
- temp vettj vettj
vettj1 vettj1 temp - ordinato FALSO
-
-
11Ripasso algoritmi
- ORDINAMENTO PER INSERIMENTO
- void ordinamentoInserimento(int vett, int dim)
-
- int curr
- for(int i 1 i lt dim i)
-
- curr vetti
- int j i
- while ((j gt 0) (curr lt vettj-1))
-
- vettj vettj-1
- j--
-
- vettj curr
-
12Ripasso algoritmi
- ORDINAMENTO PER SELEZIONE
- void ordinamentoSelezione(int vett, int dim)
-
- int temp, posmin
- for(int i 0 i lt dim-1 i)
-
- posmin i
- for(int j i 1 j lt dim j)
- if (vettj lt vettposmin)
- posmin j
- temp vetti
- vetti vettposmin
- vettposmin temp
-
-
13Ripasso algoritmi
- Quick sort
- void quicksort (int left, int right, int array
) - int i 0, j 0, pivot 0
- i left j right
- pivot array(left right) / 2
- do
- while (arrayi lt pivot) i
- while (pivot lt arrayj) j--
- if (i lt j)
- swap (arrayi, arrayj)
- i
- j--
-
-
- while (!(i gt j))
- if (left lt j) quicksort(left, j, array)
- if (i lt right) quicksort(i, right, array)
14Back to front sorting (4)
- Radix-sort
- Sfrutta il fatto che è molto facile ordinare un
array di numeri che appartengono ad un range
limitato di valori.
15Back to front sorting (5)
- Con questo algoritmo vengono ordinate le radici
(es. unità, decine, centinaia etc. in base 10),
dalle meno significative (unità in base 10) alle
più significative. - Al primo passo si ordinano i numeri rispetto alla
prima radice (ad es. le unità). - Al secondo passo si ordinano i numeri ordinati al
passo precedente rispetto alla seconda radice (ad
es. le decine). E così via. - Ad ogni passo occorre preservare lordine dei
passi precedenti. - Numero di iterazioni necessarie numero dei dati
x numero delle radici (costante per un insieme
dato di numeri) --gt complessità lineare
16Back to front sorting (6)
- Questalgoritmo funziona molto bene per numeri in
base 2 (il test può essere compiuto con un AND). - Codice
- // consideriamo numeri da 8 bit
- short data
- short oneArraynumData, zeroArraynumData
- int numOnes, numZeros
- int mask1 //per calcolare lAND
- for (radix0 radixlt8 radix)
- numZeros0
- numOnes0
-
17Back to front sorting (7)
- for (i0 iltnumData i)
- if(dataimask)
- oneArraynumOnesdatai
- numOnes
-
- else
- zeroArraynumZerosdatai
- numZeros
-
-
- memcpy(data,oneArray,numOnes)
- memcpy(data(numOnes),zeroArray,
- numZeros)
- maskltlt1
18Back to front sorting (8)
- Nota memcpy(s,ct,n) copia n caratteri di ct in s
e restituisce s - Il criterio di scegliere la z massima non è
corretto in generale
19Back to front sorting (9)
- Lordinamento basato sulla massima z oppure sulla
z media è ammissibile quando i poligoni hanno la
stessa dimensione, altrimenti è necessario
applicare metodi di sorting più complessi. - Ad es. nel seguente grafico o nel grafico
precedente si può applicare la z media.
20Back to front sorting (10)
- In questesempio però non funziona neppure la z
media - Lalgoritmo del pittore, può essere ancora
applicato.
21Back to front sorting (11)
- Se invece si ha mutua sovrapposizione di poligoni
lalgoritmo del pittore non si può più applicare.
Non è possibile ordinare in nessun modo i
poligoni.