Followers 0

# Slime Volleyball physics

## 4 posts in this topic

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,

0

##### 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.

0

##### Share on other sites

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

Thanks though,

-1

##### 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
0

##### 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
0

## Create an account

Register a new account