![]() |
|
#1
|
|||
|
|||
|
animation pausing problem
Hi,
I've got a program where a bunch of avatars are supposed to be walking around a city doing mundane things (window shopping, talking with someone, etc.) My problem is that the avatars that I have just walking around the city block pause any time they reach a checkpoint in their animation path and they go back to their default state for a moment until they start walking again. I've tried a few tricks to get them to smooth out, but I can't figure out how to get them to just walk around. Here's the relevant code Code:
males = []
females = []
walking = []
whichturn = 0
#List the timers.
WALKING = 0
for i in range(2):
male = viz.add('male.cfg')
male.translate(i,0,0)
male.visible(0,'male_head.cmx')
male.face(maleheads[i])
clothes = viz.add(maleclothes[i])
for j in bodyparts:
male.texture(clothes,j)
males.append(male)
for i in range(2):
female = viz.add('female.cfg')
female.translate(i,0,0)
females.append(female)
#Set up paramters for walking guy.
males[0].translate(0,0,-5)
males[0].rotate(0,1,0,-90)
males[0].whichturn = 0
males[0].set = [[1.5,0,-5],[1.5,0,15],[5,0,15],[-5,0,-5]]
males[0].end = 4
walking.append(males[0])
#Set up paramters for walking girl.
females[0].translate(1,0,-7)
females[0].rotate(0,1,0,-90)
females[0].whichturn = 0
females[0].set = [[1.5,0,0],[1,0,15],[2,0,15],[-5,0,-5]]
females[0].end = 3
walking.append(females[0])
def onkeydown(key):
if key == '0':
viz.starttimer(WALKING, .1, viz.PERPETUAL)
def ontimer(num):
global gravity, timebomb
if num == DRIVING:
for agent in driving:
path.play()
if num == WALKING:
for agent in walking:
agentposition = agent.get(viz.POSITION)
agentgap = vizmat.Distance(agentposition, agent.set[agent.whichturn])
if agentgap < .1:
agent.whichturn += 1
if agent.whichturn == agent.end:
agent.whichturn = 0
walk = vizact.walkto(agent.set[agent.whichturn][0],agent.set[agent.whichturn][1],agent.set[agent.whichturn][2])
agent.addAction(walk)
|
|
#2
|
|||
|
|||
|
Please post an example that reproduces the issue and I can run without having to alter the code.
The viztask module may be helpful to control your program flow if you have the avatars doing one thing after another. |
|
#3
|
|||
|
|||
|
Code:
import viz
import math
import vizmat
import vizinfo
import vizact
viz.go(viz.FULLSCREEN)
#adds the ppt
PORT_PPT = 1
ppt = viz.add('vizppt.dls')
ppt.command(3,"",3,1,3) #scales ppt tracking on xyz axis
viz.eyeheight(0)
#collisions on
#viz.collision(viz.ON)
view = viz.get(viz.MAIN_VIEWPOINT)
view.rotate(0,1,0,90)
viz.MainView.collision(viz.ON)
#This function is called when a collision occurs
#def mycollision(info):
#print 'Collided', info.object
#Create a callback for a collision event
#viz.callback(viz.COLLISION_EVENT, mycollision)
PORT_INTERSENSE = 2
isense = viz.add('intersense.dls')
tracker = viz.add('intersense.dls')
viz.tracker()
tracker.reset()
#Add the street and drop it a little bit to be below the avatars feet.
street = viz.add('objects/bspcity.bsp')
street.translate(0,-.2,0)
males = []
females = []
walking = []
whichturn = 0
#List the timers.
WALKING = 0
MALEMEETING = 3
FEMALEMEETING = 4
THROWINGMAN =7
HOLDVIEW = 8
TIMING = 9
#Add the heads for the males.
maleheads = ['Male/heads/M-015-2L.vzf','Male/heads/M-056L.vzf', 'Male/heads/M-063L.vzf']
femaleheads = []
bodyparts = ['male_legs.cmx','male_torso_LS.cmx','male_shoes.cmx']
maleclothes = ['Male/clothes/male1.jpg','Male/clothes/male2.jpg','Male/clothes/male3.jpg']
#Make some avatars.
for i in range(2):
male = viz.add('male.cfg')
male.translate(i,0,0)
male.visible(0,'male_head.cmx')
male.face(maleheads[i])
clothes = viz.add(maleclothes[i])
for j in bodyparts:
male.texture(clothes,j)
males.append(male)
for i in range(2):
female = viz.add('female.cfg')
female.translate(i,0,0)
females.append(female)
#Set up paramters for walking guy.
males[0].translate(0,0,-5)
males[0].rotate(0,1,0,-90)
males[0].whichturn = 0
males[0].set = [[1.5,0,-5],[1.5,0,15],[5,0,15],[-5,0,-5]]
males[0].end = 4
walking.append(males[0])
#Set up paramters for walking girl.
females[0].translate(1,0,-7)
females[0].rotate(0,1,0,-90)
females[0].whichturn = 0
females[0].set = [[1.5,0,0],[1,0,15],[2,0,15],[-5,0,-5]]
females[0].end = 4
walking.append(females[0])
#Add car.
car = viz.add('mini.osgx')
#set car stuff
car.translate(-1.5,0,8)
car.rotate(0,1,0,180)
#for x in range(0,len(positions)):
#cp = viz.add(viz.CONTROL_POINT)
#cp.setPosition(positions[x])
#path.add(cp,x+1)
#Set up for meeting.
males[1].translate(-9,0,21)
females[1].translate(2,0,7)
females[1].state(1)
malemoves = [2,2,4,4,2,4,4,4,4,4,4,2,2,12]
femalemoves = [6,5,12,12,1]
females[1].rotate(0,1,0,-55)
males[1].rotate(0,1,0,135)
males[1].state(1)
#Set up for timing.
timebomb = 0
def onkeydown(key):
if key == '0':
viz.starttimer(WALKING, .1, viz.PERPETUAL)
if key == '9':
females[1].addAction(6)
males[1].goto(1.6,0,7.7)
females[1].spinto(0,1,0,-55)
females[1].state(12)
viz.starttimer(MALEMEETING,.1)
viz.starttimer(FEMALEMEETING,.1)
if key == '8':
viz.starttimer(THROWINGMAN,.1)
if key == '7':
viz.starttimer(DRIVING,.1)
if key == 's':
print 's'
viz.starttimer(TIMING,1, viz.PERPETUAL)
def ontimer(num):
global gravity, timebomb
if num == WALKING:
for agent in walking:
agentposition = agent.get(viz.POSITION)
agentgap = vizmat.Distance(agentposition, agent.set[agent.whichturn])
if agentgap < .1:
agent.whichturn += 1
if agent.whichturn == agent.end:
agent.whichturn = 0
walk = vizact.walkto(agent.set[agent.whichturn][0],agent.set[agent.whichturn][1],agent.set[agent.whichturn][2])
agent.addAction(walk)
if num == MALEMEETING:
if len(malemoves)>1:
animation = malemoves.pop(0)
duration = males[1].getduration(animation)
males[1].execute(animation)
viz.starttimer(MALEMEETING, duration-.15)
else:
animation = malemoves.pop(0)
males[1].state(animation)
if num == FEMALEMEETING:
if len(femalemoves)>1:
animation = femalemoves.pop(0)
duration = females[1].getduration(animation)
females[1].execute(animation)
viz.starttimer(FEMALEMEETING, duration-.15)
else:
animation = femalemoves.pop(0)
females[1].state(animation)
if num == THROWINGMAN:
males[2].execute(9)
males[2].execute(1)
viz.starttimer(THROWINGMAN, 10)
if num == HOLDVIEW:
view.translate(-8.5,1.5,-2)
if num == TIMING:
print timebomb
timebomb += 1
if timebomb == 1:
onkeydown('0')
elif timebomb == 3:
onkeydown('8')
elif timebomb == 10:
onkeydown('9')
elif timebomb == 20:
onkeydown('3')
elif timebomb == 30:
onkeydown('1')
elif timebomb == 80:
viz.quit()
viz.callback(viz.TIMER_EVENT,ontimer)
viz.callback(viz.KEYDOWN_EVENT,onkeydown)
viz.starttimer(HOLDVIEW,.001, viz.PERPETUAL)
|
|
#4
|
|||
|
|||
|
This is still not a working script. Please cut it down to *just* what produces the error and please make sure that it runs without errors.
Thanks, Masaki |
|
#5
|
|||
|
|||
|
Sorry, i had a case of the dumb and posted an old code I was messing with. This should all be with general stuff so you shouldn't need to make any alterations. All I really need is for the avatars to walk around continuously to create a little veracity in my city.
Code:
import viz
import math
import vizmat
import vizinfo
import vizact
viz.go()
#Add the street and drop it a little bit to be below the avatars feet.
street = viz.add('tut_ground.wrl')
street.translate(0,-.2,0)
females = []
walking = []
whichturn = 0
#List the timers.
WALKING = 0
HOLDVIEW = 8
TIMING = 9
for i in range(1):
female = viz.add('vcc_female.cfg')
female.translate(i,0,0)
females.append(female)
#Set up paramters for walking girl.
females[0].translate(1,0,-7)
females[0].rotate(0,1,0,-90)
females[0].whichturn = 0
females[0].set = [[1.5,0,0],[1,0,15],[2,0,15],[-5,0,-5]]
females[0].end = 3
walking.append(females[0])
#Add car.
car = viz.add('mini.osgx')
#set car stuff
car.translate(-1.5,0,8)
car.rotate(0,1,0,180)
#Set up for timing.
timebomb = 0
def onkeydown(key):
if key == '0':
viz.starttimer(WALKING, .1, viz.PERPETUAL)
def ontimer(num):
global gravity, timebomb
if num == WALKING:
for agent in walking:
agentposition = agent.get(viz.POSITION)
agentgap = vizmat.Distance(agentposition, agent.set[agent.whichturn])
if agentgap < .1:
agent.whichturn += 1
if agent.whichturn == agent.end:
agent.whichturn = 0
walk = vizact.walkto(agent.set[agent.whichturn][0],agent.set[agent.whichturn][1],agent.set[agent.whichturn][2])
agent.addAction(walk)
if num == HOLDVIEW:
view.translate(-8.5,1.5,-2)
if num == TIMING:
print timebomb
timebomb += 1
if timebomb == 1:
onkeydown('0')
elif timebomb == 3:
onkeydown('8')
elif timebomb == 10:
onkeydown('9')
elif timebomb == 20:
onkeydown('3')
elif timebomb == 30:
onkeydown('1')
elif timebomb == 80:
viz.quit()
viz.callback(viz.TIMER_EVENT,ontimer)
viz.callback(viz.KEYDOWN_EVENT,onkeydown)
viz.starttimer(HOLDVIEW,.001, viz.PERPETUAL)
|
|
#6
|
|||
|
|||
|
Hi,
I rewrote your code using the viztask module. I left sample code for you in the task function to wait for a key press or a certain length of time to pass before continuing on. You might want to look into using the viztask module instead of timers - samples are in the help doc. Best, Masaki Code:
import viztask
def myTask():
# wait for a certain length of time or a key press
waittime = viztask.waitTime( 1 ) #define wait one second
waitkey =viztask.waitKeyDown('0') #define wait for 0 key press
yield viztask.waitAny( [waittime, waitkey] ) # #wait for either waittime or waitkley
while True: #while loop infinitely
for agent in walking:
agentposition = agent.get(viz.POSITION)
agentgap = vizmat.Distance(agentposition, agent.set[agent.whichturn])
if agentgap < .1:
agent.whichturn += 1
if agent.whichturn == agent.end:
agent.whichturn = 0
walk = vizact.walkto(agent.set[agent.whichturn][0],agent.set[agent.whichturn][1],agent.set[agent.whichturn][2])
agent.addAction(walk)
yield viztask.waitActionEnd( agent, walk ) #wait for walk action to end for agent
print 'walk to', agent.whichturn, 'done'
yield viztask.waitTime(5) #wait 5 seconds before looping again
viztask.schedule( myTask() )
|
|
#7
|
|||
|
|||
|
Thanks much. When I was taught how to do this animation, I was taught to use timers, so I never really learned how to used viztask. It strikes me as a heck of a lot easier than using timers.
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Animation Problem :( | Greenwu | Vizard | 4 | 01-05-2017 02:14 PM |
| another bezier animation problem | masaki | Vizard | 1 | 01-24-2008 02:29 PM |
| Animation Tracks.... | k_iwan | Vizard | 2 | 03-26-2007 05:52 PM |
| problem with female animations | vmonkey | Vizard | 1 | 10-07-2005 10:36 AM |
| freeze problem | shai | Vizard | 10 | 12-01-2004 11:53 AM |