PDA

View Full Version : real time collision on animation path


whj
09-10-2008, 11:12 AM
Hello,

I'd like to simulate some cars running on the road without crash. Cars are animated by animation path and those paths have intersection. I use .collideBox() and .enable(viz.COLLIDE_NOTIFY) for each car for collision. But I don't exactly know how to handle collision event in the callback function. Because once two cars are about to collide, I need one car to speed up and the other to slow down. But my program have no idea which car should speed up and which car should slow down. Does anybody have a solution for that?

Thanks,
whj

Jeff
09-11-2008, 04:37 PM
Thanks for the post. Sorry, we have not had time to answer yet. We will respond tomorrow or early next week.

whj
09-15-2008, 01:01 PM
Hi,

After thinking it over, I feel I should not use collision in this case. Because I need to prevent crash instead of allowing collision. Is there any way I can calculate the position after a certain time, e.g. 2 seconds, when a car moving along the animation path according to its speed?

Sorry about confusion. And thanks for your help in advance.

Jeff
09-15-2008, 04:02 PM
you could create a callback function that is called every time a timer expires. Within that function you could get the position of your cars and calculate the distance between them. If they are to close you could speed up the one in front and slow down the one behind.

import vizmat

#start a timer that will call onTimer() every 2 seconds
viz.starttimer(0,2,viz.FOREVER)

def onTimer(num):


car1_Pos = car1.getPosition()
car2_Pos = car2.getPosition()
distance = vizmat.Distance(car1_Pos, car2_Pos)

if distance is too close:

#increase speed of path of car1
#decrease speed of path of car2



viz.callback(viz.TIMER_EVENT,onTimer)


is that helpful?

whj
09-20-2008, 10:34 AM
Sorry I didn't make it clear. I need to know the position in advance, like where the car could be in the next 2 seconds. So I can predict if they would crash. (I know your sample code is a way to predict crash based on distance. But my research need a way to predict crash based on time.) Since all cars have their defined paths and speed using animation path, I'm wondering if I can get the expected position beforehand? I really appreciate your help.

Jeff
09-22-2008, 02:26 PM
You could try creating another animation path with identical control points. You can delay playing the second path by two seconds. The second path would have your car linked to it. The first path would have an empty group node linked to it. The group node, which is not visible, would always have the position two seconds ahead of your car. Just get its position anytime you need to make your calculation. If however you change the speed of your car's animation path, you will need to do the same for your group nodes path, so they will always be two seconds apart.

Here is some code with a semi-transparent ball two seconds ahead of another ball. You could replace the semi-transparent ball with an empty group node that just holds the position

import viz
viz.go()

viz.add('tut_ground.wrl')

#add a ball and make semi-transparent, this will be 2 seconds ahead of
#ball2
ball = viz.add('ball.wrl')
ball.alpha(.2)
ball2 = viz.add('ball.wrl')

#Move the viewpoint back
viz.MainView.move(0,0,-8)

#Create the animation paths
path = viz.add(viz.ANIMATION_PATH)
path2 = viz.add(viz.ANIMATION_PATH)

#Initialize an array of control points
positions = [ [0,0,2], [2,0,0], [0,0,-2], [-2,0,0] ]

for x in range(0,len(positions)):

cp = viz.add(viz.CONTROL_POINT)
cp.setPosition(positions[x])
path.add(cp,x+1)
path2.add(cp,x+1)

#Set the initial loop mode to circular
path.loop(viz.CIRCULAR)
path2.loop(viz.CIRCULAR)

#Automatically compute tangent vectors for cubic bezier translations
path.computeTangents()
path2.computetangents()

#Automatically rotate the path
path.setAutoRotate(viz.ON)
path2.setAutoRotate(viz.ON)

#Link ball and ball2 to their paths
ball.link(path)
ball2.link(path2)


#start playing the first animation path immediately
path.play()

#start playing the second animation path after two seconds
vizact.ontimer2(2, 1, path2.play)

whj
09-26-2008, 02:45 PM
Hi, Jeff

That's really helpful! Thanks a lot!

I have another question. Is there any way I can get the current speed of the object, like accessing some environment variable? The reason I need it is because when I accelerate cars I need set the new speed based on the current speed.

Jeff
09-29-2008, 10:45 AM
Would it work for you to use animationpath.constantspeed when you begin. Then you would know the initial speed and you could change based on that.

whj
10-01-2008, 10:49 PM
I do use animationpath.constantspeed when I begin. But what I need to know is not only the initial speed. If I want to accelerate or decelerate a car, I would like to increase or decrease the car based on not the initial speed, but the speed when last timer event triggered.

For example, the initial speed is 20mi/hr. To avoid clash, I calculate certain distance every 20 times a second. While the distance is too close, one car keep speeding up 20 percent and the other car keep slowing down 20 percent. So one car could speed up to
20 + 20*0.2 = 24mi/hr,
24 + 24*0.2 = 28.2mi/hr, (I need to know the current speed is 24)
28.2 + 28.2 *0.2 = 34.56mi/hr, (I need to know the current speed is 28.2)
and so on; and the other car could slow down to
20 - 20*0.2 = 16mi/hr,
16 - 16*0.2 = 12.8mi/hr, (I need to know the current speed is 16)
12.8 - 12.8*0.2 = 10.24mi/hr, (I need to know the current speed is 12.8)
and so on.

Sorry about the trivial details. Do you think it is feasible? Thanks a lot!

Jeff
10-02-2008, 12:16 PM
Let me know if I am not understanding this correctly, but couldn't you have a variable for each car that stores its current speed. When you need to accelerate or decelerate just access that variable and change it. Then set the animation path to the new carspeed.

whj
10-06-2008, 04:38 PM
Yes, that's exactly what I want. If there is a system defined variable about current speed, something like get.speed(), then I don't need to maintain them by myself. That's why I'm asking. But if not, I will do what you said.

Thanks a lot.