MokaByte Numero 11 - Settembre 1997
  
Interazione fra
VRML e Java
 
 
di
Ignazio Locatelli
Inizia questo mese una serie di articoli sulla interazione tra VRML ed il nostro Java

 


 

Brevi cenni preliminari

 Vrml è l'acronimo di Virtual Reality Modeling Language e rappresenta un formato standard di descrizione di scene tridimensionali su Internet. A differenza delle semplici pagine html, con mondi vrml è possibile fornire un ambiente tridimensionale in cui l'utente può muoversi, cambiando il punto di vista a piacimento mediante opportuni comandi di navigazione.
Un file vrml è un semplice file ASCII e contiene al suo interno la definizione dei vari aspetti che caratterizzano il mondo virtuale ; in particolare si dovranno definire gli aspetti geometrici che forniscono la componente statica della scena 3D e le componenti dinamiche che consentono di inserire animazioni. Inoltre è possibile monitorare l'attività dell'utente ; questo consente di far reagire in maniera opportuna gli oggetti del mondo in funzione del comportamento del visitatore.
Affinchè un file vrml possa essere visualizzato, occorre disporre di un browser vrml che è in grado di interpretare il sorgente e di renderizzare la scena descritta in modo opportuno. Solitamente i browsers vrml fungono da plug-in per dei browser html. In questi articoli si farà riferimento a Cosmo Player di Silicon Graphics. Una versione beta è liberamente downloadabile dal sito : http://vrml.sgi.com. Altri browser vrml molto noti sono WorldView, Liquid Reality e CyberPassage.
 

Breve storia

 Il termine vrml viene per la prima volta coniato alla prima conferenza internazione sul WWW che si tenne nel 1994. In quell'occasione Mark Pesce e Tony Parisi vennero invitati a presentare un primo prototipo di una applicazione platform-independent chiamata Labyrint. Subito l'idea riscosse un notevole successo e poco dopo veniva creata la prima mailing list che avrebbe portato alla definizione delle specifiche vrml 1.0. Nel maggio 1995, dopo aver scelto il formato di Open Inventor come formato di file ufficiale, venne rilasciata la versione 1.0. Questa versione considerava solo aspetti statici della scena da rappresentare. Non era dunque possibile inserire animazioni o interazioni con l'utente. Questi problemi vennero superati con il rilascio delle specifiche vrml 2.0 il 4 agosto 1996. Per la definizione delle specifiche vrml 2.0 si procedette ad una votazione da parte dei membri iscritti alla mailing list. Vennero presentate alcune proposte da parte di diverse società (tra cui per esempio Silicon Graphics e Microsoft). Alla fine venne votata a stragrande maggioranza la proposta di Silicon Graphics (moving worlds). In questi articoli verranno analizzati gli aspetti previsti dalle specifiche vrml 2.0. In particolare queste consentono di introdurre animazioni e interazione con l'utente. Inoltre consentono di interfacciare vrml a Java in modo da programmare il comportamento degli oggetti all'interno del mondo. Si cercherà di dare maggiore risalto a quest'ultima caratteristica. Non è comunque possibile passare direttamente a considerare l'interfaccia Java ; prima dobbiamo concentrarci sugli aspetti sintattici del linguaggio.

Aspetti introduttivi della sintassi del linguaggio

Come dicevo prima, un file vrml è rappresentato da un file ASCII. I files vrml hanno sempre estensione .wrl. Quando il browser incontra un file con la suddetta estensione provvede ad invocare il plug-in vrml. Un file vrml 2.0 deve sempre iniziare con la seguente linea :

