Jak usunąć pływający teren po wygenerowaniu za pomocą 3D Perlin Noise?

10

Obecnie używam 3D Perlin Noise do generowania losowego terenu w połączeniu z Marching Cubes.

Mój problem wydaje się polegać na skalowaniu funkcji hałasu, aby uzyskać rozsądne wysokości w moim terenie. Jeśli używana jest tylko jedna oktawa, wszystkie punkty w odniesieniu do szumu są oczywiście interpolowane, co powoduje dość płynne dane. Jednak, aby uzyskać zwisy / jaskinie / postrzępiony teren, muszę użyć wielu oktaw o różnych amplitudach i / lub skalować otrzymane wartości do mojej „maksymalnej” wysokości, jakiej chcę na mapie.

Być może czegoś mi brakuje, ale używając marszowych kostek z hałasem perlin 3D, regularnie otrzymuję pływające fragmenty terenu.

Jakieś pomysły na to, jak to naprawić lub czy istnieją inne funkcje szumowe, których mogę użyć, aby uzyskać wyniki takie jak opisuję? Chcę wzgórza / doliny / góry / jeziora / itp. Nie ma potrzeby używania pływających bitów oddzielonych od reszty mapy. Wierzę, że jest to podobny problem do tego, co ma Minecraft, gdy ma teren, który po prostu unosi się na niebie od czasu do czasu po pokoleniu.

Dzięki za wszelką pomoc, Mythics

Mitów
źródło

Odpowiedzi:

9

Prawdopodobnie jedynym sposobem na całkowite pozbycie się pływającego terenu jest przetestowanie łączności. W zależności od rozmiaru mapy może to być opcja. Możesz to zrobić, wybierając punkt bazowy, na samym dole świata. Następnie upewnij się, że wszystkie twoje woksele są:

  1. Połączony z bazą.
  2. Połączony z wokselem połączonym z bazą.

Najprawdopodobniej zaczynając od znanego połączonego punktu (jak dno twojego świata), a następnie zrobienie pierwszego przejścia połączonych wokseli działałoby całkiem dobrze. Upewnij się, że podczas podróży oznaczasz woksele jako połączone. Możesz to zrobić na porcję.

Ponadto istnieją tańsze sposoby minimalizacji, ale nie całkowitego usunięcia pływającego terenu.

  • Odchylenie gradientu : Możesz przesunąć położenie wokseli stałych za pomocą gradientu. Funkcja gradientu spadłaby nieco gwałtownie po przekroczeniu „poziomu gruntu”. W tym artykule omówiono użycie gradientu i podano kilka ciekawych wskazówek.

  • Szum mapy wysokości : Zamiast tego możesz generować hałas jako mapę wysokości. Spowodowałoby to usunięcie nawisów i jaskiń, ale można je symulować za pomocą dodatkowej warstwy hałasu odejmującego.

  • Mniej hałaśliwego hałasu : używaj mniej oktaw w hałasie terenu i generuj odejmujący hałas, aby uzyskać nawisy i jaskinie.

MichaelHouse
źródło
Teren może być połączony przez przylegający fragment tylko wtedy, gdy jest od niego zwis.
Loren Pechtel
@Loren: W porządku. Tak długo, jak silnik pozwala na adresowanie fragmentów według pełnego indeksu, będzie działać bez problemu.
Phil
@LorenPechtel Mówię, że możesz to zrobić na porcję, ale musisz sprawdzić sąsiednie porcje, gdy jesteś na krawędzi porcji. Może to stanowić problem podczas generowania nowego terenu i nie wygenerowania sąsiedniego fragmentu. Gdy dojdziesz do takiej sytuacji, w której masz potencjalnie pływający teren, możesz albo wygenerować sąsiednią porcję, albo użyć algorytmu szumu do parsowania wokseli, aż znajdziesz „podłoże skalne” lub znane połączenie z bieżącą porcją.
MichaelHouse
0

może być za późno, by odpowiedzieć, ale zacząłem teraz od tego generowania wokseli z Perlin Noise i znalazłem sposób na stworzenie terenu bez tych pływających elementów. Myślę, że to może ci pomóc. Aby utworzyć teren, najpierw generuję mapę wysokości, a następnie czytam piksele z tej mapy wysokości. Teraz nadchodzi interesująca część, czytam wartość „jasności” (w rzeczywistości jest to skala szarości) każdego piksela na tej mapie wysokości i która daje mi wysokość dla tej konkretnej części mapy, a następnie, aby utworzyć teren, zakładam, że ta mapa wysokości jest mój teren widziany z góry, więc jeśli wartość skali szarości piksela (po zmapowaniu do mojego terenu „maxHeight”) na tej mapie wysokości wynosi, powiedzmy 30, oznacza to, że w tym konkretnym punkcie mojego terenu wygeneruję tylko 30 wokseli na osi y, co daje mi teren bez części pływających. Jeśli chcesz jaskinie i tak dalej, możesz zastosować kolejny hałas na oryginale (pod powierzchnią), aby je utworzyć. Mam nadzieję, że to Ci odpowiada.

Sammael
źródło
1
Uważam, że jest to podobne do drugiego punktu w powyższej odpowiedzi?
MichaelHouse