Jak podążasz ścieżką AI w silniku fizyki 2d, takim jak farseer / box2d?

12

Pracuję nad przeniesieniem dwuwymiarowej, odgórnej gry, nad którą pracowałem, do odpowiedniego silnika fizyki sztywnego ciała, takiego jak Farseer. Do tej pory właśnie zhakowałem swój własny kod fizyki w razie potrzeby.

Próbuję nauczyć się tutaj właściwego sposobu robienia rzeczy.

Jaki jest właściwy sposób, aby twoja sztuczna inteligencja podążała ustaloną ścieżką, gdy zrobisz je sztywnymi ciałami w silniku fizyki?

Jeśli mam na mapie ścieżkę węzłów nawigacyjnych, które muszę śledzić przez AI, wcześniej po prostu ręcznie przesuwałem je wzdłuż ścieżki, obliczając kolejną pozycję, w której powinny się znajdować na następnym etapie, i ręcznie ustawiając je w tej pozycji .

Ale teraz są sztywnymi ciałami i podlegają zderzeniom oraz wszelkim siłom, które mogą je uderzyć i zrzucić z drogi.

Więc aby wykonać ruch AI, uważam, że powinienem teraz zastosować do nich impulsy / siły? Nie powinienem już ręcznie ustawiać ich pozycji dla każdej klatki.

Więc myślę, że muszę przejść od deterministycznego świata, w którym zmuszam SI do podążania ścieżką do niedeterministycznego świata, w którym mogą zostać powaleni w dowolnym kierunku, jeśli trafią, i po prostu popycham ich w kierunku następnego węzła na ścieżce aby je poruszyć.

Czy to prawda? Czy tak robią to inni ludzie?

Rodzi to kilka pytań na temat tego, jak uniknąć sytuacji, w której sztuczna inteligencja utknie w narożnikach scenerii, skoro nie idą precyzyjną ścieżką. Jak sobie radzicie z tego rodzaju rzeczami?

A może lepiej jest w jakiś sposób wymieszać te dwa elementy i nadal mieć swoją sztuczną inteligencję podążającą ustaloną ścieżką poprzez ręczne ustawienie ich pozycji i reagować tylko na inne siły w pewnych okolicznościach, które można łatwo kontrolować?

Dzięki za wszelkie porady chłopaki.

TerryB
źródło
1
+1 Jestem również bardzo zainteresowany poznaniem tego.
David Gouveia,

Odpowiedzi:

7

Zachowania związane z kierowaniem działają bardzo dobrze w połączeniu z silnikiem fizyki, ponieważ są zwykle realizowane w taki sposób, że zwracają „siłę kierowania”, którą można następnie przyłożyć na ciało fizyczne.

Aby jednostka podążała ścieżką, możesz użyć opcji Szukaj, aby przejść z węzła ścieżki do węzła ścieżki (pamiętaj, aby uniknąć przekroczenia), a następnie użyj opcji Przybycie do ostatniego węzła na ścieżce.

Co do twoich obaw związanych z utknięciem: Modelowanie ścieżki za pomocą sił powinno być dość dokładne. Masz rację, że obiekt może zostać zrzucony ze ścieżki, jeśli zderzy się z innym obiektem, ale ponieważ podczas każdej aktualizacji obliczysz siłę kierowania, obiekt powinien natychmiast wrócić na ścieżkę. Jeśli odchylenie od ścieżki po kolizji może być potencjalnie ogromne, sugeruję zapamiętanie ostatniej pozycji za każdym razem, gdy nastąpi kolizja, a następnie skierowanie obiektu z powrotem do tej ostatniej pozycji przed kontynuowaniem normalnej trasy.

grzmot
źródło
Niesamowity artykuł, dziękuję za udostępnienie. Uratowałem mój dzień.
Ricardo Sanchez-Saez,
0

Powiedziałbym, że jesteś na dobrej drodze, możesz zajrzeć do tego artykułu:

http://www.policyalmanac.org/games/aStarTutorial.htm

Wyjaśnia niektóre podstawowe sposoby unikania kolizji i wyszukiwania ścieżek za pomocą algorytmu A *.

Edytować:

Jeśli naprawdę potrzebujesz tylko najlepszego sposobu napędzania obiektów we właściwym kierunku, powinieneś użyć siły (powiedzmy, MovementForce lub coś takiego) skierowanej w kierunku najlepszej znalezionej ścieżki, używając algorytmu znajdowania ścieżki wybór

