![]() | |||||||||||
| Home page | Applet | Immagini | Scenegraph | Diagrammi | |||||||
|
Descrizione tecnica del programmaClasse principale SoundOfSphereViene usato un SimpleUniverse nel quale viene costruita la scena, ad esso associata tramite un BranchGroup. In questa fase viene creato un dispositivo audio (AudioDevice) per abilitare la riproduzione del suono, viene inizializzato un Alpha che servirà per gestire la rotazione delle colonne musicali e vengono caricate tutte le immagini necessarie al programma all'interno di un Array statico, in modo da poter essere accessibili da parte di ogni classe. Un flag statico permette al programma di capire se esso è stato avviato come Applet o Applicazione, consentendo così il corretto "path" di caricamento.La costruzione della scena comporta il richiamo alcuni metodi per la creazione della piattaforma costituente la scena (comprensiva di pannelli, colonne, foto degli autori disposte casualmente e griglia sottostante), dello sfondo stellato, della musica di sottofondo - realizzata con BackgroundSound - delle luci ambientale e principale. Inoltre, per la disposizione dei pianeti, quella delle garitte e delle colonne, e per l'inserimento del robottino denominato Robowalker si impiegano metodi che richiamano classi specifiche per la creazione delle istanze degli oggetti. Classe PianetaLa classe restituisce un TransformGroup, che contiene nodi e trasformazioni atte alla visualizzazione di una sfera (primitiva Sphere) ruotante personalizzabile. Attraverso il suo costruttore principalepublic Pianeta(float x, float y, float z, float diametro, URL texturePlanet, int vel)
è possibile stabilire la posizione che il pianeta occuperà nello spazio, il suo diametro, la texture da applicare
e la velocità di rotazione. Sono, inoltre, presenti il metodo
public void addOrbitPlanet(Pianeta orbitplanet, int velorbit)
che permette di aggiungere al pianeta, un altro orbitante alla velocità prestabilita; questo permette di creare
effetti di orbita multipla di pianeti su altri pianeti, tramite codice come quello sottostante, impiegato nel
programma:
Pianeta gioconda = new Pianeta(11,28,9, 3.5F, urlImmagini[PIANETI][6], 5000);
E' disponibile anche il metodo
gioconda.addOrbitPlanet(new Pianeta(6.4F,0F,0F, 1F, urlImmagini[PIANETI][7], 5000), 3000); public void addText(String testo)
che permette di aggiungere un testo tridimensionale pulsante - a scopo descrittivo -
che apparirà sopra lo "zenit" del pianeta.
Un alro metodo di utilità è
public void setRotation(boolean isRotate)
che chiamato opportunamente può fermare/avviare la rotazione del pianeta (non impiegato nel progetto, ma si pensa
già agli usi futuri...).
Classe FormeQuesta classe genera istanze di oggetti grafici contenuti nel programma.In particolare crea:
Di seguito riporto i costruttori disponibili
public Forme(float x, float y, float z, float w, float h, int tipoforma, double rotY, URL filetexture, URL muretto)
// costruttore completo
public Forme() // facilitato: crea 4 garitte con pannelli predefiniti public Forme(int squareSize) // Crea griglia di suddivisione della piattaforma in caselle public Forme(int cellX, int cellY, URL filetexture) // crea pannello fotografico public Forme(int cellX, int cellY, URL filetexture, URL filebasecolonna) // crea colonna compositore Classe RoboWalkViene caricato un oggetto .obj rappresentante il logo Java (creato dal Dott. Di Blasi) che, opportunamente traslato sopra la piattaforma principale, compie un tragitto tracciato da nodi di interpolazione dati, attraverso le spline cubiche dette di Kochanek-Bartels che interpolano attraverso delle KeyFrames generate casualmente. L'effetto ottenuto è quello di un robottino "passeggiante" sopra la piattaforma che fornisce "animazione" alla scena.Classe KeyBehaviorGestisce l'interazione dell'utente con il programma tramite la tastiera. Il suo costruttore riceve, come argomenti, il TransformGroup posto sotto il BranchGroup principale - che raggruppa tutti i nodi della scena - e un riferimento al SimpleUniverse.Il primo viene usato per poter aggiungere (addChild) e/o rimuovere (detach) nodi contenenti oggetti, in maniera dinamica; il secondo viene impiegato per spostare la visuale dell'osservatore tramite gli appositi tasti funzione. Qui è presente il metodo per la generazione del suono in un preciso punto spaziale, (che nel programma coincide con ognuna delle quattro colonne associate ai compositori). Tale metodo usa la classe PointSound che diffonde il suono in ogni direzione; associato ad essa vi è pure un vettore d'attenuazione che permette di diminuire linearmente l'intensità fino alla metà della piattaforma, punto nel quale è ridotta al 20% di quella iniziale. Oltre questo valore, l'attenuazione è stata resa totale (100%); questo implica che se l'ascoltatore si pone esattamente al centro della piattaforma sentirà la musica proveniente da tutte e quattro le colonne. La pressione del tasto "m", oltre ad attivare la generazione della musica proveniente dalle colonne, provvede pure alla loro rotazione. Per questo, l'interpolatore associato alle colonne definito nella classe "Forme", fa uso di un Alpha statico dichiarato nella classe principale "SoundOfSphere" che viene inizialmente posto in "pause". La natura "statica" del riferimento permette, da qui, il "risveglio" della temporizzazione e conseguentemente la rotazione senza perdita di posizione. Un altro oggetto costruito all'interno di questa classe è la "giostra". Essa è formata da una base costituita da due cilindri (Cylinder) - uno largo e piatto che fa da supporto per uno più piccolo e alto - sopra i quali vi è un piedistallo realizzato tramite un cono (Cone); sulla punta del cono ruota una sfera rappresentante la "Terra" (nuova istanza della classe "Pianeta"). Inoltre vengono create sei luci direzionali (createDirectionalLight); tutti i nodi costituenti la giostra fanno capo a un TransformGroup dotato di interpolatore per la rotazione, il quale viene "agganciato" al nodo principale contenente la scena a seguito della pressione del tasto "F". La pressione del tasto <Esc>, invece, provocherà il detach del nodo-giostra. Per gestire questa interazione dinamica si è fatto uso della capability associata al TG principale: objSpin.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND)
Per ultimo, un metodo è responsabile della rotazione di tutta la scena in risposta alla pressione della
barra spaziatrice. L'interpolatore associato prende come riferimento la classe Alpha "rotationAlphaScene"
dichiarata come membro privato della classe.
Questo permette di attivare/disattivare la rotazione della scena senza perdere
il valore della posizione (quindi dell'ultimo valore assunto da Alpha prima dell'"off" rotazione).
Il codice associato alla pressione del tasto <Spazio> quindi diventa semplicemente:
case KeyEvent.VK_SPACE:
if (rotationAlphaScene.isPaused()) rotationAlphaScene.resume();
else rotationAlphaScene.pause();
break;
|
||||||||||