Moje pytanie brzmi: jakie byłoby najlepsze podejście do poszukiwania ścieżki na nierównej powierzchni planety?
Informacje podstawowe
Stworzyłem planetę z mapowania przemieszczeń 6 rzutowanych sfer. Płaszczyzny początkowo tworzyły sześcian, zanim zostały rzutowane na kształt kuli.
Zastanawiam się, czy można zastosować każdą „rzutowaną ścianę sześcianu” jako siatki i użyć prostego algorytmu A * w celu znalezienia najlepszej możliwej trasy. Chciałbym również wziąć pod uwagę wysokość przemieszczenia, aby ścieżka nie wspinała się góry itp. (Myślę, że to byłaby tylko heurystyka w ramach algorytmu A *). Inną sprawą jest to, że osiągnąłem ruch planetarny, wykorzystując silnik fizyki Unity3d, zastosuj grawitację w kierunku środka planety. Czy moje proponowane rozwiązanie wymagałoby niezależnej kontroli ruchu agentów w fizyce grawitacyjnej.
Aby lepiej sformułować moje pytanie, oto moje obecne ciało planetarne:
Odpowiedzi:
Wygląda na to, że już odpowiedziałeś na swoje pytanie. * Jest prawdopodobnie najlepszym podejściem. Tak, oczywiście, można go używać w opisany sposób, w tym używając informacji o wysokości, aby uniknąć gór. Tak długo, jak jesteś w stanie uzyskać dostęp do informacji o dowolnej siatce na powierzchni twojego świata, nie ma powodu, dla którego nie możesz użyć jej w heurystyce A *.
Wreszcie, mylisz wyszukiwanie ścieżek z podążaniem ścieżką na końcu pytania. Szukanie ścieżki nie ma znaczenia dla grawitacji, chyba że dodasz ją jako heurystyczną, a ponieważ jesteś na powierzchni planety, grawitacja będzie zasadniczo taka sama na całej powierzchni. Wiele gier ma grawitację i ruch, nie widzę powodu, dla którego nie możesz.
Zasadniczo chcemy, aby mapa zmieniła kolor z czerwonego na niebieski, aby była taka sama na kuli, jak na sześcianie.
Ponieważ A * często zbliża się do swojego obecnego węzła, możesz łatwo stworzyć zestaw funkcji do uzyskiwania sąsiednich węzłów. Na przykład
getXPlus()
,getXMinus()
,getZPlus()
i tak dalej. Funkcje te zajmą bieżący węzeł i zwrócą węzeł w kierunku określonym przez nazwę funkcji.Przez większość czasu funkcje te mogą po prostu zwiększać wartość i być wykonywane na krawędziach, które się zmienią.
Będziesz chciał zmapować powierzchnię sześcianu na układ współrzędnych 2D. Jakkolwiek to zrobisz, zależy od ciebie, nie muszą one ustawiać się w linii, po prostu nadaj każdej przestrzeni siatki unikalną współrzędną X, Y.
Teraz, kiedy znajdujesz się na krawędzi i otrzymujesz sąsiednie pole siatki, niekoniecznie będzie to po prostu zwiększanie współrzędnych. Musimy dowiedzieć się, do której twarzy się poruszamy i przełączyć się na współrzędne tej twarzy.
Na przykład uzyskanie współrzędnej XPlus zmieni zarówno współrzędne X, jak i Y, ponieważ przenosimy się na nowe pole siatki na nowej powierzchni. Zielona linia reprezentuje krawędź między dwiema ścianami.
Teraz są to tylko globalne współrzędne, może być łatwiej użyć wewnętrznego lokalnego układu współrzędnych z trzecim wymiarem, który reprezentuje ścianę sześcianu, na której aktualnie się znajdujesz.
Tak czy inaczej, musisz mieć unikalną współrzędną dla każdego pola siatki na powierzchni sześcianu. Przemieszczanie się między nimi będzie zależeć od sposobu implementacji układu współrzędnych. Musisz wiedzieć, gdzie ta współrzędna jest odwzorowana również na powierzchni kuli.
Wszystko to powinno ostatecznie zostać wyabstrahowane, abyś nawet o tym nie wiedział.
źródło