Sensores de Proximidad y "Tacto"

Tutorial de VRML97

Sensor de Proximidad

El sensor de proximidad es una herramienta muy interesante para poder hacer un seguimiento de los movimientos del observador en una zona concreta del entorno. El node ProximitySensor nos permite definir una zona en forma de caja centrada en una cierta posición del espacio, la cual detecte si el observador está dentro o fuera, en que instante entra o sale, etc.

A continuación damos un ejemplo donde un TimeSensor se enciende o se apaga en función de si el observador está dentro o fuera de una zona cúbica del espacio. Para ver como se enciende y se apaga el TimeSensor, enlazaremos nuestro ejemplo del Cubo Cambiante de Color del módulo anterior a un ProximitySensor que definiremos.

Ejemplo1: Sensor de proximidad enciende y apaga el cambio de color del cubo.

DEF motorColor TimeSensor{
	loop TRUE
	cycleInterval 5
}

DEF Arcoiris ColorInterpolator {
	key      [     0,   0.3,   0.6,     1]
	keyValue [ 1 0 0, 0 1 0, 0 0 1, 1 0 0]
}

DEF CuboColorCambiante Shape {
	geometry Box { size 2 2 2 }
	appearance Appearance { material DEF materialColorCambiante Material {} }
}

DEF ZonaActiva ProximitySensor {
	center 0 0 0
	size 8 8 8
}

ROUTE motorColor.fraction_changed TO Arcoiris.set_fraction
ROUTE Arcoiris.value_changed TO materialColorCambiante.diffuseColor

ROUTE ZonaActiva.isActive TO motorColor.enabled

Los elementos nuevos (respecto al ejemplo del módulo anterior) son el sensor de proximidad ZonaActiva que define una zona de 8x8x8 unidades centrada en el origen (0,0,0), y el último ROUTE que connecta el eventOut isActive del sensor de proximidad con el exposedField enabled del sensor de tiempo.

Este conjunto, detecta si el observador está fuera o dentro de la zona comprendida entre los planos X = 4 y X = -4, Y = 4 y Y = -4 y Z = 4 y Z = -4. Si el observador está fuera, el sensor de proximidad emite un evento de isActive = FALSE y por lo tanto el ROUTE lo canaliza hacia desactivar el sensor de tiempo a través del exposedField enabled (donde enabled significa activado en inglés). Si el observador está dentro, el sensor de proximidad emite un evento de isActive = TRUE y por lo tanto el ROUTE lo canaliza hacia activar el sensor de tiempo.

De esta manera, el cambio de color queda congelado mientras el observador está fuera de la zona y vuelve a variar cuando el observador entra.

Ejercicios propuestos:

Puerta Eléctrica.
Diseñar una puerta que se abre y se cierra con una "célula fotoeléctrica".
Comentarios
  • Utilitzar tan solo primitivas para modelar las partes.
  • Utilitzar un PositionInterpolator.
  • Implementar la "célula fotoeléctrica" con un ProximitySensor.
Solución propuesta: porta.wrl.

Sensor de "Tacto"

Antes que nada, es importante aclarar que el nombre de "tacto" es del todo inapropiado para este sensor. En inglés se define como node TouchSensor que es el que realmente resulta desafortunado, la traducción sencillamente sufre del original.

Lo que este sensor hace en realidad es permitir detectar cuando el observador apunta a un objeto con el cursor y cuando oprime el botón del raton. Por lo tanto permite definir "botones 3D".

Para ver como funciona, modificaremos el ejemplo anterior y ahora el cambio de color del cubo comenzará cuando se "clique" sobre el cilindro rojo en primer plano.

Ejemplo2: Sensor de tacto enciende el cambio de color del cubo.

DEF motorColor TimeSensor{
	loop TRUE
	cycleInterval 5
	enabled FALSE
}

DEF Arcoiris ColorInterpolator {
	key      [     0,   0.3,   0.6,     1]
	keyValue [ 1 0 0, 0 1 0, 0 0 1, 1 0 0]
}

DEF CuboColorCambiante Shape {
	geometry Box { size 2 2 2 }
	appearance Appearance { material DEF materialColorCambiante Material {} }
}

DEF BotonVerde Transform {
	translation 0 -1 7
	children [
		Shape {
			geometry Cylinder { height 0.1 radius 1 }
			appearance Appearance { material Material { diffuseColor 0 1 0 } }
		}
		DEF SensorBotonVerde TouchSensor { }
	]
}

ROUTE motorColor.fraction_changed TO Arcoiris.set_fraction
ROUTE Arcoiris.value_changed TO materialColorCambiante .diffuseColor

ROUTE SensorBotonVerde.isActive TO motorColor.enabled

Mientras se esté apretando el "botón verde", el sensor de tacto va emitiendo eventos de que está activo y se encaminan hacia el sensor de tiempo que activa el cambio de color. Al dejar de apretar, el sensor de tacto envía eventos de inactividad y para el sensor de tiempo, parándose así el cambio de color.

Es curioso notar que el sensor de tacto ha de ser agrupado júntamente con los objetos que servirán de botón, dentro de algún node de agrupación , para que el VRML sepa que objetos estarán activos al apretar el botón el usuario. Por esta razón hemos definido el sensor de tacto SensorBotonVerde como "hermano" del cilindro que define la geometría del botón dentro del node agrupador BotonVerde Transform.

Exercicios propuestos:

Apretar un botón UNA sola vez.
Modifiar el ejemplo de arriba de manera que una vez apretado el botón, el cambio de color ya no se pare.
Comentarios
  • Utilitzar el exposedField SFTime touchTime del sensor de tacto.
  • Utilitzar el exposedField SFTime startTime del sensor de tiempo.
Solución propuesta: boto.wrl.
Ascensor.
Implementar un ascensor utilizando sensores de proximidad y de tacto.
Comentarios
  • Utilitzar tan solo primitivas para modelar los objetos.
  • Implementar dos botones dentro del ascensor (uno para subir y el otro para bajar).
  • No hace falta que implementeis botones exteriores para llamar al ascensor (supondremos que siempre estamos en el piso donde está el ascensor).
  • Es importante no permitir la acción de subir cuando ya se esté arriba ni bajar cuando se esté abajo.
  • El observador (es decir, el punto de vista) debe subir y bajar con el ascensor.
  • El ascensor no debe poder ser activado desde furera.
  • Se recomienda hacer más de dos pisos para dar la sensación de movimiento arriba y abajo, pero el ascensor siempre irá del piso inferior al superior y viceversa (nunca se parará en los pisos intermedios).
Solución propuesta: ascensor.wrl.




< Anterior | Menú ^ | Siguiente >