PDA

View Full Version : random walk in piazza environment


maya
12-15-2013, 08:37 AM
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

maya
12-16-2013, 11:53 AM
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.

maya
01-15-2014, 01:44 AM
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.

maya
01-15-2014, 02:44 AM
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)

maya
01-15-2014, 04:58 AM
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.