Skip to content

Proximity Sensors

See this page in the Vizard Documentation for more information on Proximity Sensors

https://docs.worldviz.com/vizard/latest/#vizproximity.htm%3FTocPath%3DReference%7CProximity%20Sensors%7C_____1 

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)
Second Method (add 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