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!
Odpowiedzi:
To pytanie na GameDev i to pytanie na StackOverflow powinno dostarczyć ci odpowiedzi, której szukasz. :)
źródło
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:
{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:
Wynik:
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:
źródło