Jak generować jaskinie podobne do tych z Minecraft?

34

Od jakiegoś czasu pracuję nad 3D proceduralnym światem i chcę zacząć dodawać systemy jaskiń. Obecnie używam szumu Perlin 2D / 3D do generowania terenu w połączeniu z Marching Cubes dla gładszego terenu. Po prostu ogłuszają mnie długie, połączone ze sobą jaskinie.

Mam nadzieję, że dostanę coś więcej niż systemy jaskiniowe Minecraft. Wydaje się, że są bardzo połączone, odgałęziają się losowo w prawie dowolnym kierunku, a prawie każdy punkt w jaskini miałby dość okrągły wygląd z dość równym promieniem w całym (nie najlepsze sformułowanie, ale nie do końca pewny, jak inaczej to ująć) .

Największym wyzwaniem dla generowania jaskiń tak, jak chcę, jest to, że chcę generować świat w locie. Świat jest obecnie generowany kawałek po kawałku, zaczynając od miejsca, w którym znajduje się gracz i stamtąd generuje na zewnątrz. NIE chciałbym generować żadnego świata, a następnie wykopać jaskinie za pomocą wędrującego wzoru, automatów komórkowych itp.

Czy istnieją jakieś dobrze znane algorytmy, które można w tym celu zastosować? Jeśli tak, to czy ktoś chce się podzielić tym, jak robi coś podobnego? Byłbym bardzo wdzięczny za każdą pomoc.

Dobry przykład: wprowadź opis zdjęcia tutaj

Mitów
źródło
5
Spójrz tutaj i przewiń w dół.
William Mariager,
W ciągu ostatnich 24 miesięcy pojawiła się kwestia magazynu dla twórców gier, która szczegółowo dyskutuje na temat tego, co chcesz zrobić. Byłbym na ich stronie.
Joey Green,
@JoeyGreen Jak nazywa się magazyn? Czy masz link do ich strony?
jumpnett,
1
To się nazywa magazyn dla twórców gier. gdmag.com . Możesz uzyskać subskrypcję i uzyskać wersje pdf magazynu dla ostatnich 10 lat. Jeśli się zarejestrujesz, istnieje sposób na przeszukanie poprzednich problemów i znalezienie odpowiedniego problemu.
Joey Green,

Odpowiedzi:

30

Jaskinie Minecraft są generowane metodą „robaków perlin”. Generator wije się w terenie i wydostaje się z tunelu. Minecraft nie wykorzystuje hałasu perlin 3D do generowania jaskiń, ponieważ ma tendencję do pozostawiania niepowiązanych kieszeni w terenie. Jaskinie Minecraft nie zostały wygenerowane przez hałas 3d Perlin od bardzo wczesnych wersji Alpha.

Oto jaskinie w Gnomescroll wygenerowane metodą „robaka perlin”.

System Gnomescroll Cave Widok z pierwszej osoby 1

System jaskini Gnomescroll Widok z pierwszej osoby 2

System jaskini Gnomescroll Widok z trzeciej osoby 2

Są to libnoise „Perlin Worms” z samouczka libnoise. Technika ściśle odtwarza jaskinie wygenerowane w Minecraft.

Linoise Tutorial Perlin Worms

Parametry wężenia wpływają na jakość systemu jaskiń i określają, jak pionowe są jaskinie i jak szybko zmieniają kierunek. Jaskinie w gałęzi Minecraft i promień tunelu jaskiniowego są zróżnicowane w zależności od długości jaskiń.

Minecraft generuje jaskinie po kawałku po kawałku. Wymagane podejście jest skomplikowane i nikt nie opracował jeszcze całkowicie inżynierii wstecznej generatora jaskiń Minecraft, pomimo zainteresowania modderami serwerów.

Najbardziej prawdopodobne podejście generuje snaking jaskinie kawałek po kawałku, gdy nieskończona mapa jest generowana i rozszerza się na zewnątrz. Jaskinie na bieżącym fragmencie są funkcjami nasion jaskini na najbliższych N fragmentach dla niektórych N. Za pomocą generatora liczb losowych, który jest funkcją współrzędnych fragmentu, aby zaszczepić jaskinie, można obliczyć jaskinie na bieżącym fragmencie dla nieskończona mapa, oceniając tylko fragmenty w skończonym promieniu fragmentu.

