Sign in to follow this  
EvilNando

sphere - sphere collision help

Recommended Posts

EvilNando    96
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)
{
// 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);
}

[/code]

Share this post


Link to post
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 this post


Link to post
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 this post


Link to post
Share on other sites
EvilNando    96
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?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this