2

昨日、古典的なパーリン ノイズ (ソース: 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 関数をそれほど異なる方法で使用するのですか?

4

1 に答える 1

3

ここでは、2Dノイズ計算プロセス全体を非常に明確に説明している元のPerlinの講演からJavaアプレットを見つけることができます。perlinのノイズ関数は連続的です。これは、各ポイント(1D)で、2つの「平滑化された」線形勾配の線形補間であるためです。「平滑化」は、s_curve関数に由来します。これは、実際には正弦補間の近似であるエルミート関数です。ただし、より適切な説明のために、アプレットと残りのプレゼンテーションに任せます。

たぶん、私のこのプロジェクトも面白いと思うかもしれません。これは、html5キャンバスにPerlinとSimplexの2Dノイズをレンダリングするjavascriptアプリです。これらおよびその他のノイズ関数の完全なJavaScript実装については、ソースを確認してください。

お役に立てば幸いです、さようなら!

于 2013-03-22T01:30:44.403 に答える