VRML 2.0 consente di aggiungere un buon grado di interattività ai mondi realizzati,
tramite l'impiego di sensori. I sensori sono, sostanzialmente, nodi in grado
di rilevare gli eventi causati dal comportamento dell'utente. Ad esempio: il
nodo TouchSensor rileva il "click" del mouse su un oggetto, mentre ProximitySensor
e VisibilitySensor sono in grado di registrare rispettivamente caratteristiche
quali la prossimità e la visibilità. Il funzionamento di base dei sensori è
fondamentalmente comune. In questo capitolo si analizzerà il sensore TouchSensor.
Creare un interruttore con il nodo TouchSensor
Si vuole realizzare una semplice animazione il cui azionamento è gestito da
un interruttore. Cliccando su questo, si fa partire l'animazione, premendo l'interruttore
una seconda volta l'oggetto si ferma. Per catturare la pressione di un oggetto
da parte del mouse, si farà ricorso al nodo TouchSensor.
Il modo più semplice di controllare l'attivazione dell'animazione consiste,
evidentemente, nel creare un meccanismo che ci permetta di gestire i valori
del campo enabled all'interno del nodo TimeSensor. È infatti da
questo nodo che dipende l'avviamento dell'animazione.
Utilizzare il nodo TouchSensor è molto semplice. Definito un certo oggetto,
è sufficiente aggiungere il nodo TouchSensor nel campo children
all'interno del quale l'oggetto stesso è stato definito:
[...]
# creazione e dichiarazione dell'interruttore
DEF interruttore transform {
translation -8 0 0
rotation 1 0 0 1.5
children [
Shape {
appearance Appearance {
material Material {emissiveColor 1 .5 0 }
}
geometry Cylinder {radius .5
height .1}
}
DEF interruttore TouchSensor {}
]
}
[...]
Come si può vedere, una volta definito il sensore
all'interno del campo children, si rende l'oggetto sensibile alla presenza
(e soprattutto alla pressione) del cursore del mouse. Quando l'utente cliccherà
su di esso, il nodo TouchSensor manderà in uscita un evento isActive
di tipo booleano (0 o 1).
A questo punto occorre fare in modo di inviare
l'evento isActive del sensore al campo enabled del nodo TimeSensor.
Si può ora vedere l'esempio completo:
missile.wrl
Tutto sommato si tratta di un'operazione abbastanza semplice: le sostanziali
novità riguardano la definizione del nodo TouchSensor e l'impiego del
campo isActive.
Visualizzando il file all'interno del browser però si riscontra un inconveniente.
L'interruttore non si comporta proprio come ci si aspetterebbe. Infatti, finché
teniamo premuto l'interruttore, il "missile" viaggia. Ma non appena lo rilasciamo,
l'animazione si interrompe.
Accade questo: il nodo TouchSensor in realtà invia 2 eventi: Uno corrisponde
alla pressione del pulsante, l'altro al suo rilascio. Il nodo TimeSensor,
di conseguenza, si attiva alla pressione e si disattiva al rilascio (quando
isActive invia il valore 0).
Vedremo come risolvere questo problema nel prossimo capitolo, dove a supporto
del VRML verrà impiegato Vrmlscript, un linguaggio di scripting molto
simile a Javascript.