Hej, próbuję wymyślić, jak wygenerować fraktale z kafelków w kodzie (dla map gier, ale to nie ma znaczenia ) Próbowałem zmodyfikować wtyczkę Solid Noise dostarczaną z GIMP (z moim bardzo ograniczonym rozumieniem, w jaki sposób kod działa), ale nie mogę sprawić, by mój działał poprawnie.
Mój dotychczas zmodyfikowany kod (Java)
Moduł stałego szumu GIMP, od którego opieram swój kod na (C)
Oto, co próbuję osiągnąć, ale właśnie to otrzymuję
Więc jeśli ktoś może zobaczyć, co zrobiłem źle, lub ma sugestię, jak mógłbym to zrobić inaczej, byłbym bardzo wdzięczny. Z góry dziękuję. A jeśli pytam o wiele, a jeśli po prostu wielką porażkę w życiu, przepraszam.
java
procedural-generation
maps
Nick Badal
źródło
źródło
Odpowiedzi:
Nie podążam dokładnie za twoim kodem, ale tutaj jest uproszczony opis algorytmu, który z grubsza osiągnie efekt (na podstawie opublikowanego obrazu).
Poniższe wyjaśnienie nie jest wersją superoptymalizowaną, ale jest koncepcyjnie jasne (mam nadzieję). Po uruchomieniu możesz go zoptymalizować (w rzeczywistości dość drastycznie).
Trudnym krokiem jest etap próbkowania i interpolacji. Załóżmy, że w warstwie pomijamy próbkowanie co m-ty piksel. Oto podstawowy pomysł na m> 1 (jeśli m wynosi 1, używamy obrazu w stanie, w jakim się znajduje):
Kilka wskazówek:
źródło
Wygląda na to, że mój oryginalny pastebin jakoś wygasł, więc nie mam możliwości porównania mojego niedziałającego kodu, ale w mojej obecnej grze przeszedłem i ponownie przetłumaczyłem kod GIMP na java i wydaje się, że teraz działa dobrze.
Jeśli ktoś planuje użyć tego kodu, zaleciłbym modyfikację konstruktora, aby zmodyfikować parametry ustawienia (szczegóły i rozmiar), abyś mógł ustawić go tak, jak chcesz. EDYCJA: Zdałem sobie sprawę, że moje oryginalne pytanie dotyczyło uczynienia go kafelkowym, więc pamiętaj, aby ustawić tilable na true!
Kod: http://pastebin.com/KsfZ99Xa
Przykład:
źródło
Przejrzałem tylko wersje Java i C i zauważyłem niewielką różnicę w sposobie korzystania z funkcji szumu. Oto twoje:
Kod C:
Dlaczego zdecydowałeś się nie odejmować przesunięcia? (col - xoffset) i (row - yoffset)
Zastanawiam się. Nie mam czasu na pełną analizę kodu.
Mam nadzieję że to pomoże.
źródło
Nie wiem, czy to może pomóc, ale następująca sztuczka okazała się dla mnie przyjemnością:
http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/
Ten facet używa funkcji szumu 4d i po prostu podaje wartości xy dwóch kół jako wartości xyzw dla szumu 4d. Rezultat jest perfekcyjny.
Oto pomysł (uproszczony) na zdjęcie 1000 * 1000:
źródło
Polecam użycie algorytmu diamentowego kwadratu , znanego również jako fraktal plazmy lub fraktal przemieszczenia losowego punktu środkowego. Za pomocą tego algorytmu bardzo łatwo jest ograniczyć krawędzie, aby miały te same wartości. Gdy generujesz wartość krawędzi, skopiuj ją do odpowiedniej krawędzi po drugiej stronie. Daje to idealnie kafelkową mapę.
źródło
Jest to świetny artykuł o emisji hałasu tutaj . Jak twierdzi artykuł, nie jest to szum Perlina (właściwie różowy szum), ale nadal niezwykle przydatne jest zrozumienie, w jaki sposób generowane są obrazy szumu.
Tak więc, aby faktycznie odpowiedzieć na twoje pytanie: aby stworzyć obraz szumu, który trzeba kafelkować, wystarczy zachować „kafelkowanie” przez całe pokolenie. Oznacza to, że gdy hałas jest wygładzany, wygładzasz go tak, jakby powtarzał się w nieskończoność we wszystkich kierunkach - kafelkami.
źródło
Na podstawie zrzutu ekranu sądzę, że generowane są tylko „duże” warstwy, dlatego hałas wydaje się zbyt regularny i pozbawiony szczegółów.
Może to zabrzmieć głupio, ale czy próbowałeś zwiększyć zmienną „szczegółowość” (linia 16)? W kodzie jest on ustawiony na 1, co oznacza, że algorytm wygeneruje tylko dwie warstwy szczegółów przed zatrzymaniem. Spróbuj zwiększyć go do około 8.
źródło
Powinieneś także spojrzeć na Simplex Noise , który został opracowany przez Kena Perlina, aby naprawić niektóre niedociągnięcia związane z hałasem Perlina.
Pracowałem nad implementacją Simplex Noise do gry w C ++. Obsługuje wielooktawowy szum 1D / 2D / 3D / 4D. W tej chwili jedyną wbudowaną teksturą jest marmur, ale możesz z łatwością dodać więcej:
(http://code.google.com/p/battlestar-tux/source/browse/trunk/src/lib/procedural/)
źródło