Object Collision Problem

Started by
2 comments, last by tisdadd 10 years, 6 months ago

I am trying to make a simple physics based game in SDL, and i require a ball to bounce of lines in game.

However, when the ball collides with the line, it clips through it, messing up the collision count.

The problem is due to the speed of the ball. If the ball travels fast enough, it can pass right through the line.

I use frame independent motion and a circular collision detection for the ball

How can i make sure the collision doesn't clip?

Code For the Ball Collision Detection


bool Projectile::check_collision(Line L)
{
	int X1,X2,Y1,Y2,CL;
	int Cx=0,Cy=0,CP=0,Px=0,Py=0;
	float shortest_distance;
	double slopeL=0,slopeP=0;

	L.get_Line(X1,Y1,X2,Y2);
	getLocation(Px,Py);
	Px+=size/2;
	Py+=size/2;

	if(X2-X1!=0)
	{
		slopeL=(Y2-Y1)/(X2-X1);
		slopeP=-1/slopeL;
		//Y=mX+C;
		CL=Y1-slopeL*X1;
		CP=Py-slopeP*Px;
		Cx=(CL-CP)/(slopeP-slopeL);
		Cy=slopeP*Cx + CP;
	}
	else 
	{
		Cy=Py;
		if(X2>Px)
		Cx=X2-Px;
		else
		Cx=Px-X2;
	}

	shortest_distance=sqrt(pow(double(Cx-Px),2)+pow(double(Cy-Py),2));	

	if(shortest_distance<size/2)
	{
		if(X2-X1!=0)
		on_collision(slopeL);
		else
		on_collision();
		return true;
	}
	else
		return false;

}

If any more info is needed please tell me.

Advertisement

for such simple game you could:

divide circle step by 10

and do 10 circle moves and collision checks per loop.

A potential solution is to "sweep out" a box (or capsule if the ends are rounded to fit the circle) that describes the motion of the circle over the whole timestep and then to do collision detection with the swept out box (or capsule). The picture below shows a swept out box.

[attachment=18239:Problem.png]

[attachment=18240:Solution.png]

A potential solution is to "sweep out" a box (or capsule if the ends are rounded to fit the circle) that describes the motion of the circle over the whole timestep and then to do collision detection with the swept out box (or capsule). The picture below shows a swept out box.

attachicon.gifProblem.png

attachicon.gifSolution.png

I did something like this in the past, and then put it to intercepted and moved the ball to the halfway position and set the velocities so that on the next time step it would be right... if your total velocity drops too low though, you may have to adjust where you move it to. My speed stayed the same for the whole problem, so moving it halfway worked great. You could do a deterioration to find out exactly where to move it if you needed to. (For instance, if losing 50% of velocity, would probably want to move back to 25% along the way of the box before adjusting velocity).

This topic is closed to new replies.

Advertisement