Advertisement Jump to content
Sign in to follow this  
ConorJH

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.

If you intended to correct an error in the post then please contact us.

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


Link to post
Share on other sites
Advertisement

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


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


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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!