AI do poruszania statkami kosmicznymi o niestandardowych kształtach (kształt wpływający na zachowanie ruchowe)

15

Projektuję sieciową turową strategię walki floty kosmicznej 3D-6DOF, która w dużej mierze opiera się na dostosowaniu statku. Pozwól, że wyjaśnię trochę grę, ponieważ musisz dowiedzieć się o niej trochę, aby postawić pytanie.

Moim celem jest możliwość stworzenia własnej floty statków o niestandardowych kształtach i dołączonych modułach (śmigła, belki ciągnika ...), które miałyby zalety i wady każdego statku, dzięki czemu masz wiele różnych rozkładów floty. Np. Długi statek z dwoma śmigłami z boku pozwoliłby mu swobodnie obracać się wokół tego samolotu, większe statki poruszałyby się powoli, chyba że umieścisz dużo śmigieł z tyłu (w związku z tym zużywając więcej punktów konstrukcyjnych i energii podczas ruchu, i to będzie poruszaj się tylko szybko w tym kierunku.) Planuję zrównoważyć całą grę wokół tej funkcji.

Gra toczy się wokół dwóch faz: rozkazów i fazy walki. Podczas fazy rozkazów dowodzisz różnymi statkami. Kiedy wszyscy gracze zakończą fazę rozkazu, rozpoczyna się faza walki, a rozkazy statków są rozpatrywane w czasie rzeczywistym przez pewien czas, a następnie akcja zostaje wstrzymana i rozpoczyna się nowa faza rozkazów.

Problem pojawia się, gdy myślę o wkładzie gracza. Aby przenieść statek, musisz włączyć lub wyłączyć różne śmigła, jeśli chcesz sterować, jechać do przodu, hamować, obracać się w miejscu ... Śmigła te nie muszą pracować z pełną mocą, abyś mógł uzyskać większy ruch kombinacje z mniejszą liczbą śmigieł.

Myślę, że to podejście jest trochę nudne. Gracz nie chce majstrować przy silnikach lub czymkolwiek, po prostu chcesz PRZESUWAĆ i ZABIĆ. Zamierzam graczowi wydawać rozkazy tym statkom według celu i obrotu , a wtedy AI obliczy prawidłową moc śmigła, aby osiągnąć ten ruch i obrót. Napęd nie musi być taki sam podczas całego obliczania tury (po wydaniu rozkazu), więc byłoby fajnie, gdyby statki reagowały podczas ruchu, dynamicznie dostosowując moc śmigieł do ich potrzeb, ale może być zbyt trudne do wdrożenia i nie jest tak naprawdę potrzebne do działania gry.

W obu przypadkach, w jaki sposób AI zdecyduje, które śmigła aktywować, aby uzyskać najlepszą (lub przynajmniej nie najgorszą) trajektorię do osiągnięcia?

Myślałem o niektórych podejściach:

  • Uczenie się sztucznej inteligencji: typy statków będą uczyć się o swoim ruchu metodą prób i błędów, dostosowując swoje zachowanie do większej liczby zastosowań, a na koniec stając się „inteligentnymi”. Nie chcę się angażować TAK daleko w kodowanie AI i myślę, że może to być frustrujące dla gracza (nawet jeśli możesz pozwolić mu uczyć się bez grania).
  • Wstępnie obliczony ruch czasowy: Po stworzeniu statku WSZYSTKIE możliwe ruchy są obliczane dla każdej konfiguracji śmigła i mocy dla danego czasu delta. Pamięć intensywna, brzydka, zła.
  • Wstępnie obliczone trajektorie: To samo co powyżej, ale nie dla każdego czasu delta, ale dla całej trajektorii, która byłaby wówczas dopasowana w jak największym stopniu. Wymaga stałej konfiguracji śmigła dla całej fazy walki i nadal wymaga dużej ilości pamięci, jest brzydki i zły.
  • Ciągłe brutalne wymuszanie: AI nieustannie sprawdza WSZYSTKIE możliwe konfiguracje śmigła podczas całej fazy walki, wstępnie oblicza kilka kroków czasowych i decyduje, który z nich jest najlepszy. Przeciw: to, co jest teraz dobre, może już nie być tak dobre później, i jest zbyt intensywne pod względem procesora, brzydkie i złe.
  • Wymuszenie pojedynczego brutalnego: Tak samo jak powyżej, ale brutalne wymuszenie tylko na początku symulacji, więc wymaga stałej konfiguracji śmigła przez całą fazę walki.
  • Ciągła kontrola kąta: nie jest to metoda pełnego ruchu, ale może sposób na odrzucenie „głupich” konfiguracji śmigieł. Biorąc pod uwagę normalny wektor obecnego śmigła i ostatni, możesz oszacować moc potrzebną do śmigła na podstawie kąta. Musisz to robić w sposób ciągły przez całą fazę walki. Ostatnio to wymyśliłem, więc nie zastanawiałem się zbyt długo. A priori ma też wadę „to, co jest dobre, może nie być tak dobre później” i nie przejmuje się innymi śmigłami, które mogą działać razem, tworząc lepszą konfigurację napędu.

