Esdeveniments II i les Rutes.

Tutorial de VRML2.0

Tot i ja haver vist una introducció als esdeveniments en el mòdul Nodes, Camps i Esdeveniments, en aquest mòdul aclarirem els conceptes que hi ha al darrere.

Esdeveniments (Events)

Un esdeveniment és com un missatge que pot ser enviat per un objecte i rebut per un altre. Poden haver-hi esdeveniments indicant que un node ha canviat de posició, o que ha passat d'estar inactiu a actiu, o que ha passat una fracció de temps, etc.

En teoria, els browsers tenen un rellotge intern que va marcant en temps real el pas del temps. Els esdeveniments es van produïnt i rebent a cada interval de temps del rellotge (en teoria de manera contínua), però a la pràctica, normalment podem assumir que els browsers marquen el pas del temps a cada frame (quadre) generat gràficament. Així doncs, cada esdeveniment té una mena de segell de temps, del moment en que ha estat generat (emès, enviat).

Evidentment, un esdeveniment és emès per un eventOut i l'ha de rebre un eventIn. Però, també pot passar que un esdeveniment sigui emès o rebut per un exposedField que com recordeu són fields d'entrada i sortida.

Com es pot suposar, tant l'esdeveniment que envia com el que rep, han de ser del mateix tipus. Per tant un esdeveniment enviat per un eventOut de tipus SFInt32 (enter 32 bits univaluat) només pot ser rebut per un eventIn (o exposedField) de tipus SFInt32.

La figura següent mostra el diagrama de flux del sistema que hem mencionat.

Pot passar que un objecte (node) rebi un esdeveniment el qual el forci a enviar-ne un. En aquest cas es genera el que es coneix per cascada d'esdeveniments. En una cascada d'esdeveniments, tots els esdeveniments implicats tenen el mateix segell de temps.

Peró què passa si es genera un "loop" (llaç, "bucle")? Podria passar que mai no s'acabés d'enviar esdeveniments i no avancés el temps. Aquest problema no existeix en VRML2.0 per que no es permet que un node rebi en un eventIn un esdeveniment provinent del mateix lloc amb el mateix segell de temps. Si es detecte un loop, llavors el VRML2.0 s'encarrega de passar l'esdeveniment de temps ti a temps ti+1.

Es permet que un eventOut pugui ser encaminat a múltiples eventIns, i això és conegut com a Fan Out ("ventall d'obertura"). En canvi, no és legal encaminar múltiples eventOuts a un sol eventIn, que és conegut com a Fan In ("ventall d'entrada"). Si es produeix un Fan In, s'obtenen resultats indefinits.

Routing de valors (comanda ROUTE)

Però com podem dir que un cert eventOut ha d'estar enllaçat amb un cert eventIn? Per això el VRML2.0 proveeix un mecanisme enomenat rutes, el qual s'aconsegueix mitjançant la comanda ROUTE. (Cal notar que no és un node, si no només una comanda que serveix un mecanisme).

Per exemple suposem que, d'alguna manera, el color d'un material canvia i volem que l'esdeveniment ( que és de tipus SFColor) el rebi una llum direccional, modificant així el color de la llum. Llavors els nodes i la ruta en qüestió serien:

Exemple1: ROUTE per a modificar el color d'una llum direccional en funció del canvi de color d'un material.

Shape {
	geometry Sphere { radius 2 }
	appearance Appearance {
		material DEF MaterialEsfera Material { diffuseColor 1 0 0 }
	}
}

DEF Llum DirectionalLight {
	color 1 1 1
	direction 0.5 0.5 0
	intensity 1
}

ROUTE MaterialEsfera.diffuseColor TO Llum.color

Com veiem, hem de donar un nom als nodes que volem enllaçar per a poder-los referenciar. Un cop DEFinits els noms, podem establir l'enllaç amb el ROUTE.

El ROUTE ens diu que els esdeveniments emesos per l'exposedField diffuseColor del Material MaterialEsfera han de ser encaminats a (TO) l'exposedField color del DirectionalLight Llum.

Com es pot veure, la manera de dir quin eventIn, eventOut o exposedField és el que ens interessa tractar d'un cert node, és mitjançant un punt (.) que uneix el nom del node al del camp seleccionat.

NOTA: Aquest exemple, tal i com està, no faria cap efecte, ja que no hi ha res que pugui fer que el material envíi un esdeveniment al llum. En el següent mòdul veurem exemples plenament funcionals.



< Anterior | Menú ^ | Següent >