Indice Generale Struttura Gerarchica


"Viaggio nel Sistema Solare"

VIAGGIO.JAVA
L'utilizzo del nodo Script consente di animare gli oggetti di un mondo virtuale in modo tale che questi obbediscano a determinate condizioni prestabilite dal programmatore. Tali effetti possono essere ricondotti al concetto di evento; un nodo Script prende in input le informazioni generate da un Sensor e genera degli eventi basati su tale input in modo che altri nodi del mondo possano essere modificati: tale modifica e' resa possibile grazie all'impiego di speciali dichiarazioni denominate ROUTE che rappresentano quindi la connessione tra il nodo che genera un evento ed il nodo che lo riceve come ingresso. E' importante che il nodo generante produca un evento che sia compatibile con con quelli ammessi dal nodo ricevente, ossia deve sussistere una compatibilita' di routing dell'evento.
Ogni Script ha un insieme eventIn ed uno eventOut :il primo corrisponde ai parametri di ingresso che vengono passati dal file .WRL invocante al programma .JAVA di gestione degli eventi stessi, mentre il secondo costituisce gli eventi generati dal programma e passati in ingresso al file rappresentante il mondo.

Il file VIAGGIO.JAVA e' stato scritto in modo da consentire al visitatore del Sistema Solare di intraprendere un viaggio planetario virtuale, cosi' che sia in grado di esplorare da vicino ogni singolo pianeta. L'orbita descritta e' una spirale, cominciando a visitare dal punto piu' distante del sistema fino ad arrivare nei pressi del Sole, e poi ripercorrendo lo stesso tragitto, ma a ritroso. Per preparare tale percorso, nella funzione initialize () vengono costruiti dei vettori contenenti le coordinate X,Y,Z che competono ad ognuno dei 64 punti costituenti i 5 cerchi dell'orbita, nonche' altri vettori atti alla memorizzazione della rotazione in loco, affinche' lo spettatore abbia la sensazione di osservare il Sole sempre nello stesso punto. La variabile booleana centro all'interno della funzione Move () viene utilizzata come flag per determinare il senso di percorrenza della spirale, ed ivi opportunamente settata ogniqualvolta ve ne sia la necessita'.
Tramite la processEvent () e' possibile selezionare la funzione da invocare: la Move () ha il compito di trasmettere al mondo SOLE.WRL invocante, i parametri relativi alla traslazione e rotazione del punto di vista all'interno del mondo di posizione piu' alta nella gerarchia, mentre la StartStop () verifica lo stato del viaggio, tramite appunto la variabile booleana viaggio , facendola commutare a seconda che questo venga avviato o interrotto.
Infine la funzione shutdown () ha il compito di effettuare l'operazione di garbage-collection, nel momento in cui lo Script deve essere deallocato dalla memoria, in modo da rendere disponibile una quantita' di spazio di lavoro maggiore.

//File VIAGGIO.JAVA

import vrml.*;
import vrml.node.*;
import vrml.field.*;

public class viaggio extends Script {

  int i, j, k, l;
  float[] coordX;
  float[] coordY;
  float[] coordZ;
  float[] angolo;
  float[] translation;
  float[] rotation;
  boolean viaggio = false;
  boolean centro = true;
  SFVec3f ViaggioTranslation;
  SFRotation ViaggioRotation;
  SFBool ViaggioViewBind;

  public void initialize () {
    coordX = new float[320];
    coordY = new float[320];
    coordZ = new float[320];
    angolo = new float[320];
    translation = new float[3];
    rotation = new float[4];
    ViaggioTranslation = (SFVec3f) getEventOut("ViaggioTranslation");
    ViaggioRotation = (SFRotation) getEventOut("ViaggioRotation");
    ViaggioViewBind = (SFBool) getEventOut("ViaggioViewBind");

    i = 0;
    rotation[0] = 0.0f;
    rotation[1] = 1.0f;
    rotation[2] = 0.0f;
    rotation[3] = 0.0f;
    ViaggioRotation.setValue(rotation);
    l = 0;
    for (j = 22000; j >= 2000; j -= 4000) {
      for (k = 0; k < 64; k++) {
        coordX[l] = (float) (-j * Math.sin(k * 0.098125f));
        coordY[l] = 1000.0f;
        coordZ[l] = (float) (j * Math.cos(k * 0.098125f));
        angolo[l] = (0.3925f - (k * 0.098125f));
        l++;
      }
    }
  }

  public void processEvent(Event e) {
    String nomeEvento = e.getName();
    if (nomeEvento.equals("Move")) {
      Move();
    }
    if (nomeEvento.equals("StartStop")) {
      StartStop();
    }
  }

  public void Move()
  {
    translation[0] = coordX[i];
    translation[1] = coordY[i];
    translation[2] = coordZ[i];
    ViaggioTranslation.setValue(translation);        
    rotation[3] = angolo[i];
    ViaggioRotation.setValue(rotation);
    if (centro == true) {
      i++;
      if (i == 320) {
        centro = false;
        i = 319;
      }
    }
    else {
      i--;
      if (i == -1) {
        centro = true;
        i = 0;
      }
    }
  }

  public void StartStop()
  {
    if (viaggio == true) {
      viaggio = false;
      ViaggioViewBind.setValue(false);
    }
    else {
      viaggio = true;
      ViaggioViewBind.setValue(true);
    }
  }

  public void shutdown() {}

}