01.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

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-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!