Proceduralne generowanie rzeki lub drogi w nieskończonym terenie

28

Powinienem powiedzieć ścieżki, a nie drogi, ponieważ myślę bardziej średniowiecznie. Nie szukam też realizmu. Odpowiedź, której szukam, będzie pasować do formy, którą opisuję, a nie realizm.

Szukam metody generowania proceduralnych dróg / rzek w kręty sposób, ale chcę to zrobić dla systemu nieskończonego typu terenu. Podobnie jak szum perlin generuje plamy, chcę wygenerować odcinki linii o losowej długości (być może nieskończonej długości).

Znam strategie takie jak sugerowana odpowiedź tutaj znaleziona , jednak zależy ona od określonego punktu początkowego i końcowego do pracy, nie mam określonego punktu początkowego i końcowego. Chciałbym móc po prostu wywołać funkcję przy użyciu dowolnych współrzędnych i zwrócić jej, czy określone współrzędne są częścią rzeki / drogi.

Nie chcę wymagać wcześniejszego wygenerowania terenu. Obejmuje mapę wysokości (np. Używaną do symulacji opadów deszczu lub podobną). Nie chciałbym również wymagać punktu początkowego / końcowego.

Czy istnieje taki algorytm lub ulepszenie algorytmu szumu, o którym ktoś może wiedzieć, aby osiągnąć to, co próbuję wyjaśnić?

Jak dotąd do tej pory doszedłem do wielu fraktali, jeśli właściwie używam nazwy. Przyjmuję tylko bezwzględną wartość szumu wartości (zakładając, że jest skalowana do -1 do +1) i ustalam próg. Moim głównym problemem jest to, że linie nakładają się zbyt często, są w większości okrągłe, czasami zbiegają się, tworząc duże jeziora, które są schludne, ale niepożądane, a często grubość linii jest zbyt duża.

Oto zdjęcie tego, co mam do tej pory w 2D, ale z bardzo wysoką częstotliwością, aby pokazać więcej szczegółów:

wprowadź opis zdjęcia tutaj

Mitów
źródło
ponieważ rzeki „płyną”, określenie rzek może być łatwe po prostu za pomocą szumu w celu ustalenia punktu początkowego, a następnie wystarczy użyć surowych danych mapy wysokości do ustalenia ścieżki.
Wojna
drogi mogą być nieco trudniejsze, rozważałem budowanie dróg na podstawie użytkowania, jeśli gracz / wszyscy gracze regularnie przechodzili przez jakiś teren, stałoby się to ścieżką.
Wojna
1
@ user19142 OK, to nie duplikat. Możesz również znaleźć zastosowanie w tym pytaniu / odpowiedzi: gamedev.stackexchange.com/questions/53400/... A ja dołączę poprzednie linki jako „powiązane” gamedev.stackexchange.com/questions/45403/… gamedev. stackexchange.com/questions/29044/... gamedev.stackexchange.com/questions/31263/...
Michaelhouse
4
Myślę, że drogi nie będą zbyt wiarygodne, jeśli zostaną wygenerowane hałasem. Drogi są tworzone przez inteligencję zamiast przez fizykę i czas. Choć czasami mogą do siebie przypominać, są na tyle różne, że prawdopodobnie nie można użyć tego samego algorytmu dla obu.
MichaelHouse
1
Drogi w tym projekcie były liniami konturowymi o określonych wysokościach, aby można je było generować lokalnie. Działało tam, ale mapy wysokości nie były generowane z hałasem Perlina.
amitp

Odpowiedzi:

11

Tylko mój pomysł, aby zarchiwizować to, czego chcesz, bez (dużego) wstępnego obliczenia i możliwości stworzenia nieskończonego świata.

Pierwszą cząstką algorytmu jest użycie Voronoi-Diagramms . Dzielisz swój świat na siatki, każda siatka ma adres w formie (xgrid, ygrid). Dla każdej komórki, w której należy utworzyć drogi, wstawiasz zmienne xgrid i ygrid do funkcji skrótu, która zwraca liczbę CellSeed . Używasz CellSeed jako zarodka generatora liczb losowych, który generuje współrzędne punktów dla diagramu Voronoi.

Teraz musisz przeszukać krawędzie diagramu i węzły, w których zderza się wiele krawędzi. Możesz także przechowywać informacje na wykresie, aby uzyskać łatwiejszy dostęp.

Po tym kroku możesz przeszukać prawidłowe ścieżki w sieci.

W przypadku prawidłowych ścieżek możesz teraz tworzyć drogi (mają one ostre krawędzie).

Uwaga : Musisz również wygenerować współrzędne diagramu Voronio dla wszystkich komórek sąsiednich, aby nie mieć granic na krawędziach komórki.

Jeśli nie chcesz ostrych krawędzi, możesz obliczyć środkowy punkt każdego połączenia i użyć kierunku jako stycznej do interpolacji Béziera między dwiema krawędziami na wykresie.

O użyciu Voronoi-Diagramms

Aby zarchiwizować struktury dróg przypominające miasto, punkty z pseudolosowej funkcji można wyrównać na siatce, tak aby drogi były w kształcie prostokąta.

W przypadku dróg bardziej hrabstwowych punkty muszą być bardziej nieuporządkowane.

diagramm z wikipedia

