Jak wygenerować teren w stylu Worms?

48

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:

wprowadź opis zdjęcia tutaj

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?

Xeon06
źródło
Czy kolor czerwony oznacza jaskinie, czy to tylko część terenu?
Richard Marskell - Drackir,
To część terenu. Właśnie Google, ten obraz, był najbliżej tego, co chcę osiągnąć. Część „jaskiniowa” może być małą dziurą po prawej stronie, jeśli będzie kontynuowana w głębi terenu po jej lewej stronie.
Xeon06,
@Drackir, edytowałem obraz.
Xeon06,
Powiązane: gamedev.stackexchange.com/questions/6721/... (ale nie duplikat, ponieważ wydaje się koncentrować na implementacji w porównaniu z algorytmami generowania).
Josh
@JoshPetrie rzeczywiście. Jestem dobry w zniszczeniu. Z pokoleniem mam problem.
Xeon06,

Odpowiedzi:

51

Proponuję zacząć od szumu Perlina 2D. Coś takiego:

perlin-noise

Następnie zastosuj próg na obrazie, aby uzyskać kilka izolowanych wysp, jak pokazano tutaj:

hałas perlin z progiem

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 )

rozszerzone wyspy

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.

grzmot
źródło
Wielkie dzięki za świetną szczegółową i ilustrowaną odpowiedź! Właśnie to zrobię.
Xeon06,
Czy masz jakieś wskazówki na temat generowania takiego hałasu perlin, przy takim poziomie szczegółowości i tak dalej? Próbowałem cały wieczór i nigdzie się nie dostaję.
Xeon06
@ Xeon06 Właśnie korzystałem z funkcji szumu Perlina zapewnianej przez lampę błyskową . Parametry były 24dla baseXi baseY, 1 oktawa i ja wybrałem, aby generować szum w skali szarości i wyłączyć „fraktal”. W jakim języku to wdrażasz?
bummzack,
Implementuję JavaScript. Szukałem w Internecie dobrej implementacji, która dałaby podobne wyniki przez tydzień, ale nic nie mogę znaleźć.
Xeon06,
Zadałem inne pytanie dotyczące części hałas perlin gamedev.stackexchange.com/questions/20880/fast-noise-generation
Xeon06,
6

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

Ravachol
źródło
Och, chyba już to rozumiem. Muszę użyć szumu perlin 2D, a nie 1D. Czy mógłbyś rozwinąć wspomniane filtrowanie?
Xeon06,
2
Nie mogę teraz publikować zdjęć, ale mówię tylko o prostym filtrze progowym à-la if (0.3> pixelValue> 0.5) KeepIt () ;. „Ostrożnie” polega na tym, aby uzyskać prawidłowe 0.3 i 0.5. Możesz również mieć gradient liniowy (lub nie), zaczynając od wysokiej alfa na górze, stopniowo osiągając 0 na dole, więc masz miejsce na niebo, a ziemia jest w większości wypełniona. Mam nadzieję, że to pomaga.
Ravachol,
@Rachachol Jeśli opublikujesz link do zdjęcia, osoba z większą liczbą przedstawicieli może dodać go do Twojego postu.
Richard Marskell - Drackir,
„if (0.3> pixelValue> 0.5)”, myślę, że to tylko literówka, ale może być mylące mieć sprzeczne rzeczy w swoim poście ... Czy możesz to edytować?
jcora,
Nie mogę edytować komentarza. Przeczytaj „jeśli (0,3 <wartość piksela <0,5)”, oczywiście.
Ravachol,
4

Właściwie to zaimplementowałem, zaczynając od bummzack doskonałej odpowiedzi.

Oto kroki, na których skończyłem:

  1. Wygeneruj obraz z szumem Perlina
  2. Zalewanie tam, gdzie chcesz trochę terenu
  3. Dylatacja + erozja w celu usunięcia zbyt małych wgłębień
  4. Usuń pozostałe obszary tła w terenie
  5. Wygładzanie krawędzi

A to jest przykład wyniku: przykład wygenerowanego terenu

Napisałem tutaj szczegółowy artykuł o całym procesie , a kod (JavaScript) jest open source, sprawdź, czy chcesz czegoś gotowego do użycia;)

Julian Go
źródło