#VRML V2.0 utf8
(utf8 indica l'utilizzo di un particolare tipo di encoding che consente l'utilizzo di caratteri non ASCII). Qualsiasi entità all'interno di un mondo vrml è rappresentata da un nodo. Per esempio, il nodo Shape consente di inserire un certo oggetto (un cono, un cilindro, una sfera o qualsiasi altro oggetto) all'interno di un mondo vrml. I nodi prevedono al loro interno opportuni campi che consentono di dettagliare meglio quali sono le caratteristiche del nodo stesso. Per esempio, per quanto riguarda il nodo Shape, esisteranno opportuni campi che consentono di specificare se si tratta di una sfera, di un cilindro o altro ; oppure altri campi che consentono di specificare il colore e le dimensioni dell'oggetto. E' importante notare che un nodo può contenere un numero qualsiasi di campi (previsti dalle specifiche) e che un campo al suo interno potrebbe anche contenere dei nodi. Cerchiamo di chiarire il tutto con un primo semplice esempio.

#VRML V2.0 utf8

#primo banale esempio
 
 

Shape {

  appearance Appearance {

        material Material { diffuseColor 1 0 0 }

  }

  geometry Sphere { radius 2 }

}

 Esempio 1
Il sorgente di un file vrml può essere editato con un qualsiasi editor, purchè si provveda a salvarlo in formato ASCII. L'estensione di un file vrml deve essere .wrl.
Qualsiasi linea preceduta da # rappresenta un commento (a parte la prima riga).
Il nodo Shape, come tutti gli altri nodi, racchiude la lista dei propri campi all'interno di parentesi graffe. Tutti i nodi hanno nomi che iniziano con la lettera maiuscola. Viceversa i campi hanno nomi che iniziano con una minuscola. Il nodo Shape possiede due campi : appearance e geometry. Il primo definisce l'apparenza esterna dell'oggetto, cioè le proprietà della sua superficie. Il campo geometry invece definisce la forma dell'oggetto. Analizzando il sorgente ci accorgiamo che il campo appearance contiene al suo interno un nodo. Questo è dovuto al fatto che possiamo specificare diversi aspetti riguardanti l'apparenza esterna di un oggetto ; tutti questi aspetti sono raggruppati all'interno del nodo Appearance. Il nodo Appearance contiene il campo material il quale a sua volta contiene il nodo Material. Finalmente il nodo Material contiene un campo diffuseColor che specifica il colore della superficie dell'oggetto. Il colore viene specificato impostando le tre componenti RGB (rosso-verde-blu). Ogni componente presenta un valore variabile tra 0 e 1. In questo caso avremo un oggetto di colore rosso.
Il campo geometry contiene al suo interno un nodo Sphere. Questo indica che si vuole inserire una sfera. Il campo radius imposta il raggio a 2.
I nodi Appearance e Material potrebbero contenere anche altri campi, che in questo esempio vengono mantenuti al loro valore di default. Per esempio il nodo Appearance può contenere campi che servono per specificare la texture da mappare sopra la superficie dell'oggetto.
Si faccia attenzione a come vengono innestati nodi e campi. Soprattutto si noti come un nodo può contenere solo campi e questi ultimi possono contenere o il valore finale oppure un altro nodo.
Cerchiamo di complicare leggermente l'esempio di prima. Supponiamo di volere inserire due oggetti, disposti uno a fianco dell'altro. Si noti come nell'esempio precedente non è stato fatto alcun riferimento alla posizione della sfera. In assenza di qualsiasi indicazione, le specifiche prevedono di piazzare l'oggetto nell'origine del sistema di riferimento. Il sistema di riferimento prevede un asse y diretto verticalmente lungo lo schermo (dal basso verso l'alto), un asse x diretto orizzontalmente (da sinistra a destra) e un asse z diretto perpendicolarmente rispetto allo schermo (dall'interno verso l'esterno). Dato un oggetto Shape, è possibile spostarlo utilizzando il nodo Transform. Qui di seguito riporto un piccolo esempio in cui posiziono un cono a destra e una scatola a sinistra.

#VRML V2.0 utf8

# scatola a sinistra e cono a destra
 
 

