昨日、古典的なパーリン ノイズ (ソース: http://mrl.nyu.edu/~perlin/doc/oscar.html#noise ) を JavaScript に移植しました。奇妙なことに、生成されたノイズは、私が予想していたものとは大きく異なって見えます。古典的なパーリン ノイズは線形補間/lerp を使用しますが、ノイズはエッジではなく滑らかです。コサイン補間のように見えます。Perlin は lerp 関数を別の方法で使用しているようです。
JavaScript に移植された元のコード(キャンバス画像付き) は次のとおりです: http://jsfiddle.net/fDTbv/
これは興味深い部分です:
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 と v は常に変化します。なんで?u と v は sx の前の点と後の点を表すため、変更されませんか?
コードを「私が期待したもの」に変更しました: http://jsfiddle.net/8Xv8G/
そして興味深い部分:
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);
私の質問: なぜ Perlin は lerp 関数をそれほど異なる方法で使用するのですか?