• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# Slime Volleyball physics

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.

4 replies to this topic

### #1ConorJH  Members

Posted 12 March 2014 - 04:15 PM

Essentially trying to do this game (oneslime.net), using some code I found on tinters

bool slimev::calcCollisions(Slime& i, Ball& j)
{
double x,y,d2;
x=y=d2=0;

// displacement from i to j
y = (j.y - i.y);
x = (j.x - i.x);

// distance squared
d2 = x * x + y * y;

// dividing by 0 is bad
if (d2 == 0)
return false;

// if d^2 < (30)^2, the disks have collided
if (d2 < (i.r*j.r))
{
double kii, kji, kij, kjj;
kii=kji=kij=kjj=0;

kji = (x * i.dx + y * i.dy) / d2; // k of j due to i
kii = (x * i.dy - y * i.dx) / d2; // k of i due to i
kij = (x * j.dx + y * j.dy) / d2; // k of i due to j
kjj = (x * j.dy - y * j.dx) / d2; // k of j due to j

// set velocity of i
i.dy = kij * y + kii * x;
i.dx = kij * x - kii * y;

// set velocity of j
j.dy = kji * y + kjj * x;
j.dx = kji * x - kjj * y;

return true;
}

return false;
}



The problem with this code is that the Slimes bounce back off the ball, unlike the oneslime.net example. I dont want the ball to transfer any of its velocity to the Slimes. How would I go about this?

Also, in the oneslime.net applet, the ball never loses momentum. If you start the game and not touch the keys, the ball would bounce forever. In my code, the ball just sticks to the Slime, because the slime has no velocity to transfer to the ball. Else where in the code I add some small amount of positive force to the Y velocitys of the Slimes and the ball, in an attempt to simulate gravity.

I hope this is clear to someone with the appropriate knowledge.

Danke,

### #2Angus Hollands  Members

Posted 12 March 2014 - 04:36 PM

Essentially you're arguing that the momentum change is 2mv - in that the colliding object transfers no momentum to the object it collides with. So ensure that you keep this in mind when effecting the results of a collision. You're just using the slimes as a collision point and hit normal.

### #3ConorJH  Members

Posted 13 March 2014 - 05:38 AM

Need it put more layman-ey haha, I have no physics knowledge at all really

Thanks though,

### #40BZEN  GDNet+

Posted 14 March 2014 - 08:37 AM

You'll need to solve the energy conservation equation.

coefficient of restitution : cor = ((vb' - va') . N) / ((va - vb) . N)

applying change in momentum :

va' = va - (j / ma) * N

vb' = vb + (j / mb) * N

to cut the story short,  Collision impulse is :

j = -(1 + cor) * (N . (B.velocity - A.velocity)) / (1 / A.mass + 1 / B.mass)

the change in momentum on objects A and B are :

A.velocity -= (j / A.mass) * N

B.velocity += (j / B.mass) * N

(not sure about sign... but it's either one way or the other).

cor is the coefficient or restitution, in range [0, 1]. 1.0 for hard collisions, 0.0 for super soft collisions.

N is the normal of collision. For two spheres colliding, N = (B.position - A.position).normalized().

Edited by papalazaru, 14 March 2014 - 09:51 AM.

Everything is better with Metal.

### #50BZEN  GDNet+

Posted 15 March 2014 - 12:18 PM

deriving the equation for the collisoin impulse, since I'm bored :

first two equations. How speed is affected by a collision impulse on both objects :

va' = va - (j / ma) * N

vb' = vb + (j / mb) * N

=>

(vb' - va') = (vb - va) + (j / ma) * N + (j / mb) * N

(vb' - va').N = (vb - va).N + (j / ma) * (N.N) + (j / mb) * (N.N)

(vb' - va').N = (vb - va) .N + (j / ma) + (j / mb) (assuming normal of collision N is normalized, N.N = 1.0).

[EQ1] (vb' - va').N = (vb - va) .N + j * (1 / ma + 1 / mb)

Second equations. how a inelastic collision affects the relative speed between objects :

cor = ((vb' - va') . N) / ((va - vb) . N)

=>

[EQ2] (vb' - va').N = cor * (va - vb).N

[EQ1] [EQ2]

=>

(vb - va) .N + j * (1 / ma + 1 / mb) = cor * (va - vb).N

j * (1 / ma + 1 / mb) = (1 + cor) * (va - vb).N

[EQ3] j = -(1 + cor) * (vb - va).N / (1 / ma + 1 / mb)

Edited by papalazaru, 15 March 2014 - 12:18 PM.

Everything is better with Metal.

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.