Transform {

  translation -3 0 0

  children [

    Shape {

      appearance Appearance {

        material Material { diffuseColor 0 1 0 }

      }

      geometry Box { size 2 1 1 }

    }

  ]

}
 
 

Transform {

  translation 3 0 0

  children [

    Shape {

      appearance Appearance {

        material Material { diffuseColor 0 0 1 }

      }

      geometry Cone {

                height 2

                bottomRadius 1

      }

    }

  ]

}

Esempio 2

 

Il nodo Transform consente di traslare il sistema di coordinate. Il campo translation indica appunto la componente di traslazione. Per esempio il primo Transform trasla l'origine del sistema di riferimento nel punto di coordinate (-3,0,0) ; la prima componente si riferisce alle x, la seconda alle y e la terza alle z. Il campo children può contenere un numero variabile di nodi ; tra le parentesi quadre del campo children, il sistema di coordinate utilizzato è quello relativo definito dopo la traslazione. Per cui la box in questo caso verrà piazzata nell'origine del sistema di riferimento relativo, quindi in (-3,0,0). Lo stesso avviene anche per il cono, che viene posizionato in (3,0,0), quindi a fianco della scatola.
La cosa importante da notare è che all'interno delle parentesi quadre del campo children il sistema di riferimento in vigore è quello relativo. Il campo children può contenere un numero qualsiasi di nodi. Quindi può contenere anche ulteriori nodi Transform. Una ulteriore traslazione impostata da un Transform interno al campo children di un Transform più esterno, farà in modo che l'oggetto doppiamente innestato risenta di una doppia traslazione.
Per esempio, volendo creare una piccola capanna costituita da una base cilindrica e da un tetto conico, basta ricorrere al seguente sorgente :

#VRML V2.0 utf8
 
 

Transform {

  translation 0 0 -5

  children [

    Shape {

      appearance Appearance {

        material Material { diffuseColor 0 1 0 }

      }

      geometry Cylinder {

        radius 2

        height 2

      }

    }

    Transform {

      translation 0 1.5 0

      children [

        Shape {

          appearance Appearance {

            material Material { diffuseColor 1 0 0 }

          }

          geometry Cone {

            bottomRadius 2.5

            height 1

          }

        }

      ]

    }

  ]

}

Esempio 3
Come si può notare, il cilindro risente solo della prima traslazione (dato che l'utente viene posizionato inizialmente in (0,0,0) si posiziona l'oggetto ad una certa distanza per facilitare la visione). Il cono invece risente di una doppia traslazione che fa in modo che esso venga a trovarsi esattamente sopra il cilindro. Per comprendere le entità delle traslazioni, si noti che l'oggetto viene posizionato con il centro nell'origine del sistema di riferimento. Nell'esempio precedente avremmo potuto appiattire la gerarchia inserendo due nodi Transform allo stesso livello (non incapsulati l'uno dentro l'altro) e impostando come valore di traslazione per il cono la tripletta (0,1.5,-5). Il risultato sarebbe stato lo stesso. La prima forma è però da preferirsi, sia dal punto di vista logico, in quanto mostra la relazione tra base e tetto, sia perché sarà molto utile quando inizieremo a parlare di animazione. Infatti per muovere l'oggetto in questione basterà modificare la traslazione impostata dal primo nodo Transform (modificando questa infatti si ottiene lo spostamento di tutta la struttura).
Interrompo qui questa prima veloce rassegna dei principali nodi vrml. Abbiamo visto come creare delle prime semplici geometrie utilizzando il nodo Shape. Inoltre, utilizzando il nodo Transform si è mostrato come disporre gli oggetti all'interno del mondo.
Come dicevo in precedenza, in questi articoli si cercherà di dare maggiore rilievo all'interazione tra java e vrml. Le conoscenze acquisite sino ad ora sono in larga misura insufficienti per riuscire a creare mondi vrml interessanti. Altri approfondimenti verranno forniti nei prossimi articoli, passando ad analizzare alcuni dei nodi che le specifiche vrml 2.0 pongono a disposizione. In conclusione di questo primo articolo, vedremo ora di analizzare come sia possibile utilizzare java in combinazione ad un mondo vrml.
 

