# Slime Volleyball physics

This topic is 1768 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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,

##### Share on other sites

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.

##### Share on other sites

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

Thanks though,

##### Share on other sites

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

##### Share on other sites

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

• ### What is your GameDev Story?

In 2019 we are celebrating 20 years of GameDev.net! Share your GameDev Story with us.

• 13
• 9
• 15
• 14
• 46
• ### Forum Statistics

• Total Topics
634059
• Total Posts
3015292
×