HaltingState
źródło
3
Czy możesz dodać jakieś informacje lub zasoby, aby dowiedzieć się o tej rzeczy „robaki Perlin”?
David Gouveia,
1
To jest tutorial na temat „robaków Perlin
HaltingState
Nie jest to konieczne, ale jeśli mógłbyś rozwinąć ten ostatni akapit, byłbym bardzo wdzięczny. Aby wygenerować robaka, zakładam, że potrzebujesz punktu początkowego dla każdego robaka, który musiałby znajdować się w obrębie N fragmentów każdego gracza, w którym N jest maksymalną długością robaka.
Mythics
3
Dokładnie. Każdy robak ma punkt początkowy i zostaje zakończony, jeśli wędruje poza określonym promieniem porcji. Istnieje generator liczb losowych, który deterministycznie generuje pseudolosową sekwencję liczb, która jest funkcją współrzędnych fragmentu. Te losowe liczby określają, gdzie i ile robaków powstaje w tym węźle. Robaki mogą również rozgałęziać się. Obciążenie obliczeniowe zmniejsza się, jeśli robaki są bardziej „lokalne” i nie mogą zaryzykować więcej niż mały promień porcji.
HaltingState
Może nie do końca to, co chciałem usłyszeć, ale tego się spodziewałem. Jeszcze raz dziękuję HaltingState. :)
Mythics
7

Wygenerowałbym chmurę punktów w obszarach, w których teren jest solidny - możesz eksperymentować z różnymi gęstościami. Następnie użyłbym algorytmu, takiego jak minimalne drzewo opinające, aby połączyć wszystkie punkty - zapewni to, że każdy obszar będzie osiągalny. Następnie po prostu narysuj duże puste (złożone z powietrza) obszary od węzła do węzła (tj. Grubą linię wokseli).

Gavan Woolery
źródło
Może po prostu nie rozumiem dokładnie, co masz na myśli, ale jak miałbym to robić w locie, kawałek po kawałku, jak świat się generuje?
Mitów
Jednym z możliwych sposobów jest wygenerowanie minimalnego drzewa opinającego w obrębie każdego fragmentu osobno, a następnie połączenie każdego fragmentu przez znalezienie najbliższych dwóch węzłów między dwoma fragmentami. Po wypełnieniu fragmentu domyślnym algorytmem terenu można go wydrążyć wokół minimalnego drzewa rozpinającego.
Gavan Woolery,
1
innym (łatwiejszym) rozwiązaniem, choć mniej wydajnym i prawdopodobnie „bardziej hałaśliwym”, jest użycie ruchu Browna do wykreślenia ścieżki (coś w rodzaju mrówki kopiącej się losowo).
Gavan Woolery,
1

Użyj funkcji szumu, aby przypisać wartości do każdego fragmentu, aby ustalić, czy ma tunele, czy nie, a następnie użyj ich, aby zdecydować, gdzie umieścić jaskinie. Jeśli chcesz mieć tunele, po prostu użyj więcej funkcji szumu (z różnymi nasionami) i użyj ich wartości, aby ustalić, czy są tunele. Następnie użyj zwykłych funkcji „rysowania”, aby utworzyć tunele. Aby wszystko było bardziej realistyczne, użyj większego hałasu, aby wykonać losowe przemieszczenie punktów początkowych wspomnianych jaskiń / tuneli.

Jeśli nie chcesz używać wielu funkcji szumów, możesz sondować na większe odległości - na przykład, zamiast robić szum3d (2,2,2) dla fragmentu w (2,2,2) do szumu3d (2,2, 16) i użyj (2,2,16) dla jednej wartości, (2,2,17) dla drugiej wartości itp., A następnie po prostu dostrój częstotliwość odpowiednio, aby wszystkie wartości były niezależne lub skorelowane w krótkich skalach.

Aby zróżnicować gęstość jaskini na całym świecie, użyj innej funkcji o niższej częstotliwości, która wpłynie na te wartości.

W przypadku, gdy spowoduje to bałagan w jaskiniach, po prostu zwiększ odległość wspomnianych połączonych punktów lub w inny sposób dostrój algorytm.

Nie jestem pewien, czy Minecraft ma takie jaskinie (chociaż myślę, że tak), ale to rozwiązanie powinno dać satysfakcjonujące wyniki.

Llamageddon
źródło
-5

tutaj jest

Chociaż większość jaskiń, takich jak te powyżej, wykorzystuje robaka Perlin , niektórzy woleliby to zrobić ręcznie. W ten sposób mogą zrobić to dokładnie tak, jak chcą, dokładnie blok po bloku. Jaskinia wykonana przy użyciu robaka Perlin może być niedokładna i może sprawić, że jaskinia będzie miała wysokość 5 stóp i szerokość 6 stóp, może to być niedokładne, ponieważ możesz mieć wysokość 10 stóp i szerokość 15 stóp.

Locklan Smith
źródło