Java e vrml

 Vrml rappresenta un ottimo strumento di rappresentazione di scene tridimensionali. Consente inoltre di introdurre semplici animazioni e interazioni con gli utenti. Ma utilizzando soltanto i meccanismi predefiniti (built-in) dal linguaggio non si riescono ad ottenere risultati che vadano al di là di semplici effetti. Nella stesura delle specifiche si è dunque prevista la possibilità di interazione con un vero e proprio linguaggio di programmazione in modo da aumentare il range di situazioni in cui vrml può essere impiegato.

Ma quali sono le situazioni tipiche in cui Java può rendersi utile nella realizzazione di un mondo vrml ?
Essenzialmente quando ci si trova di fronte ad animazioni particolarmente complesse, specie se interagenti con l'utente. Inoltre, potrebbe essere desiderabile una interfaccia a finestre, cosa che vrml non può offrire. Un altro esempio tipico è rappresentato dai mondi in multi-utenza, cioè da mondi vrml condivisi da più utenti contemporaneamente. Anziché procedere ad una navigazione solitaria è possibile interagire con altri utenti che nello stesso momento stanno visitando lo stesso mondo. La presenza di un utente all'interno della scena 3D è concretizzata dal relativo avatar. Per avatar si intende l'oggetto che rappresenta fisicamente l'utente all'interno dell'ambiente, le sembianze tramite le quali si presenta agli altri naviganti. Tutta la parte concernente la gestione delle connessioni
internet deve essere gestita da Java in quanto vrml si preoccupa solo di gestire gli eventi interni al mondo virtuale. Un ultimo esempio potrebbe essere rappresentato da un gioco di avventura, nel quale la descrizione dell'ambiente avviene tramite vrml, mentre la parte di controllo viene espletata da Java.
Quindi Java può essere utilizzato per aumentare la potenza espressiva di vrml, rendendolo adatto a gestire le più svariate situazioni. Ma è anche vero il contrario ; una applicazione java potrebbe utilizzare vrml come mezzo di output a scopi di visualizzazione dati.

Al momento attuale sono presenti due modalità tramite la quali consentire l'interazione tra java e vrml.
Un primo approccio è quello originariamente previsto dalle specifiche vrml 2.0. Una classe java viene attivata per mezzo di un opportuno nodo presente all'interno del mondo vrml. Il nodo Script consente di indicare la classe che deve essere attivata in fase di caricamento del mondo. Indica inoltre i campi che possono essere modificati dalla classe stessa. Il mondo vrml è quindi ben conscio di quanto Java potrà influire sulla scena 3D ; in particolare l'interazione sarà limitata a quei campi che sono espressamente indicati nel nodo Script. La classe java collegata al mondo vrml non gira come un'applet ma viene definita come estensione della classe Script. Per poter ottenere delle references ai campi indicati nel nodo Script, esistono opportuni packages che vengono forniti assieme al browser vrml.
Facendo ricorso alle classi in questi packages è possibile accedere ad un campo del mondo vrml, leggere e impostare il relativo valore. Per esempio, assunta una reference al campo translation di un nodo Transform, modificare tale valore ha come effetto quello di spostare tutti gli oggetti contenuti nel campo children nella nuova posizione (si noti bene che se modifichiamo ad intervalli regolari tale campo, fornendo in sequenza più posizioni, otteniamo un effetto di animazione).
Con questo approccio la classe java viene attivata dal caricamento del mondo vrml. Risulta decisamente banale dunque impostare il valore di alcuni campi a tempo di esecuzione, in risposta degli input dell'utente.

