Chcę wygenerować szum, który wygląda następująco:
(zdjęcia dzięki uprzejmości Understanding Perlin Noise )
Zasadniczo szukam hałasu z mnóstwem małych „zmarszczek”. Następujące działania niepożądane są niepożądane:
Czy są na to jakieś proste sposoby? Patrzę na perlin i simplex od tygodnia i wydaje mi się, że nie mogę go nigdy uruchomić w JavaScript, a kiedy to robię, nie mam odpowiednich parametrów do generowania takich obrazów, lub jest to straszne powolny.
Rozumiem, że 3 obrazy, które opublikowałem, można prawdopodobnie osiągnąć za pomocą tego samego algorytmu, ale w innej skali, ale nie potrzebuję tego algorytmu. Potrzebuję tylko bardzo prostego algorytmu, aby osiągnąć idealnie coś takiego jak na pierwszym obrazie. Może jakieś rozmycie wykona zadanie, ale nie mogę osiągnąć rezultatów.
Rozwijam to w JavaScript, ale dowolny kod, a nawet proste i szczegółowe wyjaśnienie będzie działać.
Odpowiedzi:
Chociaż istniejące odpowiedzi są dobrym sposobem na osiągnięcie tego, co pokazują obrazy w pytaniu, komentarze ujawniły, że celem jest wygenerowanie obrazu, jak pokazano poniżej:
Ten rodzaj szumu różni się znacznie od szumu pokazanego na obrazach pytania, ponieważ tworzy bliskie pojedyncze plamy.
Okazuje się, że ten rodzaj szumu nazywa się turbulencją, która (zgodnie z tym artykułem Klejnoty procesora ) jest implementowana w następujący sposób (gdzie
noise
funkcja szumu Perlina zwraca wartości z -1..1):Połączenie tej implementacji JavaScript Perlin-noise z opisaną powyżej funkcją turbulencji generuje szum, który jest podobny do powyższego obrazu:
Kod JavaScript, który został użyty do wygenerowania powyższego obrazu, można znaleźć w tym jsFiddle .
źródło
return Math.abs(this.noise(x,y,z)*2)-.5
.Twoje przykładowe obrazy przypominają różowy szum. Jest generowany w następujący sposób:
Po pierwsze, mamy jakiś płynny, przypadkowy szum. Zwykle osiąga się to przez obliczenie pseudolosowych wartości w punktach o współrzędnych całkowitych i interpolację tych wartości w jakiś sposób. Wynik na tym etapie wygląda następująco:
Następnie bierzemy ten hałas i „ściskamy” go, zwiększając jego częstotliwość. Najprostszym wzorem na to jest n2 (x, y) = n1 (x f, y f). W ten sposób wzór szumu jest ściskany f razy w obu kierunkach. Lepsze algorytmy szumu również obracają i / lub tłumaczą wzór szumu na tym etapie, w celu rozbicia prawidłowości.
Następnie ten ściśnięty wzór jest mnożony przez pewną wartość (mniej niż 1) i dodawany do pierwszego wzoru. W efekcie dodajemy małe zmiany wyższej częstotliwości oprócz wzoru niskiej częstotliwości. Wynik wygląda trochę tak:
Kroki 2 i 3 można powtórzyć wiele razy, dodając drobniejsze i bardziej szczegółowe szczegóły. wynik netto zwykle wygląda jak twój przykład z czerwonym krzyżem. Zauważ jednak, że w naszym algorytmie mamy 3 parametry do zabawy:
Oto kilka przykładów:
Wysoka wytrwałość:
Wysoka luźność:
Niska luźność:
Zabawa z tymi parametrami to nie jedyne, co możesz zrobić. Jedną z fajnych technik, które mogą nadać charakter wzorcom szumów, jest użycie zakłóceń , czyli dodanie szumu do współrzędnych wejściowych funkcji hałasu.
Na przykład, załóżmy, że masz jakąś funkcję, która generuje hałas podanych współrzędnych i losowych:
Noise(x,y, seed)
. Następnie możesz użyć czegoś takiego,Noise(x+Noise(x,y,234), y+Noise(x,y,6544), seed)
aby uzyskać zaburzoną wartość. Może to prowadzić do takich wzorów (zaburzenie dotyczy tutaj wzoru kołowego, a nie hałasu):Jeśli chcesz dowiedzieć się więcej, sugeruję przyjrzeć się libnoise (C ++) lub CoherentNoise (C #). Niestety nie znam żadnej biblioteki generującej szumy Javascript.
źródło
Kod jest komentowany. Podziękowania należą się Seanowi McCulloughowi. http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
Ponadto, jeśli używasz PRNG z tym, możesz łatwo uzyskać łatwe do ponownego zainstalowania wyniki
źródło
Użyj wstępnie wygenerowanych tekstur lub umieść generator tekstur szumu perlin na serwerze i zapytaj go o obrazy szumu perlin.
źródło