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:
Odpowiedzi:
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.
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.
źródło
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.
źródło
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.
źródło
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ć.
źródło