1

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

これがなぜなのか誰か知っていますか?それを修正する良い方法は何ですか?私ができた唯一のことは、x 座標と y 座標に .6473 のような 10 進数の値を追加することだけでした。

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

このテストに使用しているパーリン ノイズ関数はこちら

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();
    }
4

1 に答える 1

3

パーリン ノイズは、すべてのグリッド位置 (整数 x、y、z) で 0 と定義されています。これは、リンクしたコードで手動でシミュレートすることで証明できます。xy、およびzはすべてフロアを引くと 0 になるため、値はgrad()すべて 0 になるため、lerp()値はすべて 0 になります。

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

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

于 2012-03-06T03:12:01.923 に答える