Naprawdę utknąłem tutaj. Jakieś pomysły?

kaoD
źródło
Czy zastanawiałeś się nad zachowaniami kierującymi?
stonemetal
1
@stonemetal na pewno. Problem polega na tym, że zachowania sterujące są zwykle modelowane przy założeniu pełnej kontroli położenia i obrotu obiektu oraz pewnych ograniczeń (a przynajmniej tego znalazłem w Internecie). AI tutaj nie ma pełnej kontroli nad bytem , ale tylko nad przedmiotami (śmigłami), które poruszają byt. Mam problem z połączeniem tych zachowań sterujących z faktycznym ruchem statku kosmicznego.
kaoD
z tego samego powodu zachowania kierowania nie działają zbyt dobrze w samochodach wyścigowych. Zachowania kierownicze są świetne, ale nie są uniwersalnym rozwiązaniem wszystkiego.
tenpn
@haoD Myślałem o czymś podobnym do tego, co odpowiedział duchonline. Pozwól im budować, co kiedykolwiek, a następnie przełóż to na ograniczenia związane z zachowaniem sterującym. Chociaż z twojej odpowiedzi brzmi to, że zachowania kierownicze prawdopodobnie nie są wystarczająco elastyczne, jak jest.
stonemetal
1
Wiem, że to jest bardzo stare, ale to, czego szukasz, nazywa się kinodynamicznym planowaniem ruchu
mklingen

Odpowiedzi:

4

Niestety nie mam wypróbowanego i przetestowanego rozwiązania, ale czy nie można tego rozwiązać matematycznie?

Biorąc pod uwagę dowolne śmigło i jego przesunięcie od środka masy, możesz obliczyć, w jakiej płaszczyźnie możesz się obracać.

Do dowolnego ruchu możesz użyć 1 lub więcej śmigieł. Każde śmigło może zostać zapytane, czy jego samolot może przyczynić się do orientacji celu, ile wysiłku wymagałoby wkładu śmigła (wkładki z dala od CoM mogą zużywać mniej energii, aby wygenerować większy obrót) i jak blisko tego się zbliżyłoby do docelowej lokalizacji. Następnie A * w tej przestrzeni wyszukiwania, dopóki nie znajdziesz rozwiązania o niskim koszcie, które może być najmniejszą całkowitą zużytą energią lub najszybszym ruchem.

Ponownie oceniaj to po zakończeniu tury i umiarkowanej mocy, gdy zbliżasz się do celu, być może z kontrolerem PID.

W przypadku ruchu do przodu proste rozwiązanie popchnie cię zawsze do przodu, zmniejszając prędkość docelową w miarę zbliżania się do celu. Ponieważ masz do dyspozycji przestrzeń 3D, możesz uniknąć skomplikowanych 3-punktowych procedur skrętu. Będziesz musiał uwzględnić moc wyjściową śmigieł wybranych dla prędkości liniowej w swoich obliczeniach dotyczących skrętu, jako pewien rodzaj stanu początkowego.

To bardzo z tyłu koperty, ale nie widzę żadnych poważnych wad. Po prostu dużo ciężkiej pracy i poprawiania liczb. :)

tenpn
źródło
To jest to, czego szukałem, matematyczne rozwiązanie ... dzięki! Mam nadzieję, że stanie się to tak proste, jak się wydaje.
kaoD
7

