WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

Reply
 
Thread Tools Rate Thread Display Modes
  #1  
Old 04-08-2009, 12:35 PM
whj whj is offline
Member
 
Join Date: Apr 2008
Posts: 60
Timer Actions problem

Hello,

I wrote a small script basically want to play some animation paths in a specific schedule and every animation path can be played more than once.

In this script, I create an animation path for a ball and another animation path for a duck. The array time_to_go[] and object[] make a schedule for the ball and duck. Here I would like firstly duck start to move; and after 3 seconds, ball start to move; and after another 3 seconds, ball start to move again. Then done.

unfortunately the ball will start the 3rd time after my schedule. Could somebody help me diagnose what's wrong with it.

Thanks,


Code:
import viz
import math
viz.go()


viz.clearcolor(0.5,0.5,1)
viz.add('tut_ground.wrl')

#Add 2 models.
#One is a ball, the other is a duck.
model = []
ball = viz.add('ball.wrl')
duck = viz.add('duck.cfg')
model.append(ball)
model.append(duck)


#Add the path.
#path[0] is for the ball, path[1] is for the duck.
path = [] 
for x in range(2):
	pa = viz.addAnimationPath()
	path.append(pa)

positions = [ [5,1,6], [0,1,3], [-150,1,6] ]
for x in range(len(positions)):
    cp = viz.addControlPoint()
    cp.setPosition(positions[x])
    path[0].add(cp,x+1)
    path[1].add(cp,x+1)

for x in range(2):
	path[x].constantspeed(viz.ON,10)
	path[x].loop(viz.OFF)
	path[x].translatemode(viz.BEZIER)
	path[x].setAutoRotate(viz.ON)

#Link the model to a path.
ball.link(path[0])
duck.link(path[1])



def mytimer(num):
	for x in range(2):
		pos = model[x].getPosition()
		if pos[0] < -15 :
			path[x].pause()
			path[x].reset()
			model[x].setPosition(0,0,0)


def donothing():
    pass


#The following arrays means:
#Firstly: duck start to move
#After 3 seconds, ball start to move
#After another 3 seconds, ball start to move again
time_to_go = [0, 3, 6] 
object = [1, 0, 0] #1 means duck, 0 means ball


#Create an array of timer action
myTimerAction = []
for x in range(3):
	if (x == 0) : 
		myTimerAction.append(vizact.ontimer2(0, 1, donothing))
		path[object[0]].play()
	else: 
		wait = time_to_go[x] - time_to_go[0]
		myTimerAction.append(vizact.ontimer2(wait, 1, path[object[x]].play))
	

	
viz.callback(viz.TIMER_EVENT,mytimer)
viz.starttimer(0,0,viz.PERPETUAL)

Last edited by whj; 04-08-2009 at 12:41 PM.
Reply With Quote
  #2  
Old 04-08-2009, 07:33 PM
whj whj is offline
Member
 
Join Date: Apr 2008
Posts: 60
Seems like I can play a lot of animation paths in a specific schedule, but every animation path can be played only once. Otherwise it would be messed up. Any hint?
Reply With Quote
  #3  
Old 04-09-2009, 09:41 AM
Jeff Jeff is offline
WorldViz Team Member
 
Join Date: Aug 2008
Posts: 2,471
It looks like you are creating 2 vizact.ontimer2 objects for the ball when you only need one that repeats once. Try changing the 3 to a 2 in this for loop
Code:
#Create an array of timer action
myTimerAction = []
for x in range(3):
Reply With Quote
  #4  
Old 04-09-2009, 09:52 AM
whj whj is offline
Member
 
Join Date: Apr 2008
Posts: 60
Hi,

I think the 3 is actually len(time_to_go) or len(object). Because I define 3 events. I just put "donothing" as the first event (for duck action), and put ball actions as the 2nd and the 3rd event.

Thanks,
Haojie
Reply With Quote
  #5  
Old 04-09-2009, 12:45 PM
whj whj is offline
Member
 
Join Date: Apr 2008
Posts: 60
Seems to me that the array of myTimerAction got initialized correctly, but after path[x].pause() and path[x].reset(), the animation path were messed up. Any suggestion?
Reply With Quote
  #6  
Old 04-09-2009, 05:33 PM
Jeff Jeff is offline
WorldViz Team Member
 
Join Date: Aug 2008
Posts: 2,471
This code loops three times
Code:
object = [1, 0, 0] #1 means duck, 0 means ball
#Create an array of timer action
myTimerAction = []
for x in range(3):
	if (x == 0) : 
		myTimerAction.append(vizact.ontimer2(0, 1, donothing))
		path[object[0]].play()
	else: 
		wait = time_to_go[x] - time_to_go[0]
		myTimerAction.append(vizact.ontimer2(wait, 1, path[object[x]].play))
The first time the duck's animation path is played. The second time a timer object is created that will repeat one time, so the ball's path will be played twice and the third time another timer object is created that will repeat one time, and the ball's path should be played two more times for a total of four times. I think the reason you see the ball move around three times has something to do with your reset code.
Reply With Quote
Reply


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
array problem mrvr Vizard 8 03-10-2014 09:20 PM
Sound Looping Problem JMOwens Vizard 4 09-29-2010 09:42 PM
Timer speed Jerry Vizard 1 12-08-2006 11:01 AM
problem with female animations vmonkey Vizard 1 10-07-2005 10:36 AM
Weird lagging/choppiness when avatars perform actions vjonshih Vizard 8 11-30-2004 04:08 PM


All times are GMT -7. The time now is 04:06 PM.


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