Предсказание позиции противника, чтобы объект повел его цель

13

В моей 2D игре у меня есть AI башни, которые должны помогать игроку, автоматически открывая огонь по врагам. Я хотел бы заставить их стрелять разумно и вести свою цель вместо того, чтобы просто нацелиться на текущую позицию врага. Итак, учитывая (всегда постоянную) скорость и вектор положения как противника, так и снаряда турели, как я могу найти вектор, представляющий фактическую позицию, на которую должна ориентироваться башня, чтобы снаряд пересек (и ударил) противника?

Будем благодарны за любые ссылки на статьи, которые описывают математику, алгоритмы и т. Д.!

Kryptic
источник
Спасибо за ссылки! Однако я чувствую, что решения немного сложны для чтения, возможно, я смогу найти четкий визуальный ответ на этот вопрос, используя предоставленные вами ссылки, чтобы помочь другим людям, которые столкнулись с той же проблемой.
Larolaro
@Larolaro Я добавил графическую демонстрацию к своему ответу, чтобы вы могли немного лучше ее понять.
Jmacedo
Я описываю подход, который я использую в этом ответе gamedev.stackexchange.com/a/28582/6588
jhocking

Ответы:

3

Я не собираюсь давать вам ответ, я уверен, что это полезно или даже правильно, но здесь это идет:
Поиграв с Mathematica немного больше (проверьте конец ответа для записной книжки / опубликованной записной книжки), это решение кажется правильным, даже если бы оно считалось не лучшим с точки зрения эффективности.

Я написал это в Mathematica, которая соответствует вашей проблеме. В основном это решает уравнения / неравенства для переменной OA, что нам нужно выяснить. Выходные данные дадут нам возможные решения, которые может иметь ОА, и условия, которые необходимо проверить для каждого решения, чтобы оно было действительным:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} - текущая позиция синего

  • {BVx, BVy} - вектор скорости синего цвета

  • {OPx, OPy} - позиция маркера апельсина

  • OV - норма вектора скорости пули апельсина (общая скорость)

  • ОА - угол пули апельсина (угол вектора скорости)

  • t время, необходимое для попадания пули в синий цвет

Я попытался поставить t> 0 && OV> 0 в условиях, но mathematica заняла бы вечность, поэтому я просто использовал t! = 0 && OV! = 0. Так что решения, которые я собираюсь здесь дать, просто работают, когда синий не точно та же позиция, что и у апельсина, и когда пуля апельсина действительно движется (вместо того, чтобы стоять на месте)

Вывод гигантский: http://freetexthost.com/xzhhpr5e2w

Однако, если мы извлечем части OA == _, мы получим это:

http://freetexthost.com/iyrhqoymfo

Это те значения, которые может иметь ОА (для каждого из них требуются разные условия).

После некоторого дальнейшего анализа решений, требующих отрицательного значения OV, чего мы не хотим, я получил следующее:

http://freetexthost.com/iy4wxepeb6

Так что это возможные решения проблемы, для каждого из которых требуются разные условия. Чтобы определенный угол ОА был действительным решением, должны соблюдаться следующие условия:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Выход:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

Поэтому рассмотрите только те решения, в которых это подтверждается (вам не нужно проверять части t == _. Это те, которые дают вам время, необходимое для того, чтобы пуля попала в автомобиль, если выполняются другие условия. Обратите внимание, что если t приводит к отрицательному значению, вы не можете рассматривать данный OA как правильное решение, даже если оно проверяет другие условия (это потому, что мы использовали t! = 0 вместо t> 0 при уменьшении)).

Это также может быть хорошей идеей, чтобы спросить об этом в /math// .

редактировать

Я заинтересовался этим вопросом, поэтому создал записную книжку с графической демонстрацией всего, что я объяснил. Загрузите это здесь:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Или здесь: http://www.2shared.com/file/W01g4sST/towerBullets.html

(это опубликованная версия, и вам нужен только проигрыватель mathematica, который может просматривать его бесплатно. Если у вас нет mathematica, это путь)

Скриншот:

jmacedo
источник
Я могу предоставить условия и решения знаком умножения (*), чтобы вам было легче перенести их на язык программирования (тогда вам нужно будет только заменить ArcTan [...], Sin [...], Cos [...], Sqrt [...] и, в конце концов, знак власти (^).
Jmacedo
Ха, забудь об этом решении. Теперь, когда этот вопрос был объединен, швы ссылок первого ответа содержат лучшие ответы.
Jmacedo