Ponieważ chcesz zrezygnować z odrobiny kontroli nad odtwarzaniem za pomocą sztucznej inteligencji, możesz również rozważyć uproszczenie efektu halsowania śmigieł i zmiany wymiarów statku na mniejsze, łatwiejsze do zarządzania parametry algorytmu komputerowego. Gracz nadal może dodawać śmigła do dowolnej części statku, ale po zakończeniu jest „kompresowany” do parametrów.

Każde śmigło wpływa na prędkość obrotu statku lub, w połączeniu z równolegle umieszczonym śmigłem, wpływa na szybkość ruchu w określonym wymiarze. Połącz te parametry dla każdego śmigła, a otrzymasz maksymalną prędkość i prędkość obrotu statku. Połącz te dwa parametry dla każdego śmigła i zestawu śmigieł, aby uzyskać maksymalny obrót i prędkość statku dla całego statku, dla wszystkich dostępnych wymiarów (góra, dół, lewo, prawo, przód, tył).

Korzystając z prędkości i prędkości skrętu dla każdego wymiaru, masz wystarczającą ilość informacji, aby faktycznie pozwolić statkowi przenieść się do miejsca docelowego. Gracz zobaczy efekt swojej konfiguracji śmigła, ale pod maską jego wkład jest znacznie uproszczony. Możesz wymyślić więcej niż jedną strategię lotu w oparciu o odległość, którą statek musi pokonać, aby lot wyglądał bardziej naturalnie i zwiększyć poczucie gracza, że ​​on lub ona sprawuje kontrolę nad ruchem statku. Ale w końcu, jak powiedziałeś, nie będzie miało znaczenia, w jaki sposób statek dotrze do celu i czy jego trasa jest optymalna, po prostu musi tam być, a konfiguracja śmigła ma wpływ na czas jego przybycia.

W przypadku wymiarów statku można je uwzględnić po uzyskaniu wartości prędkości skompresowanej w celu uzyskania zgrubnego efektu lub użyć ich podczas obliczania w celu uzyskania bardziej precyzyjnego efektu. Prawdopodobnie zechcesz sprawdzić, czy dokładna metoda jest warta wysiłku, ponieważ różnica może nie wpływać na poczucie kontroli gracza.

duch
źródło
Nie do końca to, czego szukałem, ale może załatwić sprawę, jeśli naprawdę będę musiał. Głosuj za pomysłem :)
kaoD
0

W przestrzeni kształt nie wpływa na ruch. Brak powietrza do przeciągnięcia.

Liczy się masa statku i dodatków. Jest to prostszy problem grawitacji ciągu. Możesz więc wykonać te obliczenia lub ponieważ jest to gra turowa, opracuj system ruchu, taki jak RPG, takie jak Traveler.

gnoll110
źródło
Witamy w GD.SE! To pytanie ma już zaakceptowaną odpowiedź i zostało zadane 2 lata temu - być może mógłbyś odpowiedzieć na niektóre z nowszych pytań na stronie.
Polar
Tak, wszystko prawda, ale zawsze zakładam, że inni natkną się na to później (tak jak to zrobiłem) i okażą się przydatne. hehe, nie przyszedłem tutaj, aby odpowiedzieć na pytania… jak większość, szukając rozwiązań własnych problemów.
gnoll110
@ Plakat z pytaniem polarnym tutaj. Uważam, że jego odpowiedź jest bardzo interesująca! Cieszę się, że wrócił, by odpowiedzieć, i myślę, że lata później wartość dodana jest jedną z najcenniejszych części SO.
kaoD
@ gnoll110 Mogę się tutaj mylić. Nie ma oporu, dobrze, ale kąt, jaki tworzy wektor ciągu ze środkiem masy, wpływa na to, jak statek się tłumaczy lub obraca ... prawda? Np .: silnik w linii prostej ze środkiem masy przesuwa się, a przesunięcie go poza środek masy doda do statku element obrotowy.
kaoD
@ okoD Przykro mi, jeśli wydawało się to nieco trudne - oczywiście dużo SO dodaje później wartości. Sugerowałem tylko, że może on również odpowiedzieć na nowsze pytania - im więcej pytań, tym lepiej!
Polar,