Jump to content

  • Log In with Google      Sign In   
  • Create Account

Object Collision Problem


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 XsoodX   Members   -  Reputation: 135

Like
0Likes
Like

Posted 05 October 2013 - 06:46 AM

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.

Attached Thumbnails

  • ball.png


Sponsor:

#2 serumas   Members   -  Reputation: 730

Like
1Likes
Like

Posted 05 October 2013 - 09:28 AM

for such simple game you could:

divide circle step by 10

and do 10 circle moves and collision checks per loop.



#3 shacktar   Members   -  Reputation: 847

Like
2Likes
Like

Posted 05 October 2013 - 12:38 PM

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.

 

Problem.png

 

Solution.png



#4 tisdadd   Members   -  Reputation: 313

Like
0Likes
Like

Posted 06 October 2013 - 03:10 PM

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).






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS