Sensori ambientali


Permettono di ottenere informazioni sulla navigazione dell'utente nel mondo 3D

ProximitySensor
determinare la posizione dell'utente rispetto ad un certo punto
VisibilitySensor
determinare dove l'utente sta guardando
Collision
determinare cosa fare in caso di collisioni dell'utente con oggetti della scena

Possono, ad esempio, essere usati per attivare o disattivare delle animazioni

ProximitySensor
{
  exposedField SFVec3f    center              0 0 0
  exposedField SFVec3f    size                0 0 0
  exposedField SFBool     enabled             TRUE
  eventOut     SFBool     isActive
  eventOut     SFVec3f    position_changed
  eventOut     SFRotation orientation_changed
  eventOut     SFTime     enterTime
  eventOut     SFTime     exitTime
}


genera eventi quando l'utente entra, esce e si muove in una regione dello spazio (a forma di scatola)

center size
centro e dimensioni della regione del sensore

Quando l'utente entra nella regione del sensore:
  1. viene generato un evento isActive con valore TRUE
  2. viene generato un evento enterTime con il tempo di ingresso

Quando l'utente esce dalla regione del sensore:
  1. viene generato un evento isActive con valore FALSE
  2. viene generato un evento exitTime con il tempo di uscita

Mentre l'utente è all'interno della regione del sensore:
  1. vengono continuamente generati gli eventi position_changed e orientation_changed contenenti la posizione e l'orientazione dell'utente rispetto al sistema di coordinate del sensore

Esempio #1


Supponiamo di voler attivare un'animazione solo quando l'utente si trova in una certa area dell'ambiente virtuale, ad es. per:
  1. aprire una porta quando l'utente e' sufficientemente vicino
  2. disattivare le animazioni relative a oggetti non visibili o troppo lontani, per aumentare il numero di FPS

È sufficiente inviare gli eventOut, enterTime e exitTime del ProximitySensor agli eventIn set_startTime e set_stopTime del TimeSensor che controlla l'animazione (oppure l'evento isActive all'evento set_enabled)
ProximitySensor -> TimeSensor -> Interpolatore -> Target

Collision
{
  exposedField MFNode children    []
  exposedField SFBool collide     TRUE
  field        SFNode proxy       NULL
  eventOut     SFTime collideTime
  ...
}


Specifica che cosa succede quando l'utente collide con uno o più dei nodi Shape figli (esclusi IndexedLineSet, PointSet e Text le cui collisioni con l'utente NON vengono mai rilevate)

Se non ci sono nodi Collision nella scena, il browser dovrebbe rilevare tutte le collisioni dell'utente con i nodi Shape, e impedire all'utente di attraversare tali oggetti

children
lista di nodi figli per cui si vuole stabilire cosa fare in caso di collisioni
collide
abilita (TRUE) o disabilita (FALSE) la rilevazione delle collisioni per i nodi figli
proxy
nodo (che non viene disegnato) la cui geometria viene usata al posto della geometria dei figli nella rilevazione delle collisioni (usando come proxy geometrie semplici, la rilevazione delle collisioni diventa più efficiente); se il campo vale NULL, viene usata la geometria dei nodi figli
collideTime
in caso di collisione (con i nodi figli o la geometria proxy), genera un evento che contiene il tempo in cui la collisione è avvenuta

Esempio #2 (1)


Supponiamo di voler costruire un Head-Up-Display (HUD) che sia sovraimposto alla scena VRML (cioè, dei nodi che seguono l'utente nella navigazione).

Costruiamo un nodo <b>Transform</b> (ad es., chiamato Hud) contente i nodi dell'HUD, posizionato molto vicino all'utente (possibilmente, entro il cilindro dell'avatar)

N.B. le dimensioni dell'avatar dell'utente possono essere impostate mediante il campo avatarSize del nodo NavigationInfo, che prende 3 valori float:
  1. altezza dell'avatar
  2. altezza del passo dell'avatar
  3. raggio del cilindro che racchiude l'avatar

image

Esempio #2 (2)


Inseriamo un ProximitySensor (ad es., chiamato Locator), la cui regione è abbastanza grande da contenere l'intero ambiente virtuale

Li colleghiamo con:

ROUTE Locator.position_changed TO HUD.set_translation
ROUTE Locator.orientation_changed TO HUD.set_rotation


Inoltre, inseriamo l'Hud in un nodo Collision (con collide FALSE) perché, visto che l'Hud si trova all'interno del cilindro dell'avatar, collide con questo e quindi può bloccare la navigazione.
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki