JavaLab3D:                                                             - indietro -

                                                                                                                                                            

Teoria

 

 

      Indice:

 

                1. In generale

 

                2. La rappresentazione del mondo

 

                3. Vettori e poligoni

 

                4. Proiezioni e rendering

 

                5. Trasformazioni

 

                6. Classi Java

 

 

 

 

 

 

    1. In generale

 

 

Per rappresentare l'ambiente tridimensionale è stato usato un sistema di assi coordinate x, y, z, e il mondo è visto quindi come un insieme di punti. Ciò che l'utente vede è solamente una parte del mondo virtuale, quella che compare all'interno del frustum. Il frustum è una piramide a base rettangolare e con vertice nelle coordinate del giocatore che simula il cono di vista di un uomo.Per proiettare il mondo tridimensionale in un piano bidimensionale, si taglia il frustum con un piano (detto piano di vista) parallelo all'ipotetica base della piramide e si proiettano i poligoni su questo piano. Dico "ipotetica" perchè in realtà il frustum non ha base, ma definisce solamente un angolo solido nello spazio virtuale. In questo modo il giocatore può vedere oggetti infinitamente lontani da lui. Quando tutti i poligoni sono stati proiettati sul piano di vista, questo viene mandato a monitor.

 

 

 

2. La rappresentazione del mondo

 

 

Si è utilizzato il sistema di assi detto "sistema della mano destra", cioè quello in cui l'asse delle delle x punta verso destra, l'asse delle y punta in alto, e l'asse delle z verso l'osservatore. Il punto (0, 0, 0) è centrato sulla telecamera, e quando questa si muove tutto il mondo viene rototraslato nella direzione opposta al movimento. Come già accennato il giocatore vede solamente quello che compare all'interno del frustum, ma i calcoli per il movimento vengono applicati a tutti i poligoni presenti nel gioco. La sezione definita dal piano di vista all'interno del frustum è un rettangolo le cui dimensioni sono in proporzione alle dimensioni di un monitor CRT, cioè la base è lunga 4/3 dell'altezza. L'ampiezza della visuale del giocatore si può settare avvicinando o allontanando il piano di vista dalla telecamera: se la telecamera è prossima al piano di vista il giocatore avrà una visuale tipo fish-eye, mentre se è lontana avrà una visuale tipo teleobiettivo. All'avvio il programma tenta di settare la risoluzione del piano di vista a 800*600 punti, e se questo non è possibile tenta con altre risoluzioni. Tramite le primitive di Java, il software è in grado di poter settare la sua risoluzione sia sotto i sistemi operativi Microsoft che sotto il sistema Linux.

 

 

 

 

 

3. Vettori e poligoni

 

 

Ogni punto dello spazio è definito da una terna di punti (px, py, pz) e viene considerato come destinazione di un vettore Vp centrato nell'origine degli assi. Un poligono è semplicemente una lista ordinata di punti, e quindi di vettori, essendo ogni punto un vertice del poligono. Tutte le trasformazioni per il movimento dei poligoni vengono calcolate sui vettori dei suoi vertici. Per semplicità sono stati considerati solamente poligoni convessi, potendo costruire uno pseudo-poligono concavo accostando più poligoni convessi. Il fatto di utilizzare una lista ordinata permette di poter assegnare un verso alla normale del poligono, potendo cosi capire se si sta guardando il poligono di fronte o dal retro. Se il poligono appare visto dal dietro, non lo si considera ed esso non viene proiettato sul piano di vista, risparmiando tempo di calcolo - volendo per esempio rappresentare un cubo, sul piano di vista non vengono proiettati i tre lati posteriori, che verrebbero coperti dai tre anteriori.

 

 

 

4. Proiezioni e rendering

 

 

Ogni poligono viene proiettato sul piano di vista utilizzando delle similitudini, come si vede in figura. E' importante notare che solamente i poligoni contenuti nel frustum vengono proiettati sul piano di vista, risparmiando tempo di calcolo per poligoni che comunque non si vedrebbero. Il problema nasce quando il poligono da proiettare sul piano di vista si trova tra la telecamera e il piano stesso. In questo caso bisogna procedere con il clipping del poligono, cioè bisogna tagliare la parte del poligono che non va disegnata. Una volta proiettato sul piano di vista, ogni poligono viene colorato. Per far questo viene scandita la matrice 800*600 e vengono colorati solamente i punti contenuti nella proiezione.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. Trasformazioni

 

 

Sono stati definiti due tipi di trasformazione: la rotazione e la traslazione. In seguito a un input da parte dell'utente, tutti i poligoni creati vengono rototraslati secondo la trasformazione inversa a quella definita dall'utente - per esempio se l'utente vuole girarsi verso destra, viene calcolata una trasformazione che ruota tutti i poligoni a sinistra. Tutte le rotazioni nello spazio vengono fatte rispettando quest'ordine: prima quelle secondo l'asse delle x, poi quelle secondo l'asse delle z, ed infine quelle lungo l'asse delle y.

 

 

 

6. Classi Java

 

Il gioco è stato realizzato sfruttando le sole librerie Awt e Swing presenti nel pacchetto standard jvm.

Per poter rendere il gioco il più scorrevole scorrevole è stato necessario utilizzare la programmazione concorrente. Java mette a disposizione la classe Thread che prevede in toto la gestione di scheduling, syncronization e deadlock avoidance. Anche la gestione dell'input sono state utilizzate le classi della famiglia Listener, che permettono un'ottima gestione dell'input sia da tastiera che da mouse.

Per evitare gli sfarfallii del monitor e permettere che il gioco sia sempre fluido, è stata utilizzato un doppio buffer (gestito tramite l'utilizzo di puntatori) con l'ausilio dei metodi Java BufferStrategy, che sincronizzano il refresh rate e il page flipping.