Для подобных столкновений, как правило, проще всего смотреть на них с помощью системы отсчета одного из шаров.
Допустим, у вас есть ball1
и ball2
. Эти шары имеют позиции p1
и p2
соответственно и скорости v1
и v2
. Пусть относительная скорость ball1
относительно ball2
будет v1-v2=v
.
Мы хотим знать, когда ||p1-p2||
меньше ||r1||+||r2||
, где r1
- вектор с длиной радиуса первого шара в направлении ко второму шару, а r2
- наоборот. наоборот.
С точки зрения ball2
, ball1
движется со скоростью v1+v2
. В момент времени t
, ball2
находится в положении p2+(v1+v2)*t
.
Шарики сталкиваются, когда:
(p1-(p2+vt)) = (r1+r2)
-(p2+vt) = (r1+r2)-p1
-p2-vt = (r1+r2)-p1
-vt = (r1+r2)-p1+p2
vt = (p1-p2)-(r1+r2)
Теперь, начиная с ||a|| = ||b||+||c||
, когда a = b+c
, мы знаем, что
||v||t = ||p1-p2|| - ||r1+r2||
t = (||p1-p2|| - ||r1+r2||)/||v||
Например: p1 = (7,5)
и p2=(4,1)
, ||r1||=1
и ||r1||=2
и v1=(1,2)
и v2=(-2,-2)
, затем v=(3,4)
. Столкновение происходит в:
t = (||(3,4)|| - 3)/||(3,4)||
t = (5-3)/(5) = 2/5 = 0.4
Теперь, когда у вас есть время столкновения, легко определить, где находятся шары: -)
изменить, чтобы поместить vectormath в псевдокод:
p = p1-p2
v = v1-v2
t = (sqrt(p.x*p.x + p.y*p.y) - (r1+r2)) / sqrt(v.x*v.x + v.y*v.y)