anonimowo
źródło
Nie sądzę, aby ten artykuł dotyczył tego pytania. OP nie pyta, jak znaleźć optymalną ścieżkę między dwiema lokalizacjami, ale raczej, jak sprawić, by aktor podążył ścieżką, którą już obliczył, w kontekście symulacji fizyki.
David Gouveia,
cóż, kiedy go ponownie przeczytam, rozumiem o co ci chodzi,
zedytuję
:) Zmieniłem także tytuł, żeby wszystko wyjaśnić. Zdecydowanie zainteresowany raczej podążaniem ścieżką niż jej szukaniem.
TerryB,
0

Sądząc po tym, co @davidluzgouveia skomentował anonimowy post, przedstawię mój projekt. Podążanie ścieżką i znajdowanie ścieżki są jednak bardzo różne. Odnajdywanie ścieżek to więcej niż to, o czym anonimowo pisał, a do szukania ścieżek zajrzałbym do algorytmu Dijkstry. Do podążania ścieżką używam całkowicie wybranego silnika fizyki. Skonfigurowałem to tak, że każda lokalizacja, do której chodzi klasa jednostek, jest ustawiana w swojej podklasie za pomocą przesunięć 2D, tak, są one 2D, a nie 3D, to ze względu na sposób, w jaki mam skonfigurowaną fizykę w mojej grze .

Objaśnienie 3D: Każda jednostka ma tylko jeden główny zderzak, który jest skonfigurowany wyłącznie do kolizji z obiektami terenu i świata. Ma kształt kapsułki i ma programowo promień i wysokość. Jest zbudowany na środku modelu i powinien rozciągać się tuż za przód i górę modelu. Ale mam również przesunięcie powierzchniowe dotyczące tego, jak daleko jest ona od podłoża przez cały czas, i pływak tego, ile wolno zsuwać się, zanim lekko podskakuje w górę. Wygląda na to, że stosuję jakąś zepsutą naprawę problemu kolizji terenu, ale mam swoje powody.

W każdym razie powinieneś przyłożyć siłę do tego obiektu kapsułki i powinien on cały czas unosić się nad ziemią. Nie oznacza to, że nie może pójść wyżej, tylko że nie może pójść niżej. Powodem, dla którego musi się unosić (w moim przypadku) jest to, że w sztywnym korpusie i silniku fizyki ragdoll nogi moich jednostek są animowane proceduralnie. Tak więc, przykładając prostą siłę do kapsułki, nogi mojej istoty same się przestawią. Będą również miały swoje oddzielne zastosowania grawitacyjne! Pozwala to na to, że jeśli moja postać jest pochylona, ​​jedna stopa może znajdować się na niższym poziomie niż druga.

Właśnie tak powinieneś to zrobić. Sądząc po tym, o co pytasz, to. Jeśli chcesz pominąć niektóre funkcje, jest to oczywiście w porządku, szczególnie jeśli jest to RTS lub FPS i nikt nigdy nie zobaczy jednostek ani opieki. Ale ogólnie rzecz biorąc, jednostka powinna mieć jeden GŁÓWNY obiekt zderzenia, który działa prawie wyłącznie z ruchem postaci.

W szczególności 2D: Nadal powinieneś mieć główny punkt lub po prostu jakiś punkt odniesienia, aby silnik mógł się poruszać, czyli ruch jednostki. Możesz nadać każdej jednostce podklasę ścieżki, która ma kilka lokalizacji, do których musi się udać, możesz ją określić w kodzie poziomu (np. Lokalizacja1 (x, y) lokalizacja2 (x, y) itp.) Najlepsza metoda (nie (wiesz, nad jaką grą pracujesz) prawdopodobnie będzie określać lokalizacje na poziomie i sprawić, że każda jednostka przetworzy je w kolejności określonej przez poziom, a po osiągnięciu każdej lokalizacji, zamień ją na pożądaną lokalizację na następny, do którego musi się dostać.

Istnieje wiele sposobów na zmodyfikowanie tego, na przykład posiadanie listy lokalizacji na pierwszym miejscu dla każdej jednostki, ponieważ oznaczałoby to, że nie wszystkie jednostki muszą iść w te same lokalizacje. Jednak w ten sam sposób możesz to zrobić również w kodzie poziomu (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) cokolwiek)

Kilka pomysłów! Sugeruję przeczytanie wersji 3D, mimo że jest ona znacznie mniej istotna.

EDYCJA: Postanowiłem dostarczyć tylko dla każdego, kto może to przeczytać (Tak, to prawda) .... (pierwotnie tylko przejrzałem twoje pytanie i nie zdawałem sobie sprawy, że było dość specyficzne dla 2D, dopóki go nie przeczytałem>.>)

Joshua Hedges
źródło