2012-05-10 19 views
2

昨日私は古典的な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機能を使用しないのはなぜ 違う?

+0

私はあなたの問題を理解していません。あなたは2つのJSスクリプトを持っています。 –

+0

パーリンノイズは連続していて、一貫したフィーチャスケールを持っています。高周波ノイズの余分な反復を追加することによって、より多くの「ギザギザ」ノイズが生成されます。 – Alnitak

+0

プログラミングの問題ではなく、より理解しやすい問題です。コードは正常に動作しますが、生成されたノイズが線形補間ではっきりと見えない場合、Perlinが線形補間のようなものを使用する理由はわかりません。それは不必要ではないですか? – Pipo

答えて

3

Here 2次元ノイズ計算プロセス全体を非常にはっきりと説明する元のPerlinの講演から、Javaアプレットを見つけることができます。パーリンのノイズ関数は、各点(1D内)で2つの「平滑化」直線勾配の線形補間であるため、連続しています。 「スムージング」はs_curve関数から得られます。これは実際にはコサイン補間の近似である単純にヘルマイト関数です。しかし、より良い説明のために、私はあなたをアプレットに残し、残りのプレゼンテーションを残します。

多分this project of mineが面白いかもしれません.html5キャンバスにPerlinとSimplexの2Dノイズを描画するjavascriptアプリケーションです。これらのノイズ関数と他のノイズ関数の完全なjavascript実装のソースを確認してください。

希望があれば、よろしく!

+0

共有いただきありがとうございます。 – Pipo

関連する問題