introduc)on*to* par)cle*simulaons*
TRANSCRIPT
![Page 1: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/1.jpg)
Introduc)on to Par)cle Simula)ons
Daniel Playne
![Page 2: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/2.jpg)
Par)cle Simula)ons
Another major class of simulations are particle or n-body simulations.!!In these simulations the state of the system is represented by particles.!
![Page 3: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/3.jpg)
Par)cle Simula)ons
Generally each particle is represented by a set of fields. These are often:!a position!a velocity!a mass!a radius!
and possibly:!a rotation!an angular velocity!
![Page 4: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/4.jpg)
Par)cle Simula)ons
These particles can represent different entities depending on the simulation. This could be:!atoms!molecules!dust particles!snooker balls!asteroids!planets!galaxies!
![Page 5: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/5.jpg)
Par)cle Simula)ons
These particles all behave in fundamentally similar ways. This behaviour is based on Newton’s Laws of Motion.!!These three laws are the basis for classical mechanics.!
![Page 6: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/6.jpg)
Par)cle Simula)ons
First Law: Every object continues in its state of rest, or of uniform motion in a straight line, unless compelled to change that state by external forces acted upon it.!
![Page 7: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/7.jpg)
Par)cle Simula)ons
Second Law: The acceleration a of a body is parallel and directly proportional to the net force F acting on the body, is in the direction of the net force, and is inversely propotional to the mass m of the body. !!F = ma!
![Page 8: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/8.jpg)
Par)cle Simula)ons
Third Law: When two bodies interact by exerting force on each other, these forces are equal in magnitude, but opposite in direction.!
![Page 9: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/9.jpg)
Par)cle Simula)ons
Simple case – Hockey Pucks!!Each particle represents a hockey puck sliding around on the ice. This is simple 2D system is relatively easy to simulate. !
![Page 10: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/10.jpg)
Par)cle Simula)ons
First step – Vectors.!!In this sense a vector is referring to a mathematical or Euclidean vector. These consist of co-ordinates in space. We usually talk in vectors because it makes it easier to define something in 1D, 2D, 3D, 4D...!
![Page 11: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/11.jpg)
Par)cle Simula)ons
For our 2D hockey pucks a vector is as simple as (x,y). We need two vectors for each particle – position and velocity.!!In this case we are going to assume that every hockey puck has the same mass and the same radius.!
![Page 12: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/12.jpg)
Par)cle Simula)ons
In this case each particle has a position p and a velocity v with mass m=1 and radius r=1.!!To simulate the particles moving, we must calculate a new position for the particle after some period of time has passed. This is the time-step of the simulation. !
![Page 13: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/13.jpg)
Par)cle Simula)ons
This can be written simply as:!pt+h = pt + vt*h!!This is known as the Euler integration method. Which is suitable for this type of particle simulation.!!
![Page 14: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/14.jpg)
Par)cle Simula)ons
Our algorithm to update a particle simulation is as simple as:!!• main loop!
– for all particles!• ‘move’ particle!
• repeat!
![Page 15: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/15.jpg)
Par)cle Simula)ons
Our algorithm to update a particle simulation is as simple as:!!for(int i = 0; i < N; i++) {!!p[i] = p[i] + v[i] * h;!
}!
![Page 16: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/16.jpg)
Par)cle Simula)ons
Unfortunately this is a rather boring simulation. Each particle moves in a straight line and will never stop. To make it slightly more interesting we will have to enforce collisions.!Collisions occur when a ‘hard’ particle hits into another ‘hard’ object.!
![Page 17: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/17.jpg)
Par)cle Simula)ons
The easiest collisions are particles colliding with immovable objects.!!In this case our hockey pucks bouncing off the walls of the hockey rink.!
![Page 18: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/18.jpg)
Par)cle Simula)ons
In any collision system there are two parts, the collision detection and the collision response.!!To check to see if a puck has collided with the sides of the rink, simply check to see if the puck is outside the bounds.!
![Page 19: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/19.jpg)
Par)cle Simula)ons
Once a collision has been detected the system must respond to the collision. For our hockey pucks, simply reverse the velocity in the direction of the collision.!
![Page 20: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/20.jpg)
Par)cle Simula)ons • main loop!
– for all particles!• ‘move’ particle!• if ‘collision’ with boundary!
– respond to collision!• repeat!
![Page 21: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/21.jpg)
Par)cle Simula)ons
Our algorithm to update a particle simulation is as simple as:!for(int i = 0; i < N; i++) {!!p[i] = p[i] + v[i] * h;!!if(p[i].x-r < 0 || p[i].x+r > width) {!! !v[i].x = -v[i].x;!!}!!if(p[i].y-r < 0 || p[i].y+r > height) {!! !v[i].y = -v[i].y;!!}!
}!
![Page 22: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/22.jpg)
Par)cle Simula)ons
More complex objects will require more complex collision detection and response systems.!!For example – hockey pucks bouncing off each other.!
![Page 23: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/23.jpg)
Par)cle Simula)ons
This is now significantly more complicated. After each time-step the simulation must compare every pair of particles to see if they have collided by calculating the distance between them and checking to see if that distance is less than the combined radius of the hockey pucks.!
![Page 24: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/24.jpg)
Par)cle Simula)ons • main loop!
– for all particles!• ‘move’ particle!• if ‘collision’ with boundary!
– respond to collision!– for all particles!
• for all other particles!– if ‘collision’ between particles!
» respond to collision!• repeat!
![Page 25: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/25.jpg)
Par)cle Simula)ons ...!for(int i = 0; i < N; i++) {! for(int j = 0; j < N; j++) {! if(distance(p[i],p[j]) < r*2) {!! ! !collision!!! !}!
} !!}!
![Page 26: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/26.jpg)
Par)cle Simula)ons
Responding to a collision between particles is more complicated than an immovable wall.!!In our example the mass of both particles is the same which makes the collision easier to calculate.!
![Page 27: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/27.jpg)
Par)cle Simula)ons
Calculating a collision in one dimension is simple if the masses are the same:!v1 = u2!v2 = u1 !!where:!u1 and u2 are the initial velocities!v1 and v2 are the final velocities!!
![Page 28: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/28.jpg)
Par)cle Simula)ons
In two dimensions this is not as simple. The velocities of the particles must be split into the components that are in the direction of the collision.!
![Page 29: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/29.jpg)
Par)cle Simula)ons
The ‘component’ of the velocity to be used in the collision is found from the dot product of the velocity and the unit vector. !
![Page 30: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/30.jpg)
Par)cle Simula)ons
This component is the part used in the collision:!u1�d1 = u1.x*d1.x + u1.y*d1.y !
d1
d2
u2
u1 d1*(u1�d1)
d2*(u2�d2)
![Page 31: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/31.jpg)
Par)cle Simula)ons
This is how the new value can be calculated.!
d1*(u1�d1)
d2*(u2�d2)
u1
v1 d1*(u1�d1)
d2*(u2�d2)
u2
v2
![Page 32: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/32.jpg)
Par)cle Simula)ons
d1*(u1�d1)
d2*(u2�d2)
u1
v1
d1*(u1�d1)
d2*(u2�d2)
u2 v2
![Page 33: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/33.jpg)
Par)cle Simula)ons
d1*(u1�d1)
d2*(u2�d2)
u1
v1
This calculation can be written as:!!v1 = u1 – d1*(dot(u1,d1)) + d2*(dot(u2,d2)) !v2 = u2 – d2*(dot(u2,d2)) + d1*(dot(u1,d1)) !
d1*(u1�d1)
d2*(u2�d2)
u2
v2
![Page 34: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/34.jpg)
Par)cle Simula)ons ...!for(int i = 0; i < N; i++) {! for(int j = i+1; j < N; j++) {! if(distance(p[i],p[j]) < r*2) {!! ! !v1 = u1 – d1*(dot(u1,d1)) + d2*(dot(u2,d2))!! ! !v2 = u2 – d2*(dot(u2,d2)) + d1*(dot(u1,d1)) !! !}!
} !!}!
![Page 35: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/35.jpg)
Par)cle Simula)ons
There is a certain degree of error in this calculation. This is caused by the fact that the particles are allowed to move inside each other before the collision occurs.!
![Page 36: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/36.jpg)
Par)cle Simula)ons
This can be solved by ‘reversing’ time to the point of the collision. Calculating the new velocities and then stepping the simulation back to the present time.!
![Page 37: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/37.jpg)
Par)cle Simula)ons
The calculation for this is:!!if(distance(p[i],p[j]) < r*2) {!
!t=(r*2-distance(p[i],p[j]))/dot(u1,d1)+dot(u2,d2))!!p1 = p1 – u1*t!!p2 = p2 – u2*y!
v1 = u1 – d1*(dot(u1,d1)) + d2*(dot(u2,d2))! v2 = u2 – d2*(dot(u2,d2)) + d1*(dot(u1,d1)) !
!p1 = p1 + v1*t!!p2 = p2 + v2*t!
}!!
!
![Page 38: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/38.jpg)
Par)cle Simula)ons
This can lead to a new problem, because the particles are moving during the ‘collision’ phase. This movement can cause additional collisions.!!In order to solve this problem the collisions must be resolved in the order they occur. The algorithm becomes:!!
![Page 39: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/39.jpg)
Par)cle Simula)ons • main loop!
– for all particles!• ‘move’ particle!• if ‘collision’ with boundary!
– respond to collision!– detect collisions!– while collision has occurred!
• find and resolve first collision!• detect collisions!
• repeat!
!!
![Page 40: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/40.jpg)
Par)cle Simula)ons
In this way the collisions are always resolved in the order they would have occurred and there is no error introduced by our system.!
![Page 41: Introduc)on*to* Par)cle*Simulaons*](https://reader031.vdocuments.net/reader031/viewer/2022012300/61e0eb6f5e4c41017f09c907/html5/thumbnails/41.jpg)
Par)cle Simula)ons
!!
Example!