Код:
float k = 2.0f; // k = [ 1.0f ... 2.0f ]
float coef = mass / (mass + whom->mass);
Vertex3Df relSpeed = speed - whom->speed;
Vertex3Df nRelSpeed = -((-normal) & relSpeed) * normal;
nRelSpeed *= k;
speed -= (1.0f - coef) * nRelSpeed;
whom->speed += coef * nRelSpeed;
тут ООП-ный код, текущий объект - шар, а whom - шар с которым столкновение происходит.
mass, speed поля масс и скоростей соответственно, raduis в данном расчете не нужен
normal - нормаль столкновения, в сущности вектор соединяющий центры шаров, но единичной длины. в какую сторону направлен уже не помню.
ессесно используется векторная алгебра, так что operator& - скалярное умножение векторов (dot product).
k контролирует степень упругости удара, при 2 - абсолютно упругий.