2012-03-06 24 views
0

私は作っているゲームのデータを生成するためにパーリンノイズ関数を使用していますが、何らかの理由で別の入力に対して同じ結果を返すことがあります。私はFBMの機能でこれをデバッグしようとしているのに4時間を費やしましたが、それを理解できなかったので、Ken Perlinの改善されたノイズ機能を試しました。同じことが起こります。Perlin異なる入力で同じ結果を返すノイズ関数

これはなぜですか?それを修正するための良い方法は何ですか?私ができる唯一のことはx、y座標に.6473のような小数点の値を追加することですが、配列内で値が繰り返されるなどの他の問題が発生しました。

ここにいくつかのテストコードがあります。ノイズ値で満たされた2つの異なる2D配列を作成しようとしています。 xとyの入力はゲームの座標です。 '* *'の後に、これらの値を大きくしないと、両方の配列がすべて0で埋められます。この例では、座標(0.0、-768.0)と(-1024.0、-768.0)はまったく同じノイズ値を返します。私のゲームでは、9つの異なる座標が同じ値を返します。私はこの試験のために使用してい

Perlinノイズ関数はhere

public class TestPerlinMain 
{ 
    public static void main(String[] args) 
    { 
     int seed = 532434; 

     //create first noise array 
     double x = 0.0; //x-coordinate 
     double y = -768.0; //y-coordinate 
     float z = 10.0f; 

     double[][] test = new double[15][15]; 

     System.out.println("Noise Array 1: "); 

     for(int i = 0; i < test.length; i++) 
     { 
      for(int j = 0; j < test[i].length; j++) 
      { 
       test[i][j] = ImprovedNoise.noise(x + (j * 64.0), y + (i * 64.0), 10.0); 
       x += .314f;//************ 

       System.out.print(test[i][j] + " "); 
      } 
      y += .314f;//*********** 

     } 
     System.out.println(); 

     //create 2nd noise array 
     double x2 = -1024.0; //x coordinate 
     double y2 = -768.0; //y coordinate 
     float z2 = 10.0f;  

     System.out.println(); 

     double[][] test2 = new double[15][15]; 

     System.out.println("Noise Array 2: "); 

     for(int i = 0; i < test2.length; i++) 
     { 
      for(int j = 0; j < test2[i].length; j++) 
      { 
       test2[i][j] = ImprovedNoise.noise(x2 + (j * 64.0), y2 + (i * 64.0), 10.0); 
       x2 += .314f;//************* 

       System.out.print(test2[i][j] + " "); 
      } 
      y2 += .314f;//************ 

     } 
     System.out.println(); 
    } 

答えて

2

Perlinノイズは、すべてのグリッド位置(整数X、Y、Z)で0になるように定義されています。リンクしたコードで手作業でシミュレートすることで、これを自分自身に証明できます。 xy、及びその床が減算されたときにzすべてが0になるので、grad()値が全て0であるため、lerp()値はすべて0

あるあなたが望むノイズを取得する方法はいくつかあります。まず、非整数値zを使用する場合は、ノイズのランダムな値を取得する必要があります。しかし、グリッド間隔64はノイズ基準よりもはるかに大きいので、Perlinノイズではなく静的な感じになります。より良いアプローチは、noise(j/4., i/4., z)のようなことをすることでノイズをスケールアップすることです。各ノイズセルの4点をサンプリングすることで、ノイズの滑らかさの一部を見ることができます。

も注意してください、あなたのノイズの実装は、各方向のサイズ256のタイルで繰り返すように設計されていること(あなたが、配列内の値ごとに4を繰り返します理由です。noise()の最初の行を参照してください。

+0

私はすべてにあなたを試してみました私はzを非整数値にして同じ結果を得ました。ノイズ(j/4、i/4、z)を提案して同様にノイズをスケーリングしてみました。また、サイズが256x256のタイルか256タイルを持っている配列を意味するのですか? – theDazzler

+0

最後の段落では、雑音関数が256(x、y、z) (1,3)の値は、(257,259)または(1,769)または一般的に(x + 256n、y + 256m)の値と同じです。1024と768は、もちろん、2番目の配列は最初の配列と一致します。 –

+0

私が家に帰ると、私はそれをチェックします。とにかく私はFBM関数ですが、私はテスト用にこれを使用していました。私は昨晩、いくつかの変更を加えることでそれを稼働させましたが、それは理想的ではないと思います。 – theDazzler

関連する問題