WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

Reply
 
Thread Tools Rating: Thread Rating: 3 votes, 5.00 average. Display Modes
  #1  
Old 10-11-2010, 09:08 AM
just alex just alex is offline
Member
 
Join Date: Nov 2008
Posts: 18
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)
Reply With Quote
  #2  
Old 10-11-2010, 11:53 AM
Jeff Jeff is offline
WorldViz Team Member
 
Join Date: Aug 2008
Posts: 2,471
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.
Reply With Quote
  #3  
Old 10-14-2010, 12:25 PM
just alex just alex is offline
Member
 
Join Date: Nov 2008
Posts: 18
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)
There's a few left over bits from previous experiments in here, but I don't think anything left in there affects the walking around
Reply With Quote
  #4  
Old 10-15-2010, 01:34 PM
masaki masaki is offline
Member
 
Join Date: Jan 2008
Posts: 63
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
Reply With Quote
  #5  
Old 10-18-2010, 08:47 AM
just alex just alex is offline
Member
 
Join Date: Nov 2008
Posts: 18
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)
Reply With Quote
  #6  
Old 10-18-2010, 09:45 AM
masaki masaki is offline
Member
 
Join Date: Jan 2008
Posts: 63
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() )
Reply With Quote
  #7  
Old 10-21-2010, 12:32 PM
just alex just alex is offline
Member
 
Join Date: Nov 2008
Posts: 18
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.
Reply With Quote
Reply

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

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


All times are GMT -7. The time now is 07:05 AM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC