MokaByte
Numero 11 - Settembre 1997
|
|||
|
VRML e Java |
||
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_301Con le dovute directory nel CLASSPATH non dovreste avere problemi nella visualizzazione degli esempi che seguiranno nelle prossime parti.
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 ricerca
nuovi collaboratori
|
||
|