2 Stimmen

Wie funktioniert die lineare Interpolation beim klassischen Perlin-Rauschen?

Gestern habe ich das klassische Perlin-Geräusch portiert (src: http://mrl.nyu.edu/~perlin/doc/oscar.html#Lärm ) zu JavaScript. Seltsamerweise sieht das erzeugte Geräusch ganz anders aus, als ich es erwartet habe. Das klassische Perlin-Rauschen verwendet lineare Interpolation/Lerp, aber das Rauschen ist glatt und nicht kantig. Es sieht eher wie Kosinus-Interpolation aus. Es scheint, dass Perlin die Lerp-Funktion auf eine andere Art und Weise verwendet.

Hier ist die Originalcode portiert auf JavaScript (mit Canvas-Bild): http://jsfiddle.net/fDTbv/

Das ist der interessante Teil:

t = vec[0] + N;
bx0 = Math.floor(t) & BM;
bx1 = (bx0+1) & BM;
rx0 = t - Math.floor(t);
rx1 = rx0 - 1.;

sx = s_curve(rx0);

u = rx0 * g1[ p[ bx0 ] ];
v = rx1 * g1[ p[ bx1 ] ];

return lerp(sx, u, v);

u und v ändern sich ständig. Warum eigentlich? Sollten u und v nicht den Punkt vor und den Punkt nach sx darstellen und sich daher nicht ändern?

I den Code geändert zu dem, was ich erwartet hatte, wie es aussehen würde: http://jsfiddle.net/8Xv8G/

Und der interessante Teil:

bx0 = Math.floor(x) & BM;
bx1 = (bx0+1) & BM;

u = g1[ p[ bx0 ] ];
v = g1[ p[ bx1 ] ];

return lerp(x - Math.floor(x), u, v);

Meine Frage: Warum verwendet Perlin die Funktion lerp so unterschiedlich?

3voto

lencinhaus Punkte 3165

Hier finden Sie ein Java-Applet aus dem Originalvortrag von Perlin, das den gesamten Prozess der 2D-Rauschberechnung sehr anschaulich erklärt. Die Rauschfunktion von Perlin ist kontinuierlich, da sie an jedem Punkt (in 1D) die lineare Interpolation zweier "geglätteter" linearer Gradienten ist. Die "Glättung" kommt von der Funktion s_curve, die einfach die Hermite-Funktion ist, die in Wirklichkeit eine Annäherung an die Kosinus-Interpolation ist. Für eine bessere Erklärung überlasse ich Sie jedoch dem Applet und dem Rest der Präsentation.

Vielleicht können Sie auch finden dieses Projekt von mir interessant: es ist eine Javascript-Applikation, die Perlin- und Simplex-2D-Rauschen auf einer html5-Leinwand rendert. Schauen Sie sich die Quelle für eine vollständige Javascript-Implementierung dieser und anderer Rauschfunktionen an.

Hoffentlich hilft das, tschüss!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X