Download presentation
Presentation is loading. Please wait.
Published byOscar Dixon Modified over 9 years ago
1
Let’s Bounce! or Physics of Collisions Part 1 Games Fundamentals © by Jarek Francik Kingston University, London 2007 - 2013
2
What’s on the Agenda? Collisions: Elastic vs. Inelastic Essential Physics: Momentum, Impulse, Kinematic Energy, Conservation Rules Perfectly Inelastic Collision Elastic Collisions –Collision with a Stationary Object –Collision between Bills Coefficient of Restitution Implementation Remarks
3
Elastic vs. Inelastic Collisions Physicists classify collisions as: –perfectly inelastic: –perfectly elastic:
4
Elastic vs. Inelastic Collisions Real collisions are neither perfectly elastic nor inelastic: they are somewhere in-between Marbles, bills and many other hard objects may be quite well simulated as perfectly elastic collisions
5
Elastic Collisions Equal mass marbles exchange their velocities: v‘ A = v B v’ B = v A
6
Elastic Collisions Maths behind the marbles of different mass is a bit more complex
7
Elastic Collisions But hitting a stationary obstacle, again, is very simple: v’ = -v
8
Essential Physics
9
Momentum, Impulse, Energy Momentum m – mass v – velocity Impulse Kinematic Energy
10
2 nd Newton’s Law Two equivalent formulas: F = am F = p / t = J / t J = Ft this is how it is widely known today this is what Isaac Newton originally wrote
11
Conservation of Momentum F1 = -F2(3rd Newton’s law) p 1 / t = p 2 / t p 1 = p 2
12
Conservation of Energy In an Isolated System ENERGY is constant but may be converted, for example into heat Only perfectly elastic collisions conserve the Kinematic Energy. In all real collisions part of Kinematic Energy is lost as colliding objects become hot.
13
Physics of Perfectly Inelastic Collision
14
Perfectly Inelastic Collision before the collision: applying momentum conservation: after the collision:
15
Physics of Perfectly Elastic Collision
16
Perfectly Elastic Collision
17
applying momentum conservation: after the collision: before the collision:
18
Elastic collision Two unknown velocities Momentum equation is not enough, we need something more! Definition: Elastic colision is a colision in which the kinematic energy is conserved
19
Elastic collision
20
Elastic collision of equal masses source: http://en.wikipedia.org/wiki/Elastic_collisionhttp://en.wikipedia.org/wiki/Elastic_collision
21
Elastic Collisions collision with a stationary object: marbles bouncing from the walls bills bouncing from each other : billiard (or snooker) game
22
Collision with a Stationary Object
23
x’ v y’ v v’ Collision with a Stationary Object xvxv yvyv v vv’
24
Collision with a Stationary Object x’ v y’ v v’ xvxv yvyv v NOTICE: CHANGE OF SYMBOLS
25
Collision with a Stationary Object v’ v’ || v’ vv v || v xvxv x’ v yvyv y’ v n c n: normal vector c: collision vector
26
n c Collision with a Stationary Object v’ v’ || v’ vv v || v xvxv x’ v yvyv y’ v n: normal vector c: collision vector
27
Collision with a Stationary Object v’ v’ || v’ vv v xvxv x’ v yvyv y’ v n v || c
28
Collision with a Stationary Object
29
double xv = ball.GetXVelocity(); double yv = ball.GetYVelocity(); double xn = sin(DEG2RAD(obj.GetRotation())); double yn = cos(DEG2RAD(obj.GetRotation())); double xc = -yn; double yc = xn; double vdotn = xv * xn + yv * yn; double vdotc = xv * xc + yv * yc; ball.SetVelocity(xc * vdotc - xn * vdotn, yc * vdotc - yn * vdotn);
30
Physics of the Billiard/Snooker Game
31
Billiard Game t v c n vv v ||
32
Billiard Game // distance vector (t) and radius double xt = ball2.GetPrecX() - ball1.GetPrecX(); double yt = ball2.GetPrecY() - ball1.GetPrecY(); double R = ball1.GetWidth(); // normal and collision vectors double xn = xt / 2 / R; double yn = yt / 2 / R; double xc = -yn; double yc = xn; // velocity vectors double xv1 = ball1.GetXVelocity(); double yv1 = -ball1.GetYVelocity(); double xv2 = ball2.GetXVelocity(); double yv2 = -ball2.GetYVelocity(); // dot products double v1dotn = xv1 * xn + yv1 * yn; double v1dotc = xv1 * xc + yv1 * yc; double v2dotn = xv2 * xn + yv2 * yn; double v2dotc = xv2 * xc + yv2 * yc; ball1.SetVelocity(xn * v2dotn + xc * v1dotc, -(yn * v2dotn + yc * v1dotc)); ball2.SetVelocity(xn * v1dotn + xc * v2dotc, -(yn * v1dotn + yc * v2dotc));
33
Billiard Game Life Demo
34
Coefficient of Restitution
35
General Case Newton’s Law of Restitution e – coefficient of restitution Notice that we use relative velocity and relative normal velocity:
36
Implementation Remarks 1.Ball Sinking 2. Bouncing & Sinking: a simple solution for balls and boxes
37
Ball Sinking in the Floor In the real world: beforehit!after
38
Ball Sinking in the Floor In the simulated world: beforehit!after
39
Ball Sinking in the Floor or even a worse scenario: beforehit!after WRONG Bounce condition may be wrongly detected! SOLUTION: only bounce when moving DOWN
40
Ball Sinking in the Floor General solution: only apply the bounce if v n > 0 v n
41
Ball Sinking in Another Ball
42
In the real world: beforehit!after
43
Ball Sinking in Another Ball In the simulated world: beforehit!after
44
Ball Sinking in Another Ball In the nasty case: #1#2#3 In frame #3 the balls still overlap. This may lead to repeated application of the ‘bounce’ effect. The balls may end up ‘glued’!
45
Ball Sinking in Another Ball In the nasty case: no collision yet frame #1
46
Ball Sinking in Another Ball In the nasty case: collision detected frame #2
47
Ball Sinking in Another Ball In the nasty case: collision detected bouncing applied frame #2
48
Ball Sinking in Another Ball In the nasty case: collision detected (again!) frame #3
49
Ball Sinking in Another Ball In the nasty case: collision detected (again!) bouncing applied frame #3 WRONG
50
Ball Sinking in Another Ball Solution: Take: -t: position vector (of the other ball) -v: velocity vector if (v ∙ t < 0) don’t bounce! frame #3 t v
51
Ball Sinking in Another Ball Solution: frame #3 Take: -t: position vector (of the other ball) -v: velocity vector if (v ∙ t < 0) don’t bounce! // distance vector (t) and radius double xt = ball2.GetPrecX() - ball1.GetPrecX(); double yt = ball2.GetPrecY() - ball1.GetPrecY(); double R = ball1.GetWidth(); // normal and collision vectors double xn = xt / 2 / R; double yn = yt / 2 / R; double xc = -yn; double yc = xn; // velocity vectors double xv1 = ball1.GetXVelocity(); double yv1 = -ball1.GetYVelocity(); double xv2 = ball2.GetXVelocity(); double yv2 = -ball2.GetYVelocity(); // dot products double v1dotn = xv1 * xn + yv1 * yn; double v1dotc = xv1 * xc + yv1 * yc; double v2dotn = xv2 * xn + yv2 * yn; double v2dotc = xv2 * xc + yv2 * yc; ball1.SetVelocity(xn * v2dotn + xc * v1dotc, -(yn * v2dotn + yc * v1dotc)); ball2.SetVelocity(xn * v1dotn + xc * v2dotc, -(yn * v1dotn + yc * v2dotc)); t v
52
Ball Sinking in Another Ball Solution: frame #3 Take: -t: position vector (of the other ball) -v: velocity vector if (v ∙ t < 0) don’t bounce! // distance vector (t) and radius double xt = ball2.GetPrecX() - ball1.GetPrecX(); double yt = ball2.GetPrecY() - ball1.GetPrecY(); double R = ball1.GetWidth(); // normal and collision vectors double xn = xt / 2 / R; double yn = yt / 2 / R; double xc = -yn; double yc = xn; // velocity vectors double xv1 = ball1.GetXVelocity(); double yv1 = -ball1.GetYVelocity(); double xv2 = ball2.GetXVelocity(); double yv2 = -ball2.GetYVelocity(); // check velocity dot position double vx = xv1 - xv2; double vy = yv1 - yv2; if (vx * xt + vy * yt < 0) return; // dot products double v1dotn = xv1 * xn + yv1 * yn; double v1dotc = xv1 * xc + yv1 * yc; double v2dotn = xv2 * xn + yv2 * yn; double v2dotc = xv2 * xc + yv2 * yc; ball1.SetVelocity(xn * v2dotn + xc * v1dotc, -(yn * v2dotn + yc * v1dotc)); ball2.SetVelocity(xn * v1dotn + xc * v2dotc, -(yn * v1dotn + yc * v2dotc)); t v
53
Bouncing from boxes and walls is quite common in games – simple and advanced a scene from the Marble, a workshop task for today... Bouncing & Sinking: a simple solution for balls & boxes
54
GFC offers an effective hit test function for rectangular sprites against circular shapes, for which position and radius are known: rect.HitTest(pos, radius); Bouncing & Sinking: a simple solution for balls & boxes
55
Problem: when the ball is overlapping the box it is too late to determine which side it entered (why?) Bouncing & Sinking: a simple solution for balls & boxes
56
Solution: track the previous frame position. Bouncing & Sinking: a simple solution for balls & boxes
57
Example: the ball is hitting the left hand edge of the box if: –there is a hit in frame #n –it was to the left of the box in frame #n-1 Bouncing & Sinking: a simple solution for balls & boxes
58
Solution Draft: 1.Store in a safe place the position of the ball before the update. This should be the position after the previous frame, before the current one – (x 0, y 0 ) 2.Just after update, check the HitTest. If there is no collision there is no bounce. 3.Now, when we know there is a hit: Assume there was no hit with (x 0, y 0 )* Check on which side of the box the ball was (in the prev frame) Apply the appropriate bounce Amend the position of the ball so that to prevent sinking * this assumption will be satisfied if you prevent sinking! Bouncing & Sinking: a simple solution for balls & boxes
59
Here is the solution: 1.Store in a safe place the position of the ball before the update. This should be the position after the previous frame, before the current one – (x 0, y 0 ) 2.Just after update, check the HitTest. If there is no collision there is no bounce. 3.Now, when we know there is a hit: Assume there was no hit with (x 0, y 0 )*. Check on which side of the box the ball was. Apply the appropriate bounce. Amend the position of the ball so that to prevent sinking. * this assumption will be satisfied if you prevent sinking! let’s have a look at this point in greater detail... Bouncing & Sinking: a simple solution for balls & boxes
60
Decompose ball’s velocity into v x and v y if v x > 0 the ball was travelling rightwards and we only check the left side of the box if v x < 0 the ball was travelling leftwards and we only check the right side of the box if v y > 0 the ball was travelling upwards and we only check the bottom side of the box if v y < 0 the ball was travelling downwards and we only check the upper side of the box Bouncing & Sinking: a simple solution for balls & boxes
61
Decompose ball’s velocity into v x and v y if v x > 0 the ball was travelling rightwards and we only check the left side of the box if v x < 0 the ball was travelling rightwards and we only check the left side of the box if v y > 0 the ball was travelling upwards and we only check the bottom side of the box if v y < 0 the ball was travelling downwards and we only check the upper side of the box Bouncing & Sinking: a simple solution for balls & boxes
62
Decompose ball’s velocity into v x and v y if v x > 0 the ball was travelling rightwards and we only check the left side of the box if (vx > 0 && x0 + r GetLeft()) { vx *= -damp;// bounce with damping x1 = pWall->GetLeft() - r;// amend the position // (to prevent sinking) } // Repeat for remaining three sides... // and, finally, apply all the changes theBall.SetVelocity(vx, vy); theBall.SetPosition(x1, y1); Bouncing & Sinking: a simple solution for balls & boxes
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.