08.11.2012 Views

dettagli - Amiga Magazine

dettagli - Amiga Magazine

dettagli - Amiga Magazine

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.

Fig. 2 - Gli assi dello<br />

schermo.<br />

nale e sarà, quindi,<br />

necessario eseguire<br />

su esso una proie-<br />

zione prospettica dei<br />

punti tridimensionali.<br />

Come tutti hanno<br />

studiato sin dalle<br />

scuole medie, l'uso<br />

della prospettiva nel<br />

tracciamento di un'immagine fa in modo che gli oggetti più<br />

lontani, risultino più piccoli e contemporaneamente con-<br />

vergano verso il punto di fuga. Nel nostro caso, i punti non<br />

diminuiranno di dimensione, ma in base all'aumento della<br />

loro distanza convergeranno verso il punto di fuga, che<br />

corrisponde all'origine degli assi cartesiani. Questo nei<br />

computer equivale normalmente alle coordinate dello<br />

schermo XFO YFO, ossia nell'estremità in alto a sinistra,<br />

ma per migliorare l'effetto globale delle rappresentazioni<br />

tridimensionali (e il tracciamento di punti 3D è una di que-<br />

ste) conviene spesso traslare verso il centro l'origine degli<br />

assi.<br />

Inoltre, per semplificarsi la vita, è conveniente che l'osser-<br />

vatore non si trovi esattamente all'origine degli assi (0,0,0),<br />

ma sia leggermente traslato sull'asse Z di una costante che<br />

chiameremo zo@ In questo modo l'algebra risulta più sem-<br />

plice, e la proiezione viene centrata sullo schermo del<br />

computer. L'osservatore prende quindi le coordinate<br />

(O,O,zoff), dove zoff è negativo.<br />

in pratica, ogni stella (o punto) definita da tre coordinate<br />

Xp, Yp e Zp che la definiscono nello spazio 3D, per essere<br />

tracciata sullo schermo 2D, dovrà essere sottoposta a una<br />

semplice proiezione, che ricaverà due nuove coordinate Xs<br />

e Ys. Matematicamente, per una semplice similitudine fra<br />

triangoli, si ottiene nel modo che segue:<br />

Xs = (zoff * Xp) / (Zp + zoff)<br />

Ys = (zoff * Yp) / (Zp + zoff)<br />

Ora non resta che traslare le coordinate ottenute verso il<br />

centro dello schermo, sommando le due costanti di trasla-<br />

zione xoffe yo@ Per concludere, la proiezione completa di<br />

un punto 3D (Xp,Yp,Zp) in un spazio 2D (Xs, Ys) awiene<br />

quindi tramite le due seguenti formule:<br />

XS = xoff + [ (zoff * Xp) / (Zp + zoff) ]<br />

Ys = yoff + [ (zoff * Yp) / (zp + zoff) ]<br />

guaggio che più ci aggrada e cominciare a tracciare il numero<br />

di punti che desideriamo.<br />

Come già anticipato, in questa occasione abbiamo deciso<br />

di utilizzare il linguaggio assembly, per permettere anche ai<br />

possessori di macchine più lente di veder funzionare il<br />

proprio campo stellare, senza dover ricorrere a tecniche<br />

particolari di tracciamento, come per esempio il double-<br />

buffering, necessarie quando si lavora in C e specialmente<br />

in maniera system-friendly.<br />

Cominciamo quindi con il convertire le formule di proie-<br />

zione in una forma comprensibile per il nostro Arniga:<br />

Projection:<br />

;Prende Xp e lo moltiplica per zoff<br />

m0ve.w Xp,DO<br />

muls #zoff ,DO ;Xp=Xp*zoff<br />

;Prende Yp e lo moltiplica per zoff<br />

m0ve.w Yp,D1<br />

muls #zoff ,D1 ;Yp=Yp*zoff<br />

;Prende Zp e vi somma zoff<br />

m0ve.w Zp,D2<br />

add.w #zoff,D2 ;Zp=Zp+zoff<br />

;Se Zp è 0, evita la divisione<br />

beq SkipDivision<br />

;Divide Xp e Yp per Zp<br />

divs D2,DO ; Xs=Xp/Zp<br />

divs D2,Dl ;Ys=Yp/Zp<br />

SkipDivision:<br />

;Somma la traslazione a Xs e Ys<br />

add.w #xoff,DO ;Xs=Xs+xoff<br />

add.w #yoff,Dl ;Ys=Ys+yoff<br />

;Memorizza le coordinate di schermo<br />

;ottenute dalla proiezione<br />

m0ve.w D0,Xs<br />

m0ve.w D1,Ys<br />

rts<br />

Visto che questo compito sarà eseguito per un certo nume-<br />

ro di punti (difficilmente avremo una singola stella che va-<br />

ga nello spazio), per una serie di proiezioni, è conveniente<br />

utilizzare due tavole: la prima, composta da triplette di<br />

word, definisce i punti 3D; la seconda, costituita da coppie<br />

di word, in numero equivalente alle triplette già citate, con-<br />

tiene i risultati di ciascuna proiezione.<br />

Ipotizziamo per esempio di voler eseguire la proiezione<br />

delle coordinate di cinque stelle, definite nella tavola<br />

Tab3Q le coordinate proiettate, verranno depositate nella<br />

tavola Tab2D come si vede nel listato 1.<br />

Stampiamo i punti<br />

Dalla teoria alla pratica<br />

Fino a questo punto abbiamo lavorato esclusivamente sulle<br />

coordinate dei punti; è giunto finalmente il momento di<br />

Adesso che sappiamo come proiettare un punto 3D sullo iniziare a stamparli sullo schermo. Per il momento iniziereschermo,<br />

non resta che convertire la procedura nel lin- mo con un semplice schermo a due colori (1 bitplane) in

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

Saved successfully!

Ooh no, something went wrong!