Związane z:
Chciałbym generować hałas Perlina. Pracuję z funkcji Paula Bourke PerlinNoise*()
, które są takie:
// alpha is the "division factor" (how much to damp subsequent octaves with (usually 2))
// beta is the factor that multiplies your "jump" into the noise (usually 2)
// n is the number of "octaves" to add in
double PerlinNoise2D(double x,double y,double alpha,double beta,int n)
{
int i;
double val,sum = 0;
double p[2],scale = 1;
p[0] = x;
p[1] = y;
for (i=0;i<n;i++) {
val = noise2(p);
sum += val / scale;
scale *= alpha;
p[0] *= beta;
p[1] *= beta;
}
return(sum);
}
Używanie kodu takiego jak:
real val = PerlinNoise2D( x,y, 2, 2, 12 ) ; // test
return val*val*skyColor + 2*val*(1-val)*gray + (1-val)*(1-val)*cloudColor ;
Daje niebo jak
Których nie można kafelkować.
Wartości pikseli wynoszą 0–> 256 (szerokość i wysokość), a piksel (0,0) używa (x, y) = (0,0), a piksel (256,256) używa (x, y) = (1,1)
Jak mogę ustawić kafelki?
tiles
perlin-noise
Bobobobo
źródło
źródło
Odpowiedzi:
Bezproblemowo kafelkowy hałas fBm składa się z dwóch części. Najpierw musisz ustawić funkcję szumu Perlina jako kafelkową. Oto kod Pythona dla prostej funkcji szumu Perlina, która działa z dowolnym okresem do 256 (możesz w prosty sposób rozszerzyć go tak, jak chcesz, modyfikując pierwszą sekcję):
Hałas Perlina powstaje ze zsumowania małych „surfletów”, które są wynikiem losowo zorientowanego gradientu i oddzielnej funkcji wielomianu opadania. Daje to region dodatni (żółty) i region ujemny (niebieski)
Surflety mają zasięg 2x2 i są wyśrodkowane na całkowitych punktach siatki, więc wartość hałasu Perlina w każdym punkcie przestrzeni jest wytwarzana przez zsumowanie surfletów w rogach zajmowanej przez nie komórki.
Jeśli kierunki gradientu zostaną zawinięte z pewnym okresem, sam szum zostanie następnie płynnie zawinięty z tym samym okresem. Dlatego powyższy kod pobiera modulo współrzędnej sieci przed okresem mieszania przez tabelę permutacji.
Drugim krokiem jest to, że sumując oktawy, będziesz chciał skalować okres z częstotliwością oktawy. Zasadniczo będziesz chciał, aby każda oktawa ułożyła cały obraz tylko jeden raz, a nie wiele razy:
Złóż to razem, a otrzymasz coś takiego:
Jak widać, to rzeczywiście kafelki płynnie:
Z kilkoma drobnymi poprawkami i mapowaniem kolorów, oto obraz chmury w kafelkach 2x2:
Mam nadzieję że to pomoże!
źródło
x*2**o
przekonwertować na C? czy to jest:x*pow(2,o)
czypow(x*2,o)
?x*pow(2, o)
, ponieważ potęgowanie ma wyższy priorytet niż mnożenie.a
wartość? i nie jestem pewien, w jaki sposób funkcje przekształcają się w C ... dostaję tylko proste linie wyjściowe.im.putdata(data, 128, 128)
. (Dla tych, którzy nie znają pytona lub PIL: oznaczają skalę i przesunięcie, a nie rozmiar obrazu.)Oto jeden dość sprytny sposób, który wykorzystuje szum 4D Perlin.
Zasadniczo zamapuj współrzędną X swojego piksela na okręgu 2D, a współrzędną Y swojego piksela na drugim okręgu 2D i umieść te dwa koła prostopadle względem siebie w przestrzeni 4D. Uzyskana tekstura jest taflowa, nie ma wyraźnych zniekształceń i nie powtarza się tak jak lustrzana tekstura.
Skopiuj i wklej kod z artykułu:
źródło
Ok, rozumiem. Odpowiedzią jest chodzenie torusem w szumie 3D, generując z niego teksturę 2D.
Kod:
Wyniki:
Pewnego razu:
I kafelki:
źródło
Jednym prostym sposobem, jaki mogę wymyślić, jest wzięcie wyjścia funkcji szumu i odbicie lustrzane / odwrócenie w obraz, który jest dwa razy większy. Trudno to wyjaśnić, więc oto obraz:
Teraz, w tym przypadku, jest całkiem oczywiste, co zrobiłeś, kiedy na to spojrzałeś. Mogę wymyślić dwa sposoby (ewentualnie :-)) rozwiązania tego:
Możesz zrobić ten większy obraz, a następnie wygenerować na nim trochę więcej szumu, ale (i nie jestem pewien, czy to możliwe) skupiony na środku (więc krawędzie pozostają takie same). Może dodać dodatkową różnicę, która sprawi, że twój mózg będzie myślał, że to nie tylko lustrzane odbicie.
(Nie jestem również pewien, czy jest to możliwe). Możesz spróbować manipulować danymi wejściowymi do funkcji szumu, aby inaczej wygenerować obraz początkowy. Będziesz musiał to zrobić metodą prób i błędów, ale poszukaj funkcji, które przyciągają wzrok podczas układania go w kafelki / dublowania, a następnie spróbuj go nie generować.
Mam nadzieję że to pomoże.
źródło
tex2d(abs(abs(uv.x)%2.0-1.0), abs(abs(uv.y)%2.0-1.0))
Pierwsza wersja tej odpowiedzi była w rzeczywistości błędna, zaktualizowałem ją
Metodą, którą z powodzeniem zastosowałem, jest kafelkowanie domeny szumów . Innymi słowy, ustaw swoją
noise2()
funkcję podstawową jako okresową. Jeślinoise2()
jest okresowy ibeta
jest liczbą całkowitą, powstały hałas będzie miał taki sam okres jaknoise2()
.Jak możemy tworzyć
noise2()
okresowe? W większości implementacji funkcja ta wykorzystuje pewien rodzaj szumu sieci. Oznacza to, że pobiera losowe liczby o współrzędnych całkowitych i interpoluje je. Na przykład:Tę funkcję można w prosty sposób zmodyfikować, aby stała się okresowa z kropką całkowitą. Po prostu dodaj jedną linię:
przed obliczeniem
v1
iv2
. W ten sposób wartości we współrzędnych całkowitych będą powtarzane co jednostki okresu, a interpolacja zapewni, że wynikowa funkcja będzie płynna.Zauważ jednak, że działa to tylko wtedy, gdy Okres jest większy niż 1. Tak więc, aby faktycznie użyć tego do tworzenia bezszwowych tekstur, musisz spróbować kwadratu Okres x Okres, a nie 1x1.
źródło
noise2
okresowe (z krótkim okresem, takim jak 1 jednostka)? Myślę, że o to ostatecznie zadaje pytanie. Standardowy hałas Perlina jest okresowy z okresem 256 na każdej osi, ale potrzebny jest zmodyfikowany hałas o mniejszym okresie.noise2
jak zasugerowano, to będzie uzyskać okresowe rezultaty, czy sama funkcja jest okresowa, czy nie. Ponieważ argumenty obejmują co 1 jednostkę.Inną alternatywą jest generowanie hałasu za pomocą bibliotek libnoise. Bezproblemowo możesz generować hałas na teoretycznej nieskończonej ilości miejsca.
Spójrz na następujące: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile
Istnieje również port XNA powyższego na: http://bigblackblock.com/tools/libnoisexna
Jeśli korzystasz z portu XNA, możesz zrobić coś takiego:
GeneratePlanar to funkcja do wywołania, aby uzyskać sekcje w każdym kierunku, które będą płynnie łączyć się z resztą tekstur.
Oczywiście ta metoda jest bardziej kosztowna niż posiadanie pojedynczej tekstury, którą można zastosować na wielu powierzchniach. Jeśli chcesz utworzyć losowe tekstury do układania w kafelki, może to Cię zainteresować.
źródło
Chociaż istnieją tutaj odpowiedzi, które mogłyby zadziałać, większość z nich jest skomplikowana, powolna i problematyczna.
Wszystko, co naprawdę musisz zrobić, to skorzystać z funkcji okresowego generowania hałasu. Otóż to!
Doskonałą implementację domeny publicznej opartą na „zaawansowanym” algorytmie hałasu Perlina można znaleźć tutaj . Potrzebna funkcja to pnoise2. Kod został napisany przez Stefana Gustavsona, który tutaj skomentował dokładnie tę kwestię i to, jak inni przyjęli niewłaściwe podejście. Posłuchaj Gustavsona, on wie o czym mówi.
W odniesieniu do różnych rzutów sferycznych niektórzy tutaj sugerują: cóż, w zasadzie działają (powoli), ale wytwarzają również teksturę 2D, która jest spłaszczoną kulą, tak że krawędzie byłyby bardziej skondensowane, prawdopodobnie powodując niepożądany efekt. Oczywiście, jeśli zamierzasz rzutować teksturę 2D na kulę, to jest właściwy sposób, ale nie o to proszono.
źródło
Oto o wiele prostszy sposób robienia hałasu z płytek:
Do każdej skali hałasu używasz modułowego zawinięcia. Pasują one do krawędzi obszaru bez względu na używaną skalę częstotliwości. Musisz więc używać normalnego szumu 2D, który jest znacznie szybszy. Oto kod WebGL na żywo, który można znaleźć w ShaderToy: https://www.shadertoy.com/view/4dlGW2
Trzy górne funkcje wykonują całą pracę, a fBM przechodzi wektor x / y w zakresie od 0,0 do 1,0.
źródło
Miałem pewne niezłe wyniki interpolując w pobliżu krawędzi płytki (owinięte krawędzią), ale to zależy od tego, jaki efekt chcesz osiągnąć i od dokładnych parametrów hałasu. Działa świetnie w przypadku nieco rozmytego hałasu, nie tak dobrze w przypadku kolczastych / drobnoziarnistych.
źródło
Sprawdzałem ten wątek w poszukiwaniu odpowiedzi na podobny problem, a następnie dostałem czyste i kompaktowe rozwiązanie od autora tego kodu python, aby generować szum fraktalny z szumu perlin / simplex. Zaktualizowany kod znajduje się w tym (zamkniętym) numerze i można go wznowić, ustawiając gradienty dla prawej strony „generatora” równe tym z lewej strony (i takie same dla góry i dołu), na przykład w
Wygląda to na eleganckie i czyste rozwiązanie, unikam tutaj kopiowania całego kodu (ponieważ nie jest to moje własne rozwiązanie), ale jest on dostępny pod linkiem podanym powyżej. Mam nadzieję, że może to być przydatne dla kogoś, kto chce stworzyć obraz fraktalny 2d z kafelkami, taki jak ten, którego potrzebowałem, wolny od artefaktów i zniekształceń.
źródło