Определить траекторию для последователей объекта - кривая преследования
Я начал разрабатывать траектории юнитов для игрового сервера, и сейчас я пытаюсь определить положение юнита в данный момент времени. Это легко, когда траектория представляет собой просто прямую линию, но гораздо сложнее, когда юнит преследует другой юнит.
Я сделал флэш-приложение, чтобы проиллюстрировать проблему. Черная траектория для единицы, которая движется в одном направлении. Голубые погони за черными, а красные погони за голубыми Я хочу предварительно рассчитать траекторию движения для синих и красных, чтобы иметь возможность восстановить их положение за постоянное время.
Является ли это возможным? Спасибо за любую помощь!
2 ответа
Вот статья Классическая проблема преследования, решаемая с точки зрения физики Карлом Э. Манганом, которая решает конкретную версию, в которой преследователь изначально перпендикулярен траектории преследуемого объекта. Я считаю, что это несущественный элемент решения, поскольку эта перпендикулярность исчезает вдоль остальной части траектории.
Это автономная система дифференциальных уравнений в том смысле, что время не фигурирует явно в коэффициентах или членах уравнений. Это подтверждает идею о том, что семейство решений, приведенных в статье, достаточно общее, чтобы обеспечить неперпендикулярные начальные условия.
В документе приводятся дополнительные ссылки и ссылки, а также полезный поисковый термин "кривые преследования".
Давайте сформулируем немного другое, чуть более общее начальное состояние, чем у Мунгана. Предположим, что преследуемый объект ("корабль") изначально находится в начале координат и движется вверх по положительной оси y (x=0) с постоянной скоростью V. Объект преследования ("торпеда") изначально расположен в точке (x0,y0) и хотя мгновенно переориентируется непосредственно на "корабль", он также движется с некоторой постоянной скоростью v.
Особый случай, когда x0 равен нулю, приводит к линейной кривой преследования, то есть лобовое столкновение или конечная погоня соответственно, когда y0 является положительным или отрицательным. В противном случае при отражении по оси y можно без ограничения общности считать, что x0 > 0. Таким образом, рациональные степени x-координат будут четко определены.
Предположим для нашей непосредственной цели, что скорости V,v неравны, так что отношение r = V/v не равно 1. Ниже приведено решение (1) в замкнутой форме для кривой "торпедо", аналогичное уравнению Мунгана (10):
(1+r) (1-r)
[ (x/H) (x/H) ]
(y/H) = (1/2) [ ----- - ----- ] + C (1)
[ (1+r) (1-r) ]
в которой постоянные H,C могут быть определены начальными условиями.
Применяя условие, что первоначально торпеда движется в направлении местоположения корабля в начале координат, мы берем производную по x в (1) и отменяем множитель 1/H с обеих сторон:
r -r
dy/dx = (1/2) [ (x/H) - (x/H) ] (2)
Теперь сравним наклон кривой dy/dx в начальной точке (x0,y0) с наклоном ее линии, проходящей через начало координат:
r -r
(x0/H) - (x0/H) = 2y0/x0 = K (3)
Это составляет квадратное уравнение для положительного B = (x0/H)^r:
B^2 - K*B - 1 = 0 (4)
а именно B = [K + sqrt(K^2 + 4)]/2 (но используйте альтернативную форму, если K < 0, чтобы избежать ошибки отмены), что позволяет определить H из наших знаний о x0 и r:
H = x0/(B^(1/r)) (5)
Знание H упрощает определение аддитивной постоянной C в (1), подставляя туда начальную точку (x0,y0).
Сложнее будет определить, какой точке траектории "торпеда" соответствует данное время t > 0. Обратное решение этой задачи решается довольно просто. Для заданной точки на траектории найдите касательную линию в этой точке, используя производную формулу (2), и выведите время t из y-точки пересечения b этой линии (то есть из текущей позиции "корабля"):
t = b/V (6)
Поэтому определение (x(t),y(t)), где находится "торпеда" в данный момент времени t> 0, по существу является упражнением по поиску корней. Один легко заключает в скобки желаемое значение x (t) между двумя x-координатами x1 и x2, которые соответствуют моментам времени t1 и t2, так что t1
Я могу создать для вас проблему, но не решить ее.
Черная кривая движется с постоянной скоростью v0 и по прямой.
Синяя кривая движется с постоянной скоростью v1 в направлении черного.
Для простоты выберите координаты так, чтобы в момент времени t = 0 черная кривая начиналась с (x=0, y=0) и двигалась в направлении x.
Таким образом, в момент времени t >= 0 положение черной кривой равно (v0 t, 0).
Постановка задачи
Цель состоит в том, чтобы найти x, y синей кривой для моментов времени t >= 0 с учетом начальной позиции (x(t=0), y(t=0)). Дифференциальные уравнения движения
dx / dt = v1 (v0 t - x) / a (t)
dy / dt = v1 (- y) / a (t)
где a(t) = sqrt((v0 t - x)^2 + (y^2)) - расстояние между синим и черным в момент времени t.
Это система двух нелинейных связанных дифференциальных уравнений. Кажется вероятным, что нет полного аналитического решения. Вольфрам Альфа сдается без попыток ввода
D[y[t],t] = -y[t] / sqrt[(t-x[t])^2 + y[t]^2], D[x[t],t] = (t-x[t]) / sqrt[(t-x[t])^2 + y[t]^2]
Вы можете попробовать спросить на math.stackexchange. Удачи!