Przewidywanie pozycji wroga, aby obiekt prowadził cel

13

W mojej grze 2D mam wieżyczki AI, które powinny wspierać gracza, automatycznie strzelając w kierunku wrogów. Chciałbym zmusić ich do inteligentnego strzelania i poprowadzenia celu, zamiast po prostu wycelować w obecną pozycję wroga. Biorąc więc pod uwagę (zawsze stały) wektor prędkości i położenia zarówno wroga, jak i pocisku wieży, jak mogę znaleźć wektor, który reprezentuje faktyczną pozycję, na którą musi skierować się wieża, aby pocisk przeciął (i uderzył) wroga?

Wszelkie linki do artykułów opisujących matematykę, algorytmy itp. Będą mile widziane!

Kryptic
źródło
Dzięki za linki! Jednak uważam, że rozwiązania są trochę trudne do odczytania, być może uda mi się uzyskać jasną wizualną odpowiedź na to pytanie, korzystając z podanych linków, aby pomóc innym, którzy borykają się z tym samym problemem.
Larolaro,
@ Larolaro Do mojej odpowiedzi dodałem demonstrację graficzną, abyś mógł ją lepiej zrozumieć.
jmacedo
Opisuję
jhocking

Odpowiedzi:

3

Nie dam ci odpowiedzi, jestem pewien, że jest przydatna, a nawet poprawna, ale oto:
Po odrobinie zabawy z matematyką (sprawdź koniec odpowiedzi dla notebooka / opublikowanego notebooka) to rozwiązanie wydaje się być poprawne, nawet sądząc, że może nie być najlepsze pod względem wydajności.

Napisałem to w matematyce, co odpowiada twojemu problemowi. Zasadniczo rozwiązuje równania / nierówności w celu uzyskania zmiennej OA, której musimy się dowiedzieć. Dane wyjściowe podadzą nam możliwe rozwiązania, jakie może mieć OA, oraz warunki, które należy zweryfikować, aby każde rozwiązanie było ważne:

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

  • {BVx, BVy} to wektor prędkości niebieskiego

  • {OPx, OPy} to pozycja kuli pomarańczy

  • OV jest normą wektora prędkości pocisku pomarańczy (prędkość całkowita)

  • OA jest kątem pocisku pomarańczy (kąt wektora prędkości)

  • t jest czasem potrzebnym, aby pocisk trafił w niebieski

Próbowałem umieścić t> 0 i & OV> 0 w warunkach, ale matematyka potrwałaby wieczność, więc po prostu użyłem t! = 0 i & OV! ta sama pozycja co pomarańczowy i kiedy kula pomarańczy naprawdę się porusza (zamiast pozostać w bezruchu)

Dane wyjściowe są gigantyczne: http://freetexthost.com/xzhhpr5e2w

Jeśli jednak wyodrębnimy części OA == _, otrzymamy:

http://freetexthost.com/iyrhqoymfo

Są to wartości, które może mieć OA (każda z nich wymaga innych warunków, aby była ważna).

Po kilku dalszych analizach, które eliminują rozwiązania, które wymagają OV, a których nie chcemy, otrzymałem:

http://freetexthost.com/iy4wxepeb6

Są to możliwe rozwiązania problemu, z których każdy wymaga różnych warunków, aby był ważny. Aby określony kąt OA był prawidłowym rozwiązaniem, muszą być spełnione następujące warunki:

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

Wynik:

(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)

Więc rozważ tylko rozwiązania, w których to weryfikuje (nie musisz weryfikować części t == _. Są to te, które dają ci czas potrzebny na uderzenie pocisku w pojazd, jeśli inne warunki są prawidłowe. Zauważ, że jeśli t daje wartość ujemną, nie można uznać danego OA za prawidłowe rozwiązanie, nawet jeśli weryfikuje on inne warunki (dzieje się tak, ponieważ użyliśmy t! = 0 zamiast t> 0 w redukcji).

Warto również zapytać o to na /math// .

Edytować

Zainteresowałem się tym pytaniem, więc stworzyłem skomentowany notatnik z graficzną prezentacją wszystkiego, co wyjaśniłem. Pobierz to tutaj:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Lub tutaj: http://www.2shared.com/file/W01g4sST/towerBullets.html

(jest to opublikowana wersja i potrzebujesz tylko odtwarzacza matematyki - który jest darmowy - aby go zobaczyć. Jeśli nie masz matematyki, jest to odpowiedni sposób)

Zrzut ekranu:

jmacedo
źródło
Mogę podać warunki i rozwiązania ze znakiem mnożenia (*), aby ułatwić Ci przeniesienie ich na język programowania (wtedy wystarczy tylko wymienić ArcTan [...], Sin [...], Cos [...], Sqrt [...] i ostatecznie znak mocy (^).
jmacedo,
Hah, zapomnij o tym rozwiązaniu. Teraz, gdy pytanie zostało scalone, linki pierwszej odpowiedzi łączą się, by zawierać lepsze odpowiedzi.
jmacedo