//function for the friction on the horizontal ground void applyFrictionOfGround(CannonBall ball) { //use a friction coefficient to decelerate the ball float frictionCoeff = 0.95f; ball.addVelocity(new Vector2(-ball.getVelocity().x *(1 - frictionCoeff), 0)); }
//function for the bouncing solution of collison, taking a ball and a line represented by two points //as parameters void bouncingAfterTerrainCollision(CannonBall ball, float x1, float y1, float x2, float y2) { //calculate bouncing velocity using the formula V+ = V- + dotProduct(j,n)/m, //where V- is the velocity when colliding, V+ is the velocity after colliding, //dotProduct(j,n) = J which is the impulse, and j = -(1+epsilon) * m * Vn- where //Vn- = dotProduct(V-,n). Vector2 unitNormal = CollisionCalculation.getNormal(x1, y1, x2, y2); //calculate the unit normal of the line float epsilon = 0.55f; //the coefficient of restitution (0~1, when it's 1 we have perfect bouncing) float mass = 1f; //mass of the ball float VnCollided = unitNormal.x * ball.getVelocity().x + unitNormal.y * ball.getVelocity().y; //Vn-: the normal component of collided velocity = dot product of normal and velocity float j = -(1 + epsilon) * mass * VnCollided; //the impulse scalar j = -(1+epsilon) * m * Vn- Vector2 impulse = j * unitNormal; //J ball.addVelocity(impulse / mass); //update the velocity based on the impulse (V+ = V- + impulse/mass) }