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?