Предполагая, что вы выполняете простое (похожее на игру) моделирование бильярда, вы можете использовать что-то вроде:
v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal);
Здесь v_old
- ваш текущий вектор скорости, а boundary_normal
- нормаль, указывающая внутрьвашего круглого бильярдного стола в точке удара.Если вы знаете центр c
вашего круглого стола и у вас есть точка удара p
, тогда нормаль будет просто normalize(c-p)
.То есть нормализованный вектор, который вы получаете при вычитании p
из c
.
Теперь я взял coeff
как коэффициент выдумки между 0 (вообще никакой скорости после удара) и 1 (та же скорость после удара).Вы можете сделать это более физически правдоподобным, определив правильный коэффициент реституции.
В конце концов, вся формула, приведенная выше, проста: отражение , как вы, например, могли видеть в базовом трассировщике лучей.Как уже говорилось, это довольно грубая абстракция от точного моделирования физики, но, скорее всего, сделает эту работу.