Прогнозування позиції противника для того, щоб об’єкт лідирував у ціль


13

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

Будемо вдячні будь-які посилання на статті, що описують математику, алгоритми тощо!



Дякуємо за посилання! Однак я вважаю, що їх рішення важко читати, можливо, я можу зібрати чітку візуальну відповідь на це питання, використовуючи посилання, які ви надали, щоб допомогти будь-яким іншим, хто стикається з тією ж проблемою.
Лароларо

@Larolaro Я додав у свою відповідь графічну демонстрацію, щоб ви могли це трохи зрозуміти.
jmacedo

Я описую підхід я беру в цій відповіді gamedev.stackexchange.com/a/28582/6588
jhocking

Відповіді:



3

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

Я написав це в математиці, яка відповідає вашій проблемі. В основному він вирішує рівняння / нерівності для того, щоб змінна ОА, що саме нам потрібно з'ясувати. Результат дасть нам можливі рішення, які може мати ОА, і умови, які потрібно перевірити, щоб кожне рішення було дійсним:

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 - норма вектора швидкості руху кулі апельсина (загальна швидкість)

  • OA - кут помаранчевої кулі (вектор кута швидкості)

  • t - час, необхідний для потрапляння кулі в синій колір

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

Вихід є гігантським: http://freetexthost.com/xzhhpr5e2w

Однак якщо ми дістаємо частини OA == _, ми отримуємо це:

http://freetexthost.com/iyrhqoymfo

Це значення, які може мати ОА (кожне з яких вимагає наявності різних умов).

З деяким подальшим аналізом, який виймав рішення, які вимагають від ОВ негативного характеру, якого ми не хочемо, я зрозумів:

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

(це опублікована версія, і вам потрібен лише гравець з математики - який безкоштовний - щоб побачити це. Якщо у вас немає математики, це шлях)

Знімок екрана:


Я можу надати умови та рішення знаком множення (*), щоб вам було простіше перенести їх на свою мову програмування (тоді вам потрібно буде лише замінити ArcTan [...], Sin [...], Cos [...], Sqrt [...] і врешті-решт знак потужності (^).
jmacedo

Га, забудь про це рішення. Тепер, коли це питання було об'єднано, посилання на першу відповідь зашиваються на кращі відповіді.
jmacedo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.