# collision response from verlet

• 12-31-2005, 02:55 PM
ne0the0ne
collision response from verlet
Hi
Im using the Jacobsen article to work on a 2D physics engine. However, I got the stick to move realistically but Im not sure what to do on the collision detection part. My current method allows me to detect whether or not there's been a collision but not what the penetration points are. How would I go about finding these, or if theres a better way of handling response, what would I do?
Thanks
ps: This isn't in actionScript as I want to use a language Im familiar wiith first before I port it to AS.
• 12-31-2005, 04:51 PM
ozmic66
Hey, i posted here a while back about a 2d verlet engine for flash that i'm working on, and actually i just started working on it again not too long ago

my suggestion to you is first make circle collision/response

it doesn't have to be completely elastic, or accurate, but it still looks good if you use this method: (which is what i used)

i persume you know how to check if 2 circles have collided (if the distance between their centers in less then the sum of their radii)

for collision response, think about it as putting in a stick in between the circles every time they over lap (for that one timestep only) or in other words, move both circles in the opposite direction so that their distance equals the sum of their radii (and with the verlet integration their speeds will be affected as well)

try that and add as many circles as you want because it is very stable

once you have circle collision you should move onto circle-line collision and these are pretty much all of the things that you'll need

if you need any help just post here or send me a message
good luck!
• 12-31-2005, 05:55 PM
ne0the0ne
Thanks ozmic66. Just a quick question before I start with the circle stuff. What did you use for your (very nice) engine in terms of verlet algorithm? For my stick I was using:
p1.y# = (p1.y# + (p1.y# - o1#) + vy# * 0.5)
p2.y# = (p2.y# + (p2.y# - o2#) + vy# * 0.5)

where p1.y# = current pos and o1# = old position. vy# = gravity and 0.5 is the timestep although Im not sure what I am actually supposed to use there?

however, the jakobsen paper says to use:
x' = 2x - x* + a·Δt2
but that messes up the whole thing for my system if I put a '2' in front of everything.

any ideas why?
Thanks again for the help.
• 12-31-2005, 06:37 PM
ozmic66
hmm...

all good questions...

here's what I use:
(copied from the code)

x+=((x-oldPosition.x)+(Acceleration.x*timeStep*timeStep)) *cWorld.getDrag()
y+=((y-oldPosition.y)+(Acceleration.y*timeStep*timeStep)) *cWorld.getDrag()

where:

acceleration is the sum of all the forces acting on the particle (gravity,wind maybe)
also, dont forget to reset the acceleration to 0 at the end of the verlet code

cWorld.getDrag() is a number between 0 and 1
i don't add a '1' to it (hence multiplying by a number from 1 to 2) because as you see, i'm adding that value to the already existing one

now the timestep i keep at one

what the timestep controls is how much of its movement the particle should do in one frame

at 1 it's 100%
if you want to slow down time, then you can set it to something like 0.5 or any other number

to speed up time..guess what..1+

hope that helped
• 01-01-2006, 08:14 AM
ne0the0ne
Thanks a lot ozmic66. I tried getting the circle collisions to work. I can get them to detect collision but I cant get them to travel in opposite directions. Is there a chace you could show some psuedo code or an article that might help. Im mainly stuck on how to "put a stick" in between and try and get the objects to move in the right direction after collision.
Thanks again and happy new year! :)
• 01-01-2006, 11:05 AM
ozmic66
happy new year

i find it best to use vectors in this case becaue they make everything easier

i don't know how firmiliar you are with vector math so here is a little explenation

a vector holds two pieces of information: 'x' and 'y' - you can also see these as 'run' and 'rise'. a vector can be used as a smiple point in space or something that contains the properties of a line (only without coordiantes in space) - i know it might sound kinda confusing, and that's because this isn't the best explenation so you should probably read some more about it.

now here is how you would use vectors to move to objects away from eachother

psuedo code:

if collision =true then
//find the vector between the two circles
vectorX=circle1.x-circle2.x
vectorY=circle1.y-circle2.y
//find the distance between the circles//
dist = sqrt(vectorx*vectorX+vectorY*vectorY)
//find the distance that both circles should move in order to not overlap
distForEachCircle=distDiff/2
//normalize the vector with the desired length - this is what vectors are good for
vectorX=vectorX/dist * distForEachCircle
vectorY=vectorY/dist * distForEachCircle

//add the vector to circle 1

circle1.x+=vectorX
circle1.y+=vectorY

//subtract it from circle 2

circle1.x-=vectorX
circle1.y-=vectorY

end if

so here, it's a little more than psuedo code, but that can't hurt can it?

good luck
• 01-01-2006, 08:44 PM
OpethRockr55
A Verlet Flasher's (He he) must-go-to place would be the Metanet tutorials. They have an in-depth tutorial just on collision detection using Verlet Integration.

Not that I'm saying Ozmic's method is bad... in fact, he's probably got the best Collision Detection code here, but it is a nice place to see what you can really do with advanced Verlet collision.
• 01-02-2006, 09:18 AM
ne0the0ne
Thanks a lot ozmic66, that was really helpful!