Simple Physics Engine :: Reflection
A demo in several parts.
HTML
<canvas id="the_canvas" width="250" height="250"></canvas>
JavaScript
/*
* Simple Physics Engine
* http://jsfiddle.net/user/klenwell/fiddles/
*
* TODO:
* Add start/stop button
*
* NOTES:
* Resolves vanishing ball issue by adding last_point method to ball object
* for Physics.find_contact_point, but still occasional wedging issues
*/
var __VERSION__ = "0.3.5"
var inspector = {};
var Physics = {
collide_balls: function(ball1, ball2) {
// calculate restitution
// TODO: add elasticity attr to circles
var ball1_elasticity = 1.0;
var ball2_elasticity = 1.0;
// invert masses
var im1 = 1.0 / ball1.m;
var im2 = 1.0 / ball2.m;
// get minimum translation distance
var delta = ball1.point().subtract(ball2.point()); // soustrait vecteur B de A
var d = delta.get_length();
var mtd = delta.multiply(ball1.r + ball2.r - d).multiply(1.0 / d);
// push-pull apart based on mass
var ball1_pt = ball1.point().add(mtd.multiply(im1 / (im1 + im2)));
var ball2_pt = ball2.point().subtract(mtd.multiply(im2 / (im1 + im2)));
ball1.set_point(ball1_pt.x, ball1_pt.y);
ball2.set_point(ball2_pt.x, ball2_pt.y);
// calculate impact speed
var v = ball1.velocity().subtract(ball2.velocity());
var vn = v.dot(mtd.normalized());
// positive vn means balls are already moving away for one another
if ( vn > 0 ) {
return;
}
var restitution = ball1_elasticity * ball2_elasticity;
// collision impulse
var i = (-1.0 * (1.0 + restitution) * vn) / (im1 + im2);
var impulse = mtd.normalized().multiply(i);
// transfer momentum
var v1 = ball1.velocity().add(impulse.multiply(im1));
var v2 = ball2.velocity().subtract(impulse.multiply(im2));
// set new velocities
ball1.set_velocity(v1.x, v1.y);
ball2.set_velocity(v2.x,...