Sensores de Visibilidad y Movimiento

Tutorial de VRML97

Sensor de Visibilidad

Este sensor, en principio, solo sirve para cuestiones de optimización. Por ejemplo, si tenemos muchos elementos en movimiento en nuestro entorno, el rendimiento de navegación puede ser bastante bajo. Pero si hacemos que los objetos solo se muevan cuando entren en nuestro campo de visión, mejoraremos el rendimiento por que solo se moverá aquello que realmente es necesario.

Esto se puede hacer, definiendo una zona en forma de caja alrededor de los objetos. El sensor de visibilidad node VisibilitySensor nos permite definir esta caja invisible, centrada en un cierto punto. Cuando esta caja entra en nuestro rango de visión , entonces el sensor de visibilidad se activa y emite un evento.

Ejemplo1: Sensor de visibilidad.

Transform {
	translation -5 8 3
	children Shape {
		geometry Sphere { radius 2 }
		appearance Appearance { ... }
	}
}

VisibilitySensor {
	center -5 8 3
	size 4 4 4
}

Aunque este ejemplo no es funcional, nos muestra como definir la caja de visibilidad alrededor de un objeto. Como la esfera está centrada en el punto (-5 8 3) y tiene un radio de 2 unidades, entonces hemos de centrar la caja de visibilidad en el mismo punto y dar-le unas medidas de 4x4x4 parr que englobe toda la esfera.

Sensores de Movimiento

Estos sensores permiten incidir sobre las traslaciones y rotaciones de objetos directamente e individualmente, sin tener que modificar toda la escena con las interficies del browser.

Hay tres tipos de sensores de movimiento (o "drag sensors " en Inglés):

node PlaneSensor

Este sensor permite mapear los movimientos 2D del cursor de pantalla, en movimientos 2D sobre el plano XY del sistema de coordenadas del sensor. El sensor se activa cuando se oprime sobre el objeto activo y, sin soltar el botón del ratón, se mueve el cursor. Entonces, los movimientos del cursor se pueden aplicar sobre el objeto mediante un ROUTE. Veamos un ejemplo donde un cubo verde es el objeto activo y tenemos un cubo naranja de referencia, inactivo.

Ejemplo1: Sensor de Movimiento en un Plano.

Transform { # Cubo de referencia
	translation -3 0 0
	children Shape {
		geometry Box { size 2 2 2 }
		appearance Appearance { 
			material Material { diffuseColor 0.7 0.3 0 }
		}
	}
}

Group {
	children [
		DEF Cubo Transform {
			children Shape {
				geometry Box { size 2 2 2 }
				appearance Appearance { 
					material Material { diffuseColor 0 0.7 0.3 }
				}
			}
		}
		DEF PS PlaneSensor { }
	]
}

ROUTE PS.translation_changed TO Cubo.translation

Observad como este sensor se define de forma parecida al sensor de tacto visto en el módulo anterior, es decir, debe definirse como "hermano" de los objetos que han de ser activos.

A continuación veremos un ejemplo donde el cubo naranja es el activo, pero el que se mueve es el verde.

Ejemplo2: Sensor de Movimiento en un Plano, donde el objeto activo es diferente al que se mueve.

Group {
	children [
		Transform { # Cubo activo
			translation -3 0 0
			children Shape {
				geometry Box { size 2 2 2 }
				appearance Appearance { 
					material Material { diffuseColor 0.7 0.3 0 }
				}
			}
		}
		DEF PS PlaneSensor { }
	]
}

DEF Cubo Transform { # Cubo que se mueve
	children Shape {
		geometry Box { size 2 2 2 }
		appearance Appearance { 
			material Material { diffuseColor 0 0.7 0.3 }
		}
	}
}

ROUTE PS.translation_changed TO Cubo.translation

Como se puede observar, el mapeo hecho con el ROUTE no ha variado, pero hemos puesto el sensor de movimiento en el plano, agrupado con el otro cubo (el naranja).

node CylinderSensor

Este sensor permite mapear los movimientos 2D del cursor de pantalla, en rotaciones alrededor del eje Y del sistema de coordenadas del sensor. El sensor se activa cuando se oprime sobre el objeto activo y sin soltar el botón del ratón, se mueve el cursor. Entonces, los movimientos del cursor se pueden reflejar sobre el objeto mediante un ROUTE. Veamos el ejemplo del cubo verde modificado.

Ejemplo3: Sensor de Movimiento Cilíndrico.

Transform { # Cubo de referencia
	translation -3 0 0
	children Shape {
		geometry Box { size 2 2 2 }
		appearance Appearance { 
			material Material { diffuseColor 0.7 0.3 0 }
		}
	}
}

Group {
	children [
		DEF Cubo Transform {
			children Shape {
				geometry Box { size 2 2 2 }
				appearance Appearance { 
					material Material { diffuseColor 0 0.7 0.3 }
				}
			}
		}
		DEF CS CylinderSensor { }
	]
}

ROUTE CS.rotation_changed TO Cubo.rotation

Observad como este sensor se define de forma parecida al sensor de tacto visto en el módulo anterior, es decir, debemos definirlo como "hermano" de los objetos que han de ser activos.

node SphereSensor

Este sensor permite mapear los movimientos 2D del cursor de pantalla, en rotaciones alrededor del origen de coordenadas. El sensor se activa cuando se oprime sobre el objeto activo y sin soltar el botón del ratón, se mueve el cursor. Entonces, los movimientos del cursor se pueden reflejar sobre el objeto mediante un ROUTE. Veam el ejemplo del cubo verde modificado.

Ejemplo4: Sensor de Movimiento Esférico.

Transform { # Cubo de referencia
	translation -3 0 0
	children Shape {
		geometry Box { size 2 2 2 }
		appearance Appearance { 
			material Material { diffuseColor 0.7 0.3 0 }
		}
	}
}

Group {
	children [
		DEF Cubo Transform {
			children Shape {
				geometry Box { size 2 2 2 }
				appearance Appearance { 
					material Material { diffuseColor 0 0.7 0.3 }
				}
			}
		}
		DEF SS SphereSensor { }
	]
}

ROUTE SS.rotation_changed TO Cubo.rotation

Observad como este sensor se define de forma parecida al sensor de tacto visto en el módulo anterior, es decir, debemos definirlo como "hermano" de los objetos que han de ser activos.



Ejercicios propuestos:

Control de un Objeto
Definir tres objetos que sirvan de íconos y de sensores de movimiento en el plano, rotación cilíndrica y rotación esférica para muver otro objeto que escojais.
Comentarios
  • Utilizad solo primitivas para modelar los objetos.
Solución propuesta : sensores .wrl.




< Anterior | Menú ^ | Siguiente >