whenever 2 spheres collide they transport to the top of screen (0,0) and stay there
-___-
////////////////////////////////////////////////////////////////////////
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)
{
// for easy reading...
// - positions
float x1 = sphereA->Position.x;
float x2 = sphereB->Position.x;
float y1 = sphereA->Position.y;
float y2 = sphereB->Position.y;
// - radiuses
float r1 = sphereA->Radius;
float r2 = sphereB->Radius;
// - 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);
}