Search code examples
c++cgame-physicsphysics

Simple yet realistic billiard ball acceleration


I have a simple 2D game of pool. You can give a ball some speed, and it'll move around and hit other balls. But I want a ball to stop eventually, so I added some acceleration, by running this code every frame:

balls[i].ax = -balls[i].vx * 0.1;
balls[i].ay = -balls[i].vy * 0.1;
...
if(hypot(balls[i].vx, balls[i].vy) < 0.2){
    balls[i].vx = 0;
    balls[i].vy = 0;
}

And it works... But I find it weird, not realistic. I have no physics knowledge, but I'm pretty sure friction should not depend on speed.

How can I improve physics of slowing down without too much complexity?


Solution

  • The rolling friction formula is this: F_k,r​=μ_k,r_​Fn. It only factors in the properties of the surface (μ_k) and the force on the ball (r_​Fn). This should decelerate with a constant value, just adjust it until it looks roughly correct.

    Example code:

    x = 1 // mess around with this until it looks right
    if (ball.xVelocity > x) { ball.xVelocity -= x } else { ball.xVelocity = 0 }
    if (ball.yVelocity > x) { ball.yVelocity -= x } else { ball.yVelocity = 0 }