проверить каждые 2 объекта на столкновение
это забавные вещи. Да, вы можете решить систему неравенств, таких как:
| ( pos0 + vel0 * t ) - (pos1 + vel1 * t ) | <= threshold
, но здесь я использовал более простой способ
Идея состоит в том, чтобы вычислить t
, где тестируемые объекты находятся ближе всего друг к другу (если приближаются друг к другу).
, чтобы мы могли экстраполировать будущую позицию каждого объекта следующим образом:
pos(t) = pos(t0) + vel*(t-t0)
, где t
- фактическое время, а t0
- сомВремя начала (например, t0=0
).
предположим, что у нас есть 2 объекта (pos0,vel0,pos1,vel1
), которые мы хотим проверить, поэтому рассчитайте первые 2 итерации их расстояния так:
pos0(0) = pos0;
pos1(0) = pos1;
dis0 = | pos1(0) - pos0(0) |
pos0(dt) = pos0 + vel0*dt;
pos1(dt) = pos1 + vel1*dt;
dis1 = | pos1(dt) - pos0(dt) |
где dt
- достаточно малое время (чтобы не пропустить столкновение).Теперь if (dis0<dis1)
затем объекты косят, поэтому столкновения нет, if (dis0==dis1)
объекты не движутся или не движутся параллельно друг другу и только if (dis0>dis1)
объекты приближаются друг к другу, поэтому мы можем оценить:
dis(t) = dis0 + (dis1-dis0)*t
и столкновение ожидает, что dis(t)=0
, поэтому мы можем экстраполировать снова:
0 = dis0 + (dis1-dis0)*t
(dis0-dis1)*t = dis0
t = dis0 / (dis0-dis1)
, где t
- предполагаемое время столкновения.Конечно, все это обрабатывает все движения как линейные и много экстраполирует, поэтому это не точно, но, как вы можете сделать это для более последовательных кадров, и результат будет более точным со временем, близким к столкновению ... Также, чтобы убедиться, что вы должныэкстраполировать положение каждого объекта во время предполагаемого столкновения, чтобы проверить результат (если не столкновение, то экстраполяция была просто числовой, и объекты не сталкивались, просто находились рядом с каждым какое-то время)