Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


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.

  • You cannot reply to this topic
4 replies to this topic

#1 ConorJH   Members   -  Reputation: 165

Like
0Likes
Like

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,

 

 



Sponsor:

#2 Angus Hollands   Members   -  Reputation: 722

Like
0Likes
Like

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.



#3 ConorJH   Members   -  Reputation: 165

Like
-1Likes
Like

Posted 13 March 2014 - 05:38 AM

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

 

Thanks though,



#4 0BZEN   Crossbones+   -  Reputation: 2025

Like
0Likes
Like

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.


#5 0BZEN   Crossbones+   -  Reputation: 2025

Like
0Likes
Like

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.



PARTNERS