В моей 2D игре у меня есть AI башни, которые должны помогать игроку, автоматически открывая огонь по врагам. Я хотел бы заставить их стрелять разумно и вести свою цель вместо того, чтобы просто нацелиться на текущую позицию врага. Итак, учитывая (всегда постоянную) скорость и вектор положения как противника, так и снаряда турели, как я могу найти вектор, представляющий фактическую позицию, на которую должна ориентироваться башня, чтобы снаряд пересек (и ударил) противника?
Будем благодарны за любые ссылки на статьи, которые описывают математику, алгоритмы и т. Д.!
Ответы:
Этот вопрос о GameDev и этот вопрос о StackOverflow должен дать вам ответ, который вы ищете. :)
источник
Я не собираюсь давать вам ответ, я уверен, что это полезно или даже правильно, но здесь это идет:Поиграв с Mathematica немного больше (проверьте конец ответа для записной книжки / опубликованной записной книжки), это решение кажется правильным, даже если бы оно считалось не лучшим с точки зрения эффективности.
Я написал это в Mathematica, которая соответствует вашей проблеме. В основном это решает уравнения / неравенства для переменной 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
Так что это возможные решения проблемы, для каждого из которых требуются разные условия. Чтобы определенный угол ОА был действительным решением, должны соблюдаться следующие условия:
Выход:
Поэтому рассмотрите только те решения, в которых это подтверждается (вам не нужно проверять части 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, это путь)
Скриншот:
источник