You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
la matrice VM risulta pari a:<br />
Proiezione dei punti nei sistemi<br />
di coordinate<br />
l<br />
v<br />
ato 3<br />
mondo della view, che ha la forma:<br />
Questi quattro parametri possono<br />
essere ottenuti dall'esecuzione del<br />
seguente algoritmo, che riceve in<br />
ingresso i punti V', ricavati cioè ap-<br />
plicando soltanto la proiezione as-<br />
sonometrica, e che si suppongono<br />
memorizzati in un array bidimen-<br />
sionale p[nI[componenteI, dove <br />
Ciascun vertice di coordinate<br />
V(x,y,z) può essere ora proiettato<br />
nello spazio canonico calcolando il prodotto matriciale è il numero del vertice e l'indice delle tre<br />
tra il vettore: componenti x, y e z:<br />
[X, Y, z,1 1, Rea1 pOp1[3];<br />
Rea1 pOp2[3];<br />
che rappresenta un punto in coordinate omogenee, e la fori i = O; i < 3 ; i++) {<br />
matrice appena calcolata, ottenendo così il vettore V' di POP~[~I = ~[Ol[il-~[ll [il;<br />
componenti: POP~I~I = ~lOllil-~~2l[il;<br />
[ X'r Y'r z'r W' 1 A = pOpl[l] * pOp2[2] - pOp1[2] * pOp2[1];<br />
B = pOp1[2] * pOp2[0] - pOpl[O] * pOp2[2];<br />
La proiezione dalle VC alle DC si ottiene invece per mez- C = popl[ O 1 * p0p2 [ 11 - popl[ 11 * p0p2 [o 1 ;<br />
zo delle seguenti formule: D = -(A * ~[01[01 + B * ~[01[11 + C * ~[01121);<br />
Xdc = x' * vsx / W' + vcx;<br />
Ydc = y' * vsy / W' + vcy;<br />
dove vsx, vcx, vsy, vcy sono parametri caratteristici di<br />
una viewport che si estende da xmin,ymin a xmax,<br />
ymax, calcolabili nel modo seguente:<br />
vcx = (xmax + xmin) * 0.5;<br />
vcy = (ymax + ymin) * 0.5;<br />
vsx = (xmax - xmin) * 0.5;<br />
vsy = (ymax - ymin) * 0.5;<br />
Poiché abbiamo utilizzato una matrice di proiezione as-<br />
sonometrica, il valore della quarta coordinata W' risulterà<br />
sempre pari a uno, e non è quindi in questo caso neces-<br />
sario effettuare le due divisioni, che diventano invece si-<br />
gnificative nel caso di una trasformazione prospettica.<br />
Calcolo deila coordinata Z dei punti interni<br />
Quando vogliamo disegnare un poligono, calcoliamo in-<br />
nanzitutto la posizione dei suoi vertici in DC, proweden-<br />
do eventualmente a effettuare il clipping (argomento ab-<br />
bastanza complesso che non viene trattato in questo arti-<br />
colo).<br />
Quindi calcoliamo quattro parametri caratteristici, che<br />
rappresentano l'equazione del piano del poligono nel<br />
}<br />
In pratica si calcola il prodotto vettoriale tra i vettori p0pl<br />
e pOp2, ottenendo così la normale [A B CI al poligono,<br />
che verrà poi utilizzata per effettuare il back-culling e lo<br />
shading; il calcolo di D invece si ottiene imponendo il<br />
passaggio del piano per un punto del poligono. Dispo-<br />
nendo di questi parametri è possibile risalire dalle coordi-<br />
nate 2D dei punti interni al poligono, calcolati in DC<br />
dall'algoritmo di scansione, alla coordinata Z di ciascuno<br />
di essi, che può essere ricavata utilizzando la relazione:<br />
Questa coordinata che, poiché è relativa a un punto in-<br />
terno al volume canonico, risulterà sempre compresa tra<br />
-1 e 1, verrà poi utilizzata per effettuare il test nello Z<br />
buffer.<br />
La gestione deiio Z buffer<br />
Lo Z buffer è un array di valori reali che ha le stesse di-<br />
mensioni della viewport alla quale viene collegato (xmax-<br />
xmin)*(ymax-ymin). Dal momento che un float occupa<br />
generalmente 4 byte, uno buffer con precisione in virgola<br />
mobile richiede ancora più memoria di una bitmap a 24<br />
bit per pixel: per esempio una viewport di 640x512 punti<br />
necessita di uno Z buffer di più di 1 Mb. Per questo moti-<br />
vo, tanto le implementazioni hardware quanto quelle<br />
software lavorano con precisione più limitata, e precisa-