# sphere - sphere collision help

## Recommended Posts

I have no idea what Im doing wrong but..

whenever 2 spheres collide they transport to the top of screen (0,0) and stay there

-___-

[code]

////////////////////////////////////////////////////////////////////////
void PhysicsGame::ResolveCollisions(Sphere* sphereA, Sphere* sphereB)
{
// - masses
float m1 = sphereA->Mass;
float m2 = sphereB->Mass;

// - inverse mass
float im1 = 1 / m1;
float im2 = 1 / m2;

Vector2 delta = sphereA->Position - sphereB->Position;
float d = delta.length();

// minimum translation distance to push balls apart after intersecting
Vector2 mtd = delta * ( sphereA->Radius + sphereB->Radius ) - d / d;

// push-pull them apart based off their mass
sphereA->Position = mtd * im1 / (im1 + im2);
sphereB->Position = sphereA->Position - mtd * im2 / (im1 + im2);

// impact speed
Vector2 v = sphereA->Velocity - sphereB->Velocity;
float vn = glm::dot(v, glm::normalize(mtd));

// sphere intersecting but moving away from each other already
if (vn > 0.0f) return;

// collision impulse
float i = (- (1.0f + BOUNCINESS) * vn) / (im1 + im2);
Vector2 impulse = mtd * i;

// change in momentum
sphereA->Velocity += impulse * im1;
sphereB->Velocity -= impulse * im2;
}

////////////////////////////////////////////////////////////////////////
void PhysicsGame::CheckCollisions(Sphere* sphereA, Sphere* sphereB)
{

// - positions
float x1 = sphereA->Position.x;
float x2 = sphereB->Position.x;

float y1 = sphereA->Position.y;
float y2 = sphereB->Position.y;

// - distances
float dx = x2 - x1;
float dy = y2 - y1;
float d = sqrt(dx*dx + dy*dy);

//if ( d < 0.00001f ) return;

if ( d < r1 + r2 )
ResolveCollisions(sphereA, sphereB);
}

[/code]

##### Share on other sites
Ashaman73    13715
Should this
[code]
// minimum translation distance to push balls apart after intersecting
Vector2 mtd = delta * ( sphereA->Radius + sphereB->Radius ) - d / d;
[/code]
not look like this
[code]
// minimum translation distance to push balls apart after intersecting
Vector2 mtd = delta * ( sphereA->Radius + sphereB->Radius - d) / d;
[/code]

##### Share on other sites
I think you're missing the obvious here.

sphereA->Position = mtd * im1 / (im1 + im2);
sphereB->Position = sphereA->Position - mtd * im2 / (im1 + im2);

should be:

sphereA->Position += mtd * im1 / (im1 + im2);
sphereB->Position -= mtd * im2 / (im1 + im2);

ontop of that, the line Ashaman pointed out is also an issue.

##### Share on other sites
mm okay ..

somehow it works but now everytime a sphere collides it blasts away at incredible speeds , why!?

##### Share on other sites
Vector2 impulse = mtd * i;

here mtd is not normalised so will not have the correct magnitude.

##### Share on other sites
ah yeah normalizing mtd did the trick

now the simulations works better but still... the balls accelerate too fast .. but only on the X axis, maybe I should try incresing / decreasing my mass values?