En VRML97 disponemos de una herramienta muy potente, el Sensor de Tiempo ( TimeSensor). Este es un reloj que podemos utilizar a nuestro antojo para poder aprovechar el paso del tiempo como motor para mover objetos, cambiar color de objetos, variar orientaciones, etc.
Imaginemos que queremos que un objeto gire alrededor de uno de sus ejes conforme va pasando el tiempo. Tenemos un reloj que a cada "tic-tac" podemos definir que nos ayude a variar alguna cosa de nuestro entorno con una cierta frecuencia. Si de algún modo pudiéramos redirigir el paso del tiempo, que ha ocurrido en el reloj, para poder variar la rotación de un objeto, ya lo tendríamos solucionado.
Un TimeSensor se basa en el reloj real de sistema, midiendo el tiempo actual en segundos transcurridos a partir de las 00:00 horas del 1º de Enero del 1970.
Veamis algunos ejemplos de TimeSensor con efectos distintos:
|
Ejemplo1: Se inicia y realiza un ciclo de 5 segundos.
|
Este TimeSensor se inicia al cargarse el entorno en el visualizador
y se para al cabo de 5 segundos. Un TimeSensor da constantemente,
como evento de salida (eventOut), la fracción de ciclo
que ha transcurrido. Esto lo hace mediante el eventOut SFFloat fraction_changed
que es un valor entre 0.0 y 1.0. La duración del ciclo se define en segundos
en el exposedField SFTime cycleInterval que en este caso hemos
definido a 5 segundos. Es decir, el TimeSensor tardará
5 segundos en pasar el valor de fraction_changed de 0.0 a 1.0.
Al haber transcurrido los 5 segundos, y por lo tanto haber llegado a 1.0 el
valor de fraction_changed, el TimeSensor dejará
de modificar el fraction_changed y se parará.
|
Ejemplo2: Se inicia y va realizando ciclos de 5 segundos sin pararse.
|
Ahora, al haber transcurrido los primeros 5 segundos y haber llegado a 1.0 el valor de fraction_changed, como hemos definido que realice bucles con el loop TRUE, el sensor volverá a empezar un nuevo ciclo. Esto lo irá realizando sin pararse hasta que carguemos un entorno nuevo en el visualizador o bien apaguemos el visualizador.
Para poder aprovechar el paso del tiempo que nos va dando el TimeSensor, debemos utilizar los interpoladores que pasamos a ver a continuación.
La interpolación lineal (que es la que utiliza VRML97) és un concepto matemático que permite definir dos puntos (en cualquier dimensión) y calcular un punto intermedio sobre la recta que los une a partir de especificar el tanto porciento del recorrido entre los dos puntos.
Para saber que es un interpolador...
En VRML97 hay seis tipos de interpoladores:
Para ver como funcionan empezaremos por el interpolador de colores. Lo que
vamos a hacer es que un objeto vaya cambiando de color de forma gradual, empezando
por el rojo y terminando en el verde. Tengamos en cuenta que segun la forma
de definir colores RGB (valores entre 0 y 1) el rojo es el (1 0 0) y el verde
es el (0 1 0).
|
Así pues, definimos nuestro interpolador de colores como:
|
Con esta definición, estamos diciendo que queremos que cunado el interpolador empiece (0% del trayecto, key=0) nos dé el color rojo, keyValue=(1 0 0), y cuando termine (100% del trayecto, key=1) nos dé el color verde, keyValue=(0 1 0).
El interpolador deberá ir cambiando el valor de key gradualmente y en función de este valor, ir calculando el valor del color de keyValue. Por ejemplo, cuando sea key=0.5, obtendrá el valor de keyValue=(0.5 0.5 0) que es un tono amarillo medio.
Pero no sólo se puede dar un tramo de interpolación. Podríamos
decir que empiece en rojo, a continuación pase por verde, después
llegue a azul y finalmente vuelva a rojo.
|
Ahora tenemos tres tramos de cambio de color y por lo tanto definimos
nuestro interpolador de colores de la siguiente forma:
|
Con esta definición estamos determinando que cuando el interpolador empiece (0% del trayecto, key=0) nos dé el color rojo, keyValue=(1 0 0). Cuando llegue a key=0.3 (aproximadamente un tercio del trayecto) nos dé color verde, keyValue=(0 1 0). Al llegar a key=0.6 (aprox. dos tercios) nos de color azul, keyValue=(0 0 1) y, finalmente, cuando termine (100% del trayecto, key=1) nos dé color rojo de nuevo, keyValue=(1 0 0).
Así, si tenemos definido un material que aplicamos a un objeto, podemos hacer que el interpolador vaya modificando el valor del field de este material (ver Materiales) y por lo tanto nos vaya cambiando el color del objeto al que lo aplicamos. Así pues, haremos un ROUTE desde un evento de salida del interpolador al evento de entrada diffuseColor del material.
Pero qué es lo que hace que el interpolador vaya pasando del valor inicial al final de forma gradual? Pues el paso del tiempo de un TimeSensor como los que hemos introducido arriba. Aquí también tendremos que hacer un ROUTE entre el tiempo del TimeSensor y el cambio de tanto por ciento del interpolador (es decir, el key).
Las "rutas" que hemos visto en el módulo anterior nos enlazan los valores
que irán modificando nuestro entorno con los sensores de tiempo y los
interpoladores. Veamos como funcionaría nuestro ejemplo completo de un
objeto que va cambiando de color:
|
Exemple3: Cub cambiando
de color.
|
Analicemos que hace este código:
Del mismo modo en que hemos enlazado un TimeSensor a un ColorInterpolator,
lo podemos hacer para cualquier otro interpolador.
Ejercicios propuestos:
|
Para acabar mirad estas dos propuestas, una es la unión de la noria
y el carrucel, el otro es una versión sofisticada de la noria, la geometria
de la cual se ha modelado en 3D Max: park.wrl
y siniasof.wrl.