Un secondo approccio, non ancora standardizzato ma che si stà diffondendo sempre di più, è rappresentato dall'interfaccia esterna EAI (External Authoring Interface). Utilizzando la EAI è possibile controllare un mondo vrml da una applet java. L'interazione qui non viene inizializzata dal mondo vrml (che non contiene nessun riferimento alla classe java controllante). E' infatti l'applet stessa che, una volta inizializzata, provvede ad ottenere una reference del browser vrml presente nella stessa pagina html. Una volta ottenuta tale reference, provvede ad ottenere ulteriori references a nodi e campi presenti nel mondo vrml. Anche qui esistono opportuni packages che vengono distribuiti con i browsers contenenti le classi che consentono di accedere a nodi e campi, di leggerne i valori e di procedere alla loro modifica. Come dicevo in precedenza, la EAI non è ancora stata standardizzata. Proposta da Silicon Graphics, è attualmente implementata da Cosmo Player e WorldView (tra l'altro la versione beta 5 di Cosmo Player supporta solo la EAI).

In seguito analizzeremo in dettaglio l'interfaccia esterna, sia perché sembra dare minori problemi di configurazione, sia perché il controllo attraverso una applet consente una maggiore integrazione dei vari elementi all'interno della stessa pagina html.

Prima di terminare questa prima parte, vale la pena spendere qualche parola sugli aspetti di configurazione (particolarmente delicati, visto che ancora i browser vrml sono in versione beta). Ricordo che per quanto riguarda l'interazione java-vrml, si farà riferimento a Cosmo Player.

Le classi java che sono incluse nel pacchetto del browser vrml devono essere inserite nel CLASSPATH. Durante il procedimento di installazione, Cosmo Player provvede direttamente ad aggiornare il tutto. Questo dovrebbe mettervi nella condizione di poter usufruire di mondi vrml controllati da applet java tramite la EAI. Se invece vogliamo compilare classi che utilizzano le funzionalità EAI, dobbiamo aggiungere al CLASSPATH il file java_301 o java_30 relativo a Netscape (qui si fa riferimento a Netscape Navigator). Per cui, in conclusione, il CLASSPATH dovrebbe essere del tipo :

SET CLASSPATH=. ;c:\cosmo\java\classes;c:\Programmi\Netscape\Navigator\Program\Java\classes\java_301
 
Con le dovute directory nel CLASSPATH non dovreste avere problemi nella visualizzazione degli esempi che seguiranno nelle prossime parti.
Ci fermiamo qui per questa prima parte. Dalla prossima inizieremo ad analizzare in dettaglio un esempio introduttivo relativo al controllo di alcune caratteristiche di un oggetto tramite una interfaccia a bottoni da una applet. Dato che l'approccio di questi articoli è orientato quasi esclusivamente all'uso di java combinato a vrml, la descrizione di nodi e campi previsti dalle specifiche vrml 2.0 risulta poco approfondita. Qualora foste interessati ad acquisire ulteriori conoscenze sulla progettazione di mondi vrml, potete fare riferimento al mio tutorial presente al sito dei Vrml Dreamers (http://www.lucia.it/vrml) e che ormai copre la stragrande maggioranza dei nodi previsti dalle specifiche. Potrete inoltre sperimentare direttamente alcuni mondi più o meno complessi che il gruppo ha realizzato.
Qui di seguito riporto alcuni indirizzi che si riferiscono a siti vrml :

http://vrml.sgi.com : sito vrml di Silicon Graphics. Contiene una enorme quantità di dati su vrml 2.0.
http://www.sdsc.edu/vrml : Vrml Repository
http://vag.vrml.org/VRML2.0/FINAL/ : documento contenente le specifiche vrml 2.0.
http://cosmo.sgi.com : sito da cui si può downloadare Cosmo Player
http://www.intervista.com/download/index.html : sito da cui si può downloadare WorldView
http://www.blacksun.com : sito di Black Sun Interactive. Offre mondi vrml in multi-utenza.
http://www.vrmlsite.com : ottima rivista on-line su vrml
 
 

  

 

MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it