Informacje o funkcji pseudolosowej do generowania pozycji punktów dla diagramów Voronoi

Może to być zwykła funkcja losowa lub zestaw Hammersley dla bardziej jednolitego, niezlepionego rozkładu punktów.

Quonux
źródło
Czy masz jakieś przykłady funkcji skrótu? Mam ten sam cel (nieskończony świat, który używa voronoi do budowy dróg), ale wydaje mi się, że nie mam pojęcia, jak to zrobić. Każda biblioteka voronoi, jaką mogę znaleźć, oczekuje współrzędnych obwiedni, która natychmiast pokonuje cel.
BotskoNet,
Nie, funkcja skrótu służy tylko do przypisania nasion nasion do komórki. Może być czymś tak trywialnym jak x * prime1 + y * prime2 + z * prime3. Tam gdzie liczby pierwsze są nierównomierne i idealnie duże, należy obliczyć tutaj z 64-bitowymi liczbami całkowitymi / bez znaku. Nie jest to problemem, jeśli biblioteka lib używa obwiedni, ponieważ dla każdej komórki wystarczy zgromadzić wszystkie punkty w komórce plus wszystkie punkty komórek sąsiednich (które są 8 komórkami sąsiedzkimi).
Quonux
Prawdopodobnie napotkasz problemy z precyzją z pojedynczą precyzją, jeśli lib używa pojedynczej precyzji lub jeśli używasz pojedynczej precyzji. Aby ominąć problem, jeśli biblioteka lib używa tylko pojedynczej precyzji, a nie zrobisz tego w następujący sposób: Przed konwersją pozycji na pojedynczą precyzję odejmij od nich globalną pozycję komórki środkowej, a następnie umieść ją jako liczbę zmiennoprzecinkową w lib, a następnie przekształć wyniki z powrotem.
Quonux
Właściwie nigdy nie wdrożyłem tego algorytmu, ale funkcja skrótu może być naprawdę trywialna.
Quonux
8

Do tworzenia dróg (i miast) najlepszy papier, jaki znalazłem, to:

Modelowanie proceduralne miast przez Y Parish i P. Müllera

Wykorzystuje L-System i może generować wzorce drogowe w USA i UE. Jeśli nie chcesz generować dróg dla całego miasta, możesz po prostu wygenerować główne drogi. Na wejściu może wziąć mapę wysokości, mapę wody i mapę gęstości populacji.

Rak
źródło
+1 tylko dlatego, że podobał mi się papier. Naprawdę nie pasowało do tego, jak chcę próbować generować drogi / ścieżki / rzeki, podczas gdy dynamicznie generuję teren.
Mityka
6

http://vterrain.org/Culture/Roads/ sekcja „Generowanie dróg 3D” zawiera pewne informacje na temat generowania dróg .

Problem z drogami polega na tym, że łączą one punkty orientacyjne (chociaż często podążają po terenie zamiast jechać prosto z A do B).

Osobiście wygenerowałbym teren, następnie umieściłem rzeki (być może za pomocą erozji, patrz http://vterrain.org/Water/ sekcja „hydrogeologia”), a następnie umieściłem miasta w miejscach, w których ma to sens (np. W pobliżu rzeki lub innego źródło wody lub w miejscu, w którym woda może być transportowana do akweduktów lub wież ciśnień i rur) i ostatecznie generuje drogi między miastami.

Aby uczynić to łatwiejszym w użyciu w świecie proceduralnym, możesz utworzyć punkty pośrednie na terenie, do których najprawdopodobniej pójdą drogi, gdy zostaną wygenerowane w tym miejscu, a następnie połączyć punkty pośrednie, jeśli droga jest rzeczywiście utworzona w tym miejscu.

Exilyth
źródło
4

Po pierwsze, rzeki i drogi są bardzo różne. Drogi mają tendencję do podążania za izoliniami (ta sama / podobna wysokość) - ponieważ podróżowanie po drogach, które nie wznoszą się ani nie spadają, jest znacznie łatwiejsze. Z drugiej strony rzeki płyną prostopadle do izolinii / izoklin (z góry). Rzeki tworzą się w dorzeczach (zbiorach gór, które wszystkie spływają w dół do danej doliny) i mają tendencję do tworzenia struktur przypominających drzewa. Ponadto drogi często biegną prostopadle do rzek, aby tworzyć logiczne mosty. Najlepiej jest najpierw wygenerować rzeki, a następnie stworzyć logiczne drogi (tj. Drogi między miastami). Niestety nie mam czasu na bardziej szczegółowe opisy, ale mam nadzieję, że dzięki temu znajdziesz się na właściwej drodze.

To może wydawać się oczywiste, ale spójrz na mapy Google na różne rodzaje terenu i dróg; zrozumiesz, jak powinny wyglądać.

Gavan Woolery
źródło
1
Ponownie zmodyfikowałem pytanie, aby lepiej zrozumieć, że realizm nie interesuje mnie tak blisko, jak jestem w sposobie działania algorytmu. Mimo to doceniam odpowiedź, choć głównie w odniesieniu do niektórych użytych terminów. Spróbuj pomyśleć o moim pragnieniu bardziej jak o nieskończonych przypadkowych długościach, które można wygenerować przy minimalnych potrzebnych danych (takich jak mapa wysokości).
Mythics