Sterowanie AI dla statku z modelem fizyki

19

Szukam pomysłów, jak wdrożyć śledzenie w przestrzeni 2D. Niestety nie wiem jeszcze dużo o AI / wyszukiwaniu ścieżek / autonomicznej kontroli.

Powiedzmy, że ten statek może się swobodnie poruszać, ale ma masę i pęd. Mogą na to również wpływać siły zewnętrzne (wybuchy itp.). Gracz może w dowolnym momencie ustawić cel dla statku, który powinien dotrzeć do tego miejsca i się zatrzymać.

Bez fizyki byłoby to proste, wystarczy wskazać kierunek i iść. Ale jak poradzić sobie z istniejącym rozmachem, a następnie zatrzymać się na miejscu? Nie chcę bezpośrednio modyfikować umiejscowienia statku.

edytuj: Żeby było jasne, matematyka związana z fizyką samego statku nie stanowi problemu.

Petteri Hietavirta
źródło
Oczekuję, że wkrótce napotkam podobny problem; Czekam na odpowiedzi na to pytanie.
Bill

Odpowiedzi:

15

Zobacz zachowania kierownicze . Szczególnie poszukiwanie i przybycie może być interesujące dla twoich potrzeb. Zachowania te będą również działać, gdy niektóre inne wpływy, takie jak eksplozja, tymczasowo zmieniają pozycję statku.

grzmot
źródło
+1. W przypadku kosmicznej gry 2D zaleciłbym użycie zachowań sterujących jako ramy i jednej z moich odpowiedzi jako elementu tego szkieletu.
tenpn
Chciałem zasugerować to samo, kiedy czytam pytanie. Stosowałem wiele sposobów sterowania, jest to łatwe i pozwala na całkiem niezłą sztuczną inteligencję / ruch.
dotminic
5

Nie jest łatwo rozwiązać problem dokładnie. Masz dwie możliwości, chociaż specyfika każdego rozwiązania jest różna:

Rozwiązanie matematyczne. Jeśli twój system fizyki jest wystarczająco prosty, możesz utworzyć zamkniętą formę dla swojego ruchu i obliczyć, kiedy musisz zacząć przyłożyć siłę hamowania, aby zatrzymać się w pewnym momencie. Jeśli twoja siła hamowania jest stała i nie masz oporu powietrza, powinno to rozkładać się do kwadratu.

Cesarskie rozwiązanie. Możesz użyć ręcznie dostrojonego kontrolera PID lub faktycznie rejestrować drogi hamowania dla swojego statku w systemie fizyki: na stanowisku testowym zahamuj statek od maksymalnej prędkości do zatrzymania, rejestrując przebytą odległość i prędkość co najmniejszą przerwę czasową. Przechowuj wynikowy wykres odległości / prędkości w katalogu danych.

W czasie wykonywania zrekonstruuj wykres i podłącz aktualną prędkość i prędkość docelową, aby pokonać dystans. W tej odległości od punktu docelowego musisz być w pełni zahamowany.

Zaletą tego podejścia jest to, że można go używać do hamowania dokładnie przy dowolnej prędkości. Wadą jest to, że jeśli twoje hamulce muszą się włączać lub wyłączać, nigdy nie będziesz dokładnie na zakręcie.

tenpn
źródło
1

Jak powiedziano wcześniej, ta sytuacja jest idealna do sterowania zachowaniami, ale chciałbym ją nieco rozszerzyć. Zachowanie Przyjazd byłoby idealne dla tego scenariusza. Możesz także wziąć pod uwagę przeszkody. Tutaj możesz również skorzystać z zachowania unikania przeszkód.

Niestety, http://www.red3d.com/cwr/steer/ nie zapewnia kodu źródłowego dla tych zachowań. Jednak programowanie sztucznej inteligencji gry według przykładów wyjaśnia i wyjaśnia zachowania w łatwych do zrozumienia fragmentach. Jeśli nie możesz dostać książki, zawsze możesz pobrać kod źródłowy tutaj: http://www.wordware.com/files/ai/

Ponadto, jeśli chcesz rozszerzyć swój ruch o wyszukiwanie ścieżek, możesz mieć klasę pathfinder, która oblicza ścieżkę (być może jako zbiór wektorów 2D) i użyć zachowania kierowania Ścieżka śledzenia, aby dodać to również do miksu.

Kod źródłowy, z którym się powiązałem, udostępnia również trzy różne metody łączenia tych zachowań sterujących razem.

Mam nadzieję, że to pomaga.

Ray Dey
źródło
Link red3d.com nie zapewnia źródeł bezpośrednio , ale na tej stronie znajduje się link do OpenSteer ( opensteer.sourceforge.net ), który jest implementacją zachowań sterujących typu open source.
bummzack
Ahh, nie wiedziałam tego, dzięki. Chociaż spojrzałem na źródło OpenSteer i łatwiej mi było przyjrzeć się bardziej oczywistemu kodowi twarzy w książce Bucklanda. Zwłaszcza na początku.
Ray Dey,
1

Kierowanie w kierunku pozycji nie jest zbyt trudne, ale osobiście zmagałem się przez chwilę z problemem kierowania w kierunku pozycji i osiągania jej z określoną prędkością lub podążania ścieżką z ograniczeniami prędkości.

Rozwiązałem problem za pomocą krzywej Hermite . Ustaw p0 i m0 na pozycję i prędkości statku, p1 i m1 na pozycję docelową i prędkości. Zakłada się, że chcesz, aby statek podążał sekundę za celem. Oblicz drugą pochodną p (0), która da ci przyspieszenie do zastosowania na twoim statku.

Oto kod drugiej pochodnej (w F #, mam nadzieję, że możesz dostosować ją do swojego wybranego języka; sq () oblicza kwadrat, pojedyncze cudzysłowy nie są interpretowane jako cudzysłowy, ale jako znaki, są one częścią identyfikatora):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

Pamiętaj, że jeśli na twój statek działają siły zewnętrzne (np. Grawitacja z planet), będziesz musiał wziąć to pod uwagę przy obliczaniu ciągu z przyspieszenia.

Joh
źródło
-3

Myślę, że twój statek powinien mieć parametry takie jak: pozycja i prędkość.

Prędkość jest sumą wszystkich sił (takich jak grawitacja, eksplozje, dane wejściowe użytkownika itp.) W każdej ramce, a także może mieć pewien rodzaj wilgoci.

Pozycja jest obliczana na podstawie ostatniej pozycji plus prędkość * time_step.

Jednak z tym może być trudno wdrożyć zatrzymanie na celu.

zacharmarz
źródło
3
-1 Wygląda na to, że Petteri Hietavirta wie, jak korzystać z podstawowego systemu fizyki. Więc twoja odpowiedź na to pytanie jest taka, że ​​zatrzymanie się na celu jest zbyt trudne?
AttackingHobo