View Full Version : random walk in piazza environment
hi,
I would like to generate a random walk actions for the avatar in the piazza environment. I want the avatar to walk around the environment by itself (without pressing any key) and to perform some actions when it sees a red sphere.
I have tried to write some code, but the avatar is moving around an oval. I am really stuck .. I don't know how to do it.
this is the code:
import viz
import viztask
import vizact
viz.go()
viz.add('ground.osgb')
avatar = viz.addAvatar('vcc_male2.cfg',pos=[0,0,9])
avatar.state(1)
walkLeft = vizact.walkTo([2.5,0,9])
walkRight = vizact.walkTo([-2.5,0,9])
walkActions = viz.cycle([walkLeft,walkRight])
waitSpaceBar = viztask.waitKeyDown(' ')
waitLeft = viztask.waitActionEnd(avatar,walkLeft)
waitRight = viztask.waitActionEnd(avatar,walkRight)
waitActions = viz.cycle([waitLeft,waitRight])
def walkAndStopTask():
yield waitSpaceBar
while True:
condition = waitSpaceBar
walkAction = walkActions.next()
waitAction = waitActions.next()
while condition == waitSpaceBar:
avatar.runAction(walkAction)
d = yield viztask.waitAny([waitSpaceBar,waitAction])
condition = d.condition
if condition == waitSpaceBar:
avatar.clearActions()
yield waitSpaceBar
viztask.schedule(walkAndStopTask())
your support is highly appreciated
I have posted the wrong code. so plz ignore it. below is the right code.
I managed to simulate an avatar walking randomly. however, I wanted the avatar to pick up the cellphone when he reaches the red sphere. I have the code for that but I did not know how to do it in a simulated way (without pressing any key)
this is the code that I am working on:
import viz
import viznet
import vizinfo
import vizinput
import viztask
import vizact
import vizshape
import vizproximity
import vizmat
viz.go()
viz.go()
viz.MainView.setPosition([0,0.1,0])
viz.setMultiSample(4)
#Increase the Field of View
viz.MainWindow.fov(60)
#avatarRoot = viz.addGroup()
avatarRoot = viz.add('marker.wrl')
cameraLookAtNode = viz.addGroup(parent=avatarRoot, pos=[0, 1.5, 0])
avatar = viz.add('vcc_male.cfg', parent=avatarRoot)
#avatar.state(1)
#viz.collision(viz.ON)
piazza = viz.add('piazza.osgb')
sphere = vizshape.addSphere(radius=0.2)
sphere.setPosition(0,0,20)
sphere.color(viz.RED)
text = viz.addText('radiation source',parent=sphere)
text.setPosition([-0.3,0.3,0])
text.setScale([0.2]*3)
text.color(viz.RED)
text.visible(viz.ON)
text_2D = viz.addText('radiation source area', viz.SCREEN )
text_2D.setPosition(0,0,20)
text_2D.color(viz.RED)
t=text_2D.visible(viz.OFF)
tex = viz.addTexture('logo.jpg')
#maze = viz.add('tankmaze.wrl')
#def onKeyDown(key):
#if key == viz.iskeydown ('t' ):
walk1=vizact.walkTo([4,0,0])
walk2=vizact.walkTo([4,0,3])
walk3=vizact.walkTo([7,0,4])
walk4=vizact.walkTo([8.5,0,17])
walk5=vizact.walkTo([10,0,22])
walk6=vizact.walkTo([3,0,23])
#walk=vizact.walkTo([0,0,15])
def changeState() :
#Add the cellphone model
cell = viz.addChild('phone.3ds')
#Get the right hand bone of the avatar
hand = avatar.getBone('Bip01 R Hand')
#Link the cellphone to the hand
CellLink = viz.link(hand,cell)
#Tweek the cellphone link so it fits snuggly in the hand
CellLink.preTrans( [0.06,-0.08,0.08] )
CellLink.preEuler( [0,0,180] )
#thick = vizact.method()
walks=vizact.sequence(walk1,walk2, vizact.waittime(1),walk3, vizact.waittime(1),walk4, vizact.waittime(1),walk5,vizact.waittime(1),walk6)
viz.collision(viz.ON)
avatar.addAction(walks)
#Make the avatar use the cellphone when the 'w' key is pressed
#vizact.onkeydown('w',avatar.execute,15)
#vizact.onkeydown('t',walk)
#Register the callback which to call the 'onKeyDown' function.
#viz.callback(viz.KEYDOWN_EVENT,onKeyDown)
#Create proximity manager
manager = vizproximity.Manager()
#Add main viewpoint as proximity target
target = vizproximity.Target(avatar)
manager.addTarget(target)
sensor = vizproximity.Sensor( vizproximity.CircleArea(5),source=sphere)
manager.addSensor(sensor)
def EnterProximity(e):
text_2D.visible(viz.ON)
quad = viz.addTexQuad()
quad.setPosition([0,1,20])
quad.texture(tex) # The quad will now display the tree picture
spin=vizact.sequence(vizact.waittime(1), vizact.spin(0,1,0,20))
vizact.addCallback
quad.addAction(spin)
def ExitProximity(e):
text_2D.visible(viz.OFF)
manager.onEnter(sensor,EnterProximity)
manager.onExit(sensor,ExitProximity)
Frank Verberne
01-02-2014, 04:59 AM
Simply add
avatar.execute(15)
to the EnterProximity function. Now, your avatar will execute its 15th animation (in your case the useitem animation) when it nears the red sphere.
thanks it worked.
I have another question.
I replaced the avatar with the steve module and I added the move to action to the module, but I got this error:
player_matrix.aaddAction(walks)
AttributeError: 'Transform' object has no attribute 'addAction'
how can I simulate the movement of the steve as I did with the avatar in the code provided above?
thanks.
Frank Verberne
01-15-2014, 01:56 AM
You cannot add an action to a matrix. You can add an action to an avatar. Look carefully how you named the 3D-model of steve, and add the action to that model. That should solve your problem.
And there was a type in your addaction command, it was spelled aaddaction.
thanks it worked. however, I want to c what the steve module sees infront of him (what he is looking at).
I want it to be in this way as reflected in the upper right view:
this is the code:
import viz
import viznet
import vizinfo
import vizinput
import viztask
import vizact
import vizshape
import vizproximity
import vizmat
import steve
viz.setMultiSample(4)
viz.fov(60)
viz.go()
# Use the steve module to represent the other user.
# You will actually have no representation of yourself on your own monitor.
player_matrix = viz.Matrix()
avatar = steve.Steve()
avatar.setTracker(player_matrix)
# Add the world
maze = viz.addChild('piazza.osgb')
#Use a prompt to ask the user the network name of the other computer.
target_machine = vizinput.input('Enter the name of the other machine').upper()
#Add a mailbox from which to send messages. This is your outbox.
target_mailbox = viz.addNetwork(target_machine)
def sendPosition():
#Retrieve current transform of viewpoint
mat = viz.MainView.getMatrix()
#Send position/rotation to target network object
target_mailbox.send(action=updatePlayer, quat=mat.getQuat(), pos=mat.getPosition())
# Start a timer that sends out data over the network every frame
vizact.ontimer(0,sendPosition)
def updatePlayer(e):
player_matrix.setPosition(e.pos)
player_matrix.setQuat(e.quat)
# Listens for any incomming messages
def onNetwork(e):
if e.sender.upper() == target_machine:
e.action(e)
# Register network to listen from incomming messages
viz.callback(viz.NETWORK_EVENT, onNetwork)
# Create a new window in the upper left corner
UpperLeftWindow = viz.addWindow(pos=(0,1.0),size=(0.5,0.5))
UpperLeftWindow.visible(0,viz.SCREEN)
#Create a new window in the upper right corner
UpperRightWindow = viz.addWindow(pos=(0.5,1.0),size=(0.5,0.5))
UpperRightWindow.visible(0,viz.SCREEN)
# Create a new viewpoint
BirdView = viz.addView()
#Attach the bird's eye view to the upper left window
UpperLeftWindow.setView(BirdView)
#Move the view above the center of the room
BirdView.setPosition([0,25,0])
#Rotate the view so that it looks down
BirdView.setEuler([0,90,0])
#Create another viewpoint
RearView = viz.addView()
#Attach the rear view to the upper right window
UpperRightWindow.setView(RearView)
#Increase the field-of-view for both windows
UpperLeftWindow.fov(70)
UpperRightWindow.fov(60)
#Add an arrow marker to bird's eye view window to represent our current position/orientation
arrow = viz.addTexQuad(parent=viz.ORTHO,scene=UpperLeftWin dow,size=20)
arrow.texture(viz.add('arrow.tif'))
def UpdateViews():
#Get the current head orientation and position
yaw,pitch,roll = player_matrix.getEuler()
pos = player_matrix.getPosition()
#Move the rear view to the current position
RearView.setPosition(pos)
#Rotate the rear view so that it faces behind us
RearView.setEuler([yaw,0,0])
#Move arrow to our current location
x,y,z = UpperLeftWindow.worldToScreen(pos,mode=viz.WINDOW_ PIXELS)
arrow.setPosition([x,y,0])
arrow.setEuler([0,0,-yaw])
vizact.ontimer(0,UpdateViews)
# Turn on collision detection so we can't go through walls
#viz.collision(viz.ON)
walk1=vizact.moveTo([4,0,0])
walk2=vizact.moveTo([4,0,3])
walk3=vizact.moveTo([7,0,4])
walk4=vizact.moveTo([8.5,0,17])
walk5=vizact.moveTo([10,0,22])
walk6=vizact.moveTo([3,0,23])
walks=vizact.sequence(walk1,walk2, vizact.waittime(1),walk3, vizact.waittime(1),walk4, vizact.waittime(1),walk5,vizact.waittime(1),walk6)
#avatar.addAction(walks)
#avatar.addAction(vizact.walkTo([0,0,7]))
btw, I commented the "add action" .
thanx
Frank Verberne
01-15-2014, 03:20 AM
Not sure if this will work, but you could try:
viz.link(player_matrix, RearView)
it did not work.
what is happening know is that the movement of the steve module is linked with the mainview. so, when I move the mouse, the representation of the steve module moves as well.
basically what I want is to make the movement of Steve in a random way instead linking it with a mouse. this is done by the moveTo action. but, I want the user feel as if he is the one who is moving. I want the metal head cover to appear in the to right screen as it is the case for the mouse movement.
I hope it is clear.
thanx.
vBulletin® v3.8.7, Copyright ©2000-2024, vBulletin Solutions, Inc.