2009-07-29 9 views
13

Mam grę, nad którą pracuję, z pociskami samonaprowadzającymi. W tej chwili tylko zwracają się do celu, który daje raczej głupi efekt, a wszystkie pociski podążają za celem.Jak stworzyć "pocisk przechwytujący" do gry?

Chcę stworzyć bardziej śmiercionośny posmak pocisku, który będzie celował w miejsce docelowe "będzie" do czasu, gdy dotrze do niego i jestem trochę utknięty i zdezorientowany, jak to zrobić.

Zgaduję, że będę musiał ustalić gdzie mój cel będzie w jakimś momencie w przyszłości (i tak zgaduję), ale nie mogę zrozumieć, jak daleko do przodu. Musi opierać się na tym, jak daleko pocisk jest oddalony od celu, ale cel również się porusza.

Moje pociski mają stały ciąg, w połączeniu ze słabą zdolnością skrętu. Mają nadzieję, że będą szybcy i ekscytujący, ale będą krążyć jak krowa (np. Dla fanów non-HitchHiker).

W każdym razie, wydawało mi się to zabawnym problemem dla Stack Overflow, który pomógł mi rozwiązać, więc wszelkie pomysły i sugestie dotyczące lepszych lub bardziej "zabawnych" pocisków byłyby z wdzięcznością przyjęte.

Następna w kolejce będzie AI dla ich uniku ...

+1

BTW: nie wspomniałeś, czy twoje pociski są atmosferyczne czy nie. Czy używają swoich powierzchni kontrolnych lub ich siły napędowej do zmiany wektora? Ciągłe upraszczanie łożysk nadal działa w dowolny sposób, ale uzyskuje się różne/interesujące zachowania przy pociskach atmosferycznych przy różnych prędkościach. E.g., Sidewinder natychmiast po uruchomieniu jest bardzo wężową smugą dymu, nie tak bardzo bezpośrednio przed uderzeniem. –

+3

Przydomek "sidewinder" pojawił się na torze lotu w przód iw tył ... Po pierwszym uruchomieniu jest powolny i pociąga za sobą wiele punktów, aby dostać się na kurs kolizyjny. Gdy przyspiesza, potrzebuje mniej ołowiu i wraca do celu. Po tym, jak silnik się wypali i zacznie deklimatyzować, ponownie pociągnie za sobą. Rezultatem jest ręczny szlak dymny, który wygląda jak ruch grzechotników w poprzek piasku. –

+1

Ten efekt SideWindera był jednym z czynników motywujących do dodania opcji zmiennej proporcjonalności do pocisków kierowanych radarem. Nie ma sensu wyciągać dodatkowych leadów wcześniej, gdy zamknięcie jest niskie, jeśli masz zamiar przyspieszyć i tak czy inaczej potrzebujesz mniej leadów. Tak więc, w przypadku pocisków radarowych, które "znają" zamknięcie, bazują one na szybkości pocisku na zamknięcie i to powoduje im bardziej wcześnie pobierać mniejszą dawkę, gdy nie będą jej później potrzebować. –

Odpowiedz

21

To, co sugerujesz, nazywa się "wytycznymi dowodzenia", ale jest łatwiejszy i lepszy sposób.

Sposób, w jaki zwykle robią to prawdziwe pociski (nie wszystkie są do siebie podobne) wykorzystuje system o nazwie Proporcjonalna nawigacja. Oznacza to, że pocisk "skręca" w tym samym kierunku, w którym linia wzroku (LOS) między pociskiem a celem obraca się, z prędkością skrętu "proporcjonalną" do prędkości LOS ... To zrobi to, co Ty pytając o to, kiedy stawka LOS wynosi zero, jesteś na kursie kolizyjnym.

Możesz obliczyć współczynnik LOS, porównując nachylenia linii między misiem a celem z sekundy na sekundę. Jeśli to nachylenie się nie zmienia, jesteś na kursie kolizyjnym. jeśli się zmienia, obliczyć zmianę i obrócić pocisk proporcjonalną prędkością kątową ... możesz użyć dowolnych danych, które reprezentują pocisk i pozycję docelową.

Na przykład, jeśli używasz stałej proporcjonalności 2, a LOS przesuwa się w prawo o 2 stopnie/s, obróć pocisk w prawo o 4 stopnie/s. LOS w lewo przy 6 stopniach/sek., Pocisk w lewo przy 12 stopniach/sek.

W przypadku problemu z trzema jest taki sam, z wyjątkiem "Zmiany w szybkości LOS", (i wypadkowej stopy zwrotu pocisku) jest sam wektor, tzn. ma nie tylko wielkość, ale kierunek (Czy obracam pocisk w lewo, w prawo, w górę, w dół, 30 stopni powyżej poziomu w prawo itd. ... Wyobraź sobie, że jest to pilot rakietowy , gdzie "ustawisz skrzydła", aby zastosować windę ...

Pociski kierowane radarem, które "znają" tempo zamykania. dostosować stałą proporcjonalności w oparciu o zamknięcie (im wyższe zamknięcie, tym szybciej rakieta próbuje się obrócić), aby pocisk obrócił się bardziej agresywnie w scenariuszach wysokiego zamknięcia (gdy czas lotu jest mniejszy) i mniej agresywnie w niskim zamknięciu (pościg ogonowy), kiedy musi oszczędzać energię. Inne pociski (takie jak Sidewinders), które nie znają zamknięcia, stosują stałą wcześniej określoną wartość proporcjonalności). FWIW, era Wietnamu AIM-9 używało stałej proporcjonalności 4.

