Proximity Sensors
See this page in the Vizard Documentation for more information on Proximity Sensors
Use the vizproximity library to detect proximity between Vizard objects and trigger events whenever a target enters or exits a sensor’s range. The library provides three main classes:
- Sensor – Monitors an area or volume in your scene.
- Target – Represents any linkable object (e.g., node, view, tracker, bone) whose position is checked against the sensor.
- Manager – Oversees a collection of sensors and targets, automatically triggering events when a target crosses a sensor boundary.
For a quick introduction, see the example script ExampleScripts/Proximity Sensors/proximitySensors_example.py
.
If you’re using SightLab 2.1.1 or higher, check out proximitySensors_Areas.py
and proximitySensors_Areas2.py
. These scripts demonstrate how you can place a proximity_area.osgb
object (from sightlab_resources/objects
) directly in a 3D scene, then move, rotate, or scale it. The object automatically updates its sensor area based on the transformations you apply.
import vizinput
import vizshape
import sightlab_utils.sightlab as sl
from sightlab_utils.settings import *
sightlab = sl.SightLab(gui = False)
sightlab.headLight.enable()
env = vizfx.addChild('sightlab_resources/environments/DeckersOffice.OSGB')
sightlab.setEnvironment(env)
# Create objects
ball = vizshape.addSphere(radius= 0.1)
ball.color(viz.BLUE)
ball.setPosition(0,1.5,2)
audio1 = viz.playSound('sightlab_resources/audio/beep.wav',viz.SOUND_PRELOAD)
import vizproximity
manager = vizproximity.Manager()
# Add main viewpoint as proximity target
target = vizproximity.Target(viz.MainView)
manager.addTarget(target)
#Add hand or finger as second target
avatar= vizconnect.getAvatar()
rhand = avatar.getAttachmentPoint('r_hand').getNode3d()
rhand_target = vizproximity.Target(rhand)
lhand = avatar.getAttachmentPoint('l_hand').getNode3d()
lhand_target = vizproximity.Target(lhand)
manager.addTarget(lhand_target)
manager.addTarget(rhand_target)
#Add sensors. Replace the ball with whatever you want to use as a sensor
BallSensor = vizproximity.addBoundingSphereSensor(ball)
manager.addSensor(BallSensor)
# Add circle area
shape = vizproximity.Sensor( vizproximity.RectangleArea([1,1],center=[0,0.5]), None )
manager.addSensor(shape)
# Register callbacks for proximity sensors
def EnterProximity(e):
viz.playSound('sightlab_resources/audio/beep.wav')
print('Entered Sensor')
def ExitProximity(e):
print('Exited Sensor')
manager.onEnter(None, EnterProximity)
manager.onExit(None, ExitProximity)
def activateBallSensor(e):
viz.playSound('sightlab_resources/audio/beep.wav')
print('sensor entered')
manager.onEnter(BallSensor,activateBallSensor)
# Press "d" to toggle debug shapes
manager.setDebug(True)
vizact.onkeydown('d',manager.setDebug,viz.TOGGLE)
def sightLabExperiment():
while True:
yield viztask.waitKeyDown(' ')
yield sightlab.startTrial()
yield vizproximity.waitEnter(BallSensor,rhand_target)
print('hand sensor activated')
yield viztask.waitKeyDown(' ')
yield sightlab.endTrial()
viztask.schedule(sightlab.runExperiment)
viztask.schedule(sightLabExperiment)
viz.callback(viz.getEventID('ResetPosition'), sightlab.resetViewPoint)
proximity_area.osgb
to a 3D scene in the scene editor, move, rotate and scale it how you want. To add multiple sensors add the same object and name the geode a different name (i.e. geode1, geode2, etc.). Can right click and choose "Rename".
import sightlab_utils.sightlab as sl
from sightlab_utils.settings import *
from sightlab_utils import proximityAreaPlacer
sightlab = sl.SightLab(gui = False)
env = vizfx.addChild("Resources/environment/maze.osgb")
sightlab.setEnvironment(env)
sensor1 = proximityAreaPlacer.placeProximity(env, 'proximity_geode1')
sensor2 = proximityAreaPlacer.placeProximity(env, 'proximity_geode2')
# Register callbacks for proximity sensors
def EnterProximity1(e):
print('Entered Sensor1')
def ExitProximity1(e):
print('Exited Sensor1')
proximityAreaPlacer.manager.onEnter(sensor1, EnterProximity1)
proximityAreaPlacer.manager.onExit(sensor1, ExitProximity1)
def EnterProximity2(e):
print('Entered Sensor2')
def ExitProximity2(e):
print('Exited Sensor2')
proximityAreaPlacer.manager.onEnter(sensor2, EnterProximity2)
proximityAreaPlacer.manager.onExit(sensor2, ExitProximity2)
def sightLabExperiment():
while True:
yield viztask.waitKeyDown(' ')
yield sightlab.startTrial()
yield viztask.waitKeyDown(' ')
yield sightlab.endTrial()
viztask.schedule(sightlab.runExperiment)
viztask.schedule(sightLabExperiment)
viz.callback(viz.getEventID('ResetPosition'), sightlab.resetViewPoint)
For more information see Vizard Documentation on Proximity Sensors