昨日私は古典的なPerlinノイズ(src:http://mrl.nyu.edu/~perlin/doc/oscar.html#noise)をJavaScriptに移植しました。不思議なことに、生成されたノイズは私が期待していたものとは大きく異なっています。古典的なPerlinノイズは線形補間/ lerpを使用しますが、ノイズはエッジの代わりに滑らかです。コサイン補間のように見えます。 Perlinはlerp関数を別の方法で使用しているようです。ここで古典的なPerlinノイズで線形補間はどのように機能しますか?
が元のコードの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の後の点は変わらないはずですか? I
は、コードを変更しに "私が期待される" それがどのように見えるか: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);
私の質問:パーリンはそうlerp機能を使用しないのはなぜ 違う?
私はあなたの問題を理解していません。あなたは2つのJSスクリプトを持っています。 –
パーリンノイズは連続していて、一貫したフィーチャスケールを持っています。高周波ノイズの余分な反復を追加することによって、より多くの「ギザギザ」ノイズが生成されます。 – Alnitak
プログラミングの問題ではなく、より理解しやすい問題です。コードは正常に動作しますが、生成されたノイズが線形補間ではっきりと見えない場合、Perlinが線形補間のようなものを使用する理由はわかりません。それは不必要ではないですか? – Pipo