Sensors de Proximitat i "Tacte"

Tutorial de VRML97

Sensor de Proximitat

El sensor de proximitat és una eina molt interessant per a poder fer un seguiment dels moviments de l'observador en una certa zona de l'entorn. El node ProximitySensor ens permet definir una zona en forma de caixa centrada en una certa posició de l'espai, la qual detecte si l'observador és dins o fora, en quin instant entra o surt, etc.

A continuació donem un exemple on un TimeSensor s'engega o s'apaga en funció de si l'observador és dins o fora d'una zona cúbica de l'espai. Per a veure com s'engega i s'apaga el TimeSensor, enllaçarem el nostre exemple del Cub Canviant de Color del mòdul anterior a un ProximitySensor que definirem nou.

Exemple1: Sensor de proximitat engega i apaga el canvi de color del cub.

DEF motorColor TimeSensor{
	loop TRUE
	cycleInterval 5
}

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

DEF CubColorCanviant Shape {
	geometry Box { size 2 2 2 }
	appearance Appearance { material DEF materialColorCanviant Material {} }
}

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

ROUTE motorColor.fraction_changed TO Arc_Sant_Marti.set_fraction
ROUTE Arc_Sant_Marti.value_changed TO materialColorCanviant.diffuseColor

ROUTE ZonaActiva.isActive TO motorColor.enabled

Els elements nous són el sensor de proximitat ZonaActiva que defineix una zona de 8x8x8 unitats centrada en l'origen (0,0,0), i l'últim ROUTE que connecta el eventOut isActive del sensor de proximitat amb el exposedField enabled del sensor de temps.

Aquest conjunt, detecte si l'observador és fora o dintre de la zona compresa entre els plans X = 4 i X = -4, Y = 4 i Y = -4 i Z = 4 i Z = -4. Si l'observador és fora, el sensor de proximitat emet un esdeveniment de isActive = FALSE i per tant el ROUTE ho canalitza cap a desactivar el sensor de temps a través del exposedField enabled (on enabled vol dir activat en anglès). Si l'observador és dintre, el sensor de proximitat emet un esdeveniment de isActive = TRUE i per tant el ROUTE ho canalitza cap a activar el sensor de temps.

D'aquesta manera, el canvi de color queda congelat mentre l'observador és fora de la zona i torna a variar quan l'observador entra.

Exercicis proposats:

Porta Elèctrica.
Dissenyeu una porta que s'obre i es tanca amb una "cel.lula fotoelèctrica".
Comentaris
  • Utilitzeu tant sols primitives per a modelar les parts.
  • Utilitzeu un PositionInterpolator.
  • Implementeu la "cel.lula fotoelèctrica" amb un ProximitySensor.
Solució proposada: porta.wrl.

Sensor de "Tacte"

Abans que res, cal dir que el nom de "tacte" és del tot inapropiat pel que fa aquest sensor. En anglès es defineix com a node TouchSensor que és el que realment és desafortunat, la traducció senzillament pateix de l'original.

El que en realitat fa aquest sensor és permetre detectar quan l'observador apunta a un objecte amb el cursor i quan prem el botó del ratolí. Per tant, permet definir "botons 3D".

Per veure com funciona, modificarem l'exemple anterior i ara el canvi de color del cub començarà quan es pitji sobre el cilindre verd en primer pla.

Exemple2: Sensor de tacte engega el canvi de color del cub.

DEF motorColor TimeSensor{
	loop TRUE
	cycleInterval 5
	enabled FALSE
}

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

DEF CubColorCanviant Shape {
	geometry Box { size 2 2 2 }
	appearance Appearance { material DEF materialColorCanviant Material {} }
}

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

ROUTE motorColor.fraction_changed TO Arc_Sant_Marti.set_fraction
ROUTE Arc_Sant_Marti.value_changed TO materialColorCanviant.diffuseColor

ROUTE SensorBotoVerd.isActive TO motorColor.enabled

Mentre s'estigui prement el "boto verd", el sensor de tacte va emetent esdeveniments de que està actiu i s'encaminen cap al sensor de temps que activa el canvi de color. En deixar de prémer, el sensor de tacte envia esdeveniments d'inactivitat i atura el sensor de temps, aturant així el canvi de color.

És curiós notar que el sensor de tacte ha de ser agrupat juntament amb els objectes que serviran de botó, dintre d'algun node d'agrupació, per tal que el VRML sàpiga quins objectes estaran actius al pitjat de l'usuari. Per això hem definit el sensor de tacte SensorBotoVerd com a "germà" del cilindre que defineix la geometria del botó dins el node agrupador BotoVerd Transform.

Exercicis proposats:

Prémer botó UN sol cop.
Modifiqueu l'exemple de dalt de manera que un cop premut el botó, el canvi de color ja no s'aturi.
Comentaris
  • Utilitzeu el exposedField SFTime touchTime del sensor de tacte.
  • Utilitzeu el exposedField SFTime startTime del sensor de temps.
Solució proposada: boto.wrl.
Ascensor.
Implementeu un ascensor utilitzant sensors de proximitat i de tacte.
Comentaris
  • Utilitzeu tan sols primitives per a modelar els objectes.
  • Implementeu dos botons dins l'ascensor (un per a pujar i l'altre per a baixar).
  • No cal que implementeu botons exteriors per a cridar l'ascensor (suposarem que sempre estem en el pis on hi ha l'ascensor).
  • Cal que no es pugui pujar quan ja es sigui a dalt ni baixar quan se sigui a baix.
  • Cal que l'observador puji i baixi amb l'ascensor.
  • Cal que l'ascensor no pugui ser activat des de fora.
  • Es recomana fer més de dos pisos per a donar la sensació de moviment amunt i avall, però l'ascensor sempre anirà del pis inferior al superior i viceversa (mai no s'aturarà en els pisos intermitjos).
Solució proposada: ascensor.wrl.




< Anterior | Menú ^ | Següent >