+4

+1 za udzielenie odpowiedzi, którą miałem zamiar wpisać. Podsumowanie dla zwykłego czytelnika: jeśli namiar docelowy zmienia się w lewo, skręć w lewo. Jeśli dryfuje w prawo, skręć w prawo. Jeśli ma stałe łożysko (inne niż bezpośrednio za tobą), jesteś na kursie przechwytującym. Sidenote: działa to również na rampie wejściowej na autostradzie, gdy próbujesz się połączyć. Jeśli widzisz samochód o stałym łożysku, który stale się powiększa, musisz dokonać zmiany ... –

+0

@Bob, faktycznie działa nawet, gdy cel jest za Tobą! Jedynym problemem jest to, czym jest zamknięcie ... Jeśli stopa LOS wynosi zero (stała i stabilna LOS), to możesz zbliżyć się do celu lub odejść, ale jesteś na kursie kolizyjnym. Dokładnie tak wygląda działanie większości pocisków powietrze-powietrze. –

+0

@elliot, To nie spowoduje kolizji. Może nawet nie wytworzyć kursu przechwycenia. Kiedy mówisz "podróżowanie szybciej niż cel", podejrzewam, że tak naprawdę nie mówisz o swojej szybkości, zamknij swoje zamknięcie na celu. Oczywiście, jeśli przestaniesz "obracać się w kierunku tgt", gdy będziesz "... szybszy niż tgt", wtedy możesz zostać skierowany w zupełnie niewłaściwym kierunku. Ale nawet jeśli miałeś na myśli zamknięcie, nie jest to najlepszy kurs kolizyjny. A w niektórych przypadkach (gdy prowadzi się mniej niż prędkość tgt), zwrot w kierunku tgt zmniejszy nawet zamknięcie. –

16

Użyłem tego artykułu CodeProject wcześniej - ma kilka naprawdę ładne animacje wyjaśniają matematyki.

„Matematyka Kierowanie i Symulowanie Missile: Z rachunku do Formuły Quartic”: http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx

(również ukryte w komentarzach na dole tego artykułu jest odniesienie do some C++ code that accomplishes the same task z Unreal wiki)

+0

+1, świetny artykuł, nawet jeśli wymaga on dość zaangażowania, aby przeczytać, kiedy TY MOŻESZ podać algorytm (y). –

+0

Chciałbym również przyjąć tę odpowiedź, ponieważ artykuł jest bardzo dobry. Wcześniej głosowałem i polecam innym, aby zrobili to samo. –

0

Będziesz chciał interpolować trajektorię celu i pocisku w funkcji czasu. Następnie wyszukaj czasy, w których współrzędne obiektów mieszczą się w dopuszczalnym błędzie.

1

Czy rozważałeś negatywne opinie na temat ostatniej zmiany sposobu zmiany czasu?

Szczegóły pozostawione jako ćwiczenie.

Podane sugestie są całkowicie poważne: jeśli cel nie wykonuje manewrów, powinien uzyskać prawie optymalny punkt przecięcia. I powinno się zbiegać, nawet jeśli cel aktywnie unika.

Potrzebujesz więcej szczegółów?

Rozwiązywanie w przestrzeni dwuwymiarowej dla ułatwienia zapisu. Weź \vec{m} za lokalizację pocisku i wektora. \vec{t} Aby być lokalizacją celu. Bieżący kurs w kierunku ruchu w stosunku do ostatniej jednostki czasu: \vec{h} = \bar{\vec{m}_i - \vec{m}_i-1}}. Niech r będzie normowanym wektorem między pociskiem a celem: \vec{r} = \bar{\vec{t} - \vec{m}}. Łożysko to b = \vec{r} \dot \vec{h} Obliczyć łożysko za każdym razem odznacz, i jego zmianę, i zmienić kurs w celu zminimalizowania tej ilości.

Matematyka jest bardziej błotna w 3d ze względu na konieczność znalezienia płaszczyzny działania na każdym kroku, ale proces jest taki sam.

+1

@dmckee: Myślę, że zostałeś odrzucony, ponieważ większość osób czytających tę odpowiedź nie ma pojęcia, co to jest mówiąc, a oryginalna wersja twojego pytania praktycznie nic nie powiedziała. –

+0

Rzeczywistość problemu przechwytywania naiwnego pocisku jest prostsza niż ta. Obliczasz wektor przechwytywania, który możesz chcieć dostarczyć inteligentnemu wojownikowi. Pocisk jest doskonale zadowolony z "Zbliżam się", więc stałe uproszczenie łożyska omówione w innych odpowiedziach jest całkowicie dopuszczalne dla tego zastosowania. –

+0

@ Bob: To * jest * podejście stałego łożyska. Ujemny kanał zwrotny na , prowadzi do stałego wprowadzania danych. Opóźnienia Modulo i tempo zmian, które może wymagać sterownika PID, a nie prostego obwodu proporcjonalnego. – dmckee

5

Spójrz na OpenSteer. Ma kod do rozwiązywania takich problemów. Spójrz na "steerForSeek" lub "steerForPursuit".