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:
źródło
Odpowiedzi:
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”.
Są to libnoise „Perlin Worms” z samouczka libnoise. Technika ściśle odtwarza jaskinie wygenerowane w Minecraft.
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.
źródło
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).
źródło
Wydanie Game Developer Magazine z kwietnia 2011 r. Szczegółowo omawia tę kwestię z iteracyjnymi funkcjami szumu Perlina - patrz artykuł Creator of Worlds na stronie 21.
źródło
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.
źródło
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.
źródło