Thursday, January 3, 2008

Dannato billboarding

Innanzitutto buon anno a tutti: non so quante sono le persone che leggono, ma mi fa piacere sapere che c'è chi si prende persino la briga di leggere le porcherie che scrivo, quindi grazie e auguri :)
Per l'anno nuovo l'augurio impossibile è quello di finire questo progetto: impossibile non perchè non lo voglia, anzi, ma perchè dubito durerà a lungo ancora questo particolare momento che mi permette di dedicarmi a Tau Ceti. Senz'altro prima o poi sarò costretto ad altre attività che mi lasceranno ben poco tempo, e addio sviluppo (o arrivederci!). Per ora colgo l'attimo e vado avanti, vedremo fin dove arriverò, certo se si riuscisse a valicare il traguardo beh...

Ma basta coi sogni, oggi son diventato isterico, nel cercare di implementare una realizzazione decente del billboarding, ovvero di quella tecnica che permette di far apparire un oggetto bidimensionale come fosse tridimensionale.
Le stelle della mappa infatti sono realizzate con degli sprite, ovvero con dei disegni 2D che vengono aggiunti all'ambiente 3D. Non avessi scelto questa strada avrei dovuto realizzare, per ciascuna stella, una piccola sfera, e 150 stelle, moltiplicate per il numero dei triangoli necessari a realizzare una (seppur grezza) sfera, mi son sembrati uno spreco eccessivo per una mappa.
Molto più economico disegnare un cerchio pieno con Paint Shop Pro, salvarlo in png, e disegnare quello al posto della sfera.
Il problema di questa soluzione è che fino a quando la telecamera riprende l'oggetto frontalmente l'illusione funziona, ma non appena cominciamo a ruotarla per andare magari a vedere cosa c'è "dietro", ci si accorge subito che l'oggetto è piatto, per l'appunto bidimensionale.
Questa immagine è un esempio di come il trucco sia esteticamente orribile.
Come risolvere? Il modo migliore è quello di mantenere gli sprites sempre orientati verso la telecamera, un pò come se fossero dei girasoli: se ruoto la telecamera, si ruota anche lo sprite, in modo che in qualsiasi posizione io mi trova, sia in grado di vederlo sempre perfettamente circolare.
Non entro nei meandri matematici della faccenda, dico solo che, come segnalatomi da un gentile utente su usenet, esiste una funzione delle direcxt che fa proprio al caso mio.
E in effetti la cosa funzionava.. se non fosse che come effetto collaterale avevo che le stelle, più lontane erano dall'origine, e più risultavano traslate dal "bastoncino" che le regge.
Ho passato 4 ore buone a cercar di capire cosa andava, facendo tutte le permutazioni possibili nella moltiplicazione delle matrici di roto-scala-traslazione, ma niente.
Alla fine disperato, notando che vi era una componente di traslazione aggiuntiva in seguito alla rotazione correttiva, ho provato ad azzerarla brutalmente.
Magia, miracolo, funziona.

Quattro ore per:

R._41=0;
R._42=0;
R._43=0;





Bastava solo questo.
Vado a farmi un caffè e a piangere.

Ancora buon anno.

No comments: