Eventos II y las Rutas.

Tutorial de VRML97

Aunque ya se ha visto una introducción a los eventos en el módulo Nodos, Campos y Eventos, en este módulo aclararemos los conceptos que hay detrás.

Eventos (Events)

Un evento es como un mensage que puedeser enviado por un objeto y capturado por otro. Pueden haber eventos indicando que un nodo ha cambiado de posición, o que ha pasado de un estado inactivo a uno activo, o que ha pasado un fracción de tiempo, etc.

En teoría, los browsers tienen un reloj interno que va marcando en tiempo real el paso del tiempo. Los eventos se van produciendo y recibiendo a cada intervalo de tiempo del reloj (en teoría de forma contínua), pero en la práctica, normalmente podemos asumir que los browsers marcan el paso del tiempo a cada frame (cuadro o imagen) generado gráficamente. Así pues, cada evento tiene una especie de sello de tiempo, del instante en que se ha generado (emitido, enviado).

Evidentemente, un evento es emitido por un eventOut y debe ser recibido por un eventIn. Pero también puede ocurrir que un evento sea emitido o recibido por un exposedField que como recordareis són fields de entrada y salida.

Como es de suponer, tanto el evento que envía como el que recibe, han de ser del mismo tipo. por lo tanto, un evento enviado por un eventOut de tipo SFInt32 (entero 32 bits univaluado) sólo puede ser recibido por un eventIn (o exposedField) de tipo SFInt32.

La figura siguiente muestra el diagrama de flujo del sistema que hemos descrito.

Puede ocurrir que un objeto (nodo) reciba un evento el cual le fuerce a enviar uno él mismo. En este caso, se genera lo que se conoce por cascada de eventos. En una cascada de eventos, todos los eventos implicados tienen el mismo sello de tiempo.

¿Pero que pasa si se genera un "loop" (lazo o bucle)? Podria pasar que nunca se acabase de enviar eventos y en consecuencia no avanzase el tiempo. Este problema no puede ocurrir en VRML97 ya que no se permite que un nodo reciba en un eventIn un evento proviniente de un mismo sitio con el mismo sello temporal. Si se detecta un loop, entonces el VRML97 se encarga de convertir el sello temporal del instante ti al ti+1 y retardar su emisión.

Se permite que un eventOut pueda ser encaminado hacia múltiples eventIns, y esto se conoce como Fan Out ("abanico de apertura"). En cambio no es legal encaminar múltiples eventOuts a un solo eventIn, donde esto es conocido como Fan In ("abanico de entrada"). Si se produce un Fan In, se pueden obtener resultados no esperados e indefinidos.

Routing de valores (comando ROUTE)

¿Pero como podemos decir que un cierto eventOut debe estar enlazado a un cierto eventIn? Para esto, el VRML97 provée un mecanismo llamado rutas, el cual se consigue a través del comando ROUTE. (Debe resaltarse que no es un nodo, si no tan solo un comando que aporta un mecanismo).

Por ejemplo supongamos que, de alguna forma, el color de un material cambia y queremos que el evento (que es de tipo SFColor) lo reciba una luz direccional, modificando así el color de la luz. Entonces los nodos y la ruta en cuestión serían:

Ejemplo1: ROUTE para modificar el color de una luz direccional en función del cambio del color de un material.

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

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

ROUTE MaterialEsfera.diffuseColor TO Luz.color

Como vemos, hemos de asignar un nombre a los nodos que queremos enlazar para poderlos referenciar. Una vez DEFinidos los nombres, podemos establecer el enlace con el ROUTE.

El ROUTE nos dice que los eventos emitidos por el exposedField diffuseColor del Material MaterialEsfera han de ser encaminados a (TO) el exposedField color del DirectionalLight Luz.

Como se puede observar, la forma de decir que eventIn, eventOut o exposedField es el que nos interesa tratar de un cierto nodo, es mediante un punto (.) que une el nombre del nodo al del campo (field)seleccionado.

NOTA: Este ejemplo, tal y como está, no tendría ningún efecto, ya que no hay nada que pueda hacer que el material envíe un evento a la luz. En el siguiente módulo veremos ejemplos plenamente funcionales.



< Anterior | Menú ^ | Siguiente >