Pracuję nad grą w stylu Worms i chcę proceduralnie wygenerować teren. Wcześniej generowałem dużo terenu, używając perlinowego hałasu, i tego właśnie zacząłem używać w tej grze. Jedyny problem polega na tym, że jest zbyt prosty i nudny, dając mi trochę wzgórz, ale nie złożoność, której chcę. Chciałbym mieć takie funkcje jak jaskinie i wiszące góry i nie mam nic przeciwko pływającym wyspom i tym podobne. Coś takiego, ale nawet bardziej szalone byłoby w porządku:
Myślałem najpierw o wygenerowaniu terenu przy użyciu klasycznego hałasu perlin, a następnie po prostu usunięciu części w celu stworzenia jaskiń, a co nie, ale mam problem z prowadzeniem usuwania tych części. Czy są jakieś alternatywy dla wygenerowania takiego terenu?
Odpowiedzi:
Proponuję zacząć od szumu Perlina 2D. Coś takiego:
Następnie zastosuj próg na obrazie, aby uzyskać kilka izolowanych wysp, jak pokazano tutaj:
Wybrałem próg 0,04, wszystko powyżej progu miałoby kolor niebieski. Reszta pozostaje czarna. Potem nadszedł czas, aby ustalić, które „wyspy” zachować, a które wyrzucić.
Możliwym podejściem byłoby przejechanie obrazu od lewej do prawej na różnych wysokościach i wybranie przecinających się „wysp” z pewnym prawdopodobieństwem. Na przykładowym zdjęciu najniższa linia ma prawdopodobieństwo 100%, więc każda wyspa, którą przekroczy, zostanie wybrana (wypełniona na biało). Druga linia ma prawdopodobieństwo 50%, a najwyższa linia ma prawdopodobieństwo 10%.
Gdy już zaznaczysz swoje wyspy, możesz wypełnić luki pomiędzy nimi, stosując operację morfologiczną ( rozszerzenie )
I jest możliwy krajobraz.
„Ziarnistość” hałasu określa, jak małe będą szczegóły w twoim świecie. Prawdopodobnie najlepiej jest eksperymentować z tymi wartościami.
Również gdzie i przy jakich prawdopodobieństwach zostaną ustawione „linie wyboru”, wynik będzie zupełnie inny. Jeśli masz linię u góry obrazu z dużym prawdopodobieństwem „wybrania” wyspy, możesz zbudować krajobraz jaskiniowy itp.
źródło
24
dlabaseX
ibaseY
, 1 oktawa i ja wybrałem, aby generować szum w skali szarości i wyłączyć „fraktal”. W jakim języku to wdrażasz?Zacznę od perlinkowego hałasu, starannie przefiltrowanego. Skończysz na czymś takim, jak na zdjęciu dołączonym do pytania, na pływających wyspach. Po prostu usuń pływające wyspy za pomocą algorytmu liczenia, takiego jak te omówione tutaj
źródło
Właściwie to zaimplementowałem, zaczynając od bummzack doskonałej odpowiedzi.
Oto kroki, na których skończyłem:
A to jest przykład wyniku:
Napisałem tutaj szczegółowy artykuł o całym procesie , a kod (JavaScript) jest open source, sprawdź, czy chcesz czegoś gotowego do użycia;)
źródło