Hi all,
I have a simple CAVE navigator: You point the tracked wand in the direction you want to fly and push the joystick forward. It's implemented by linking the following to the CaveView object:
Code:
class SyzygyNagivator(viz.VizNode,viz.EventClass):
# __init__ omitted
def onUpdate(self,e):
currTime = time.clock()
elapsed = currTime - self.lastTime
if elapsed < .25:
# Get joystick X,Z values and threshold them
xMove = self.service.getAxis( self.xIndex )
if abs(xMove) < .25:
xMove = 0.
zMove = self.service.getAxis( self.zIndex )
if abs(zMove) < .25:
zMove = 0.
# Get wand orientation matrix
rotMat = szg.ar_extractRotationMatrix( self.service.getMatrix( self.matIndex ) )
# Compute rotated X, Z motion vectors
xVec = rotMat * szg.arVector3(0,0,zMove)
zVec = rotMat * szg.arVector3(xMove,0,0)
# Add them
vec = (xVec + zVec).toTuple()
# Displace by motion vector
currPos = gCaveView.getPosition()
newPos = vizmat.MoveAlongVector( currPos, vec, elapsed*self.speed )
self.setPosition( newPos )
self.lastTime = currTime
...which works fine for flying around in empty space. The catch is that in e.g. gallery.py, when I collide with a well the stored position keeps incrementing as long as I hold the joystick forward, even though the collision detection is keeping the viewpoint from moving forward. In other words, the CaveView object's position does not reflect the action of the collision-handling algorithm. Of course, when you reverse direction, nothing happens until the stored position gets back inside the gallery. What's the right way to do this, i.e. where is there a position that reflects the collision detection?