Jak stworzyć "pocisk przechwytujący" do gry?

Mam grę, nad którą pracuję, w której są pociski naprowadzające. W tej chwili po prostu zwracają się w kierunku celu, co daje dość głupi wynik, z wszystkich pocisków podążających za celem wokół.

Chcę stworzyć bardziej śmiercionośny smak pocisku, który wyceluje w miejsce, w którym cel "będzie", zanim dotrze na miejsce, a ja trochę utknąłem i nie wiem, jak to zrobić.

Zgaduję, że będę musiał ustalić, gdzie mój cel będzie w jakimś punkt w przyszłości (zgaduję w każdym razie), ale nie mogę się zorientować, jak daleko do przodu, aby spojrzeć. Musi być oparta na tym, jak daleko pocisk jest od celu, ale cel również porusza.

Moje pociski mają stały ciąg, połączony ze słabą zdolnością do skrętu. Mam nadzieję, że będą szybkie i ekscytujące, ale steruj jak krowa(tzn. źle, dla fanów nie autostopowiczów tam).

W każdym razie wydawało mi się, że to fajny problem dla Stack Overflow, który pomoże mi rozwiązać, więc wszelkie pomysły, lub sugestie dotyczące lepszych lub" bardziej zabawnych " pocisków będą z wdzięcznością przyjmowane.

Następna będzie AI za unikanie ich ...

Author: knittl, 2009-07-29

5 answers

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

Sposób, w jaki robią to prawdziwe pociski (nie wszystkie są podobne), wykorzystuje system zwany proporcjonalną nawigacją. Oznacza to, że pocisk "obraca się" w tym samym kierunku, w którym linia wzroku (LOS) między pociskiem a celem się obraca, z szybkością skrętu "proporcjonalną" do szybkości LOS... To zrobi to, o co prosisz, ponieważ gdy stawka LOS wynosi zero, jesteś na kolizji oczywiście.

Możesz obliczyć LOS rate, porównując nachylenia linii między misile i target z jednej sekundy do następnej. Jeśli nachylenie się nie zmienia, jesteś na kursie kolizyjnym. jeśli zmienia się, Oblicz zmianę i obróć pocisk o proporcjonalną szybkość kątową... możesz użyć dowolnych wskaźników, które reprezentują pozycję pocisku i celu.

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

W 3-d problem jest identyczny, z wyjątkiem "zmiany szybkości losowania", (i wynikowy wskaźnik skrętu pocisku) jest sam wektor, tzn. ma nie tylko wielkość, ale kierunek (czy obrócić pocisk w lewo, prawo lub w górę lub w dół lub 30 stopni powyżej poziomego w prawo, itp.??... Wyobraź sobie, jako pilot rakiety, gdzie można "ustawić skrzydła" zastosować windę...

Radar kierowany pociski, które "znają" szybkość zamykania. Regulacja stałej proporcjonalności w oparciu o zamknięcie (im wyższe zamknięcie, tym szybciej pocisk próbuje się obrócić), tak aby pocisk obracał się bardziej agresywnie w scenariuszach wysokiego zamknięcia (gdy czas lotu jest niższy) i mniej agresywnie w niskim zamknięciu (pościgi ogonowe), gdy potrzebuje oszczędzać energię. Inne pociski (jak Sidewindery), które nie znają zamknięcia, używają stałej z góry ustalonej wartości proporcjonalności). Fwiw, Vietnam era AIM-9 sidewinders używał stałej proporcjonalności 4.

 21
Author: Charles Bretana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-17 16:30:51

Używałem już wcześniej tego artykułu CodeProject-ma kilka naprawdę ładnych animacji, które wyjaśniają matematykę.

"Matematyka celowania i symulowania pocisku: od rachunku do wzoru kwarcowego": http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx

(również, ukryte w komentarzach na dole artykułu jest odniesienie do jakiegoś kodu C++, który wykonuje to samo zadanie z Unreal wiki)

 16
Author: ine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-30 05:15:10

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

 5
Author: AShelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 19:12:35

Czy rozważałeś negatywne opinie na temat niedawnej zmiany położenia w stosunku do zmiany czasu?

szczegóły pozostawione jako ćwiczenie.

Sugestie są całkowicie poważne: jeśli cel nie manewruje, powinno to uzyskać prawie optymalne przechwycenie. I powinno się zbiegać, nawet jeśli cel aktywnie unika.

Potrzebujesz więcej szczegółów? Rozwiązywanie w dwuwymiarowej przestrzeni dla ułatwienia zapisu. Przyjmij \vec{m} jako lokalizację pocisku i Wektor \vec{t} Być lokalizacją celu. Kurs bieżący w kierunku ruchu w stosunku do ostatniej jednostki czasu: \vec{h} = \bar{\vec{m}_i - \vec{m}_i-1}}. Niech r będzie normalnym wektorem między pociskiem a celem: \vec{r} = \bar{\vec{t} - \vec{m}}. Łożysko jest b = \vec{r} \dot \vec{h} Oblicz łożysko za każdym razem, gdy kleszcz i jego zmiana, i zmień kierunek, aby zminimalizować tę ilość.

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

 1
Author: dmckee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 20:19:18

Będziesz chciał interpolować trajektorię zarówno celu, jak i pocisku jako funkcję czasu. Następnie poszukaj czasów, w których współrzędne obiektów mieszczą się w pewnym dopuszczalnym błędzie.

 0
Author: Babak Naffas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 19:09:31