1

我正在使用 perlin 噪声函数为我正在制作的游戏生成数据,但由于某种原因,它不断为不同的输入返回完全相同的结果。我花了大约 4 个小时试图在我的 FBM 函数上调试它,但无法弄清楚,所以我尝试了 Ken Perlin 改进的噪声函数,同样的事情发生了。

有人知道为什么是这样吗?有什么好的方法来解决它?我唯一能做的就是在 x 和 y 坐标上添加一个像 0.6473 这样的十进制值,这有帮助,但也引入了其他问题,例如在数组中重复的值。

这是一些测试代码。我正在尝试创建两个填充有噪声值的不同 2D 数组。x 和 y 输入是我游戏中的坐标。在它们后面带有 ' * * ' 的行上,如果我不增加这些值,两个数组都将被全零填充。在示例中,坐标 (0.0, -768.0) 和 (-1024.0, -768.0) 返回完全相同的噪声值。在我的游戏中,9 个不同的坐标返回相同的值。

我用于此测试的 Perlin Noise 函数在这里

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

Perlin 噪声在所有网格位置(整数 x、y、z)处定义为 0。您可以通过在链接的代码中手动模拟它来向自己证明这一点。由于xyz减去它们的楼层后都变为 0 ,因此值grad()都为 0,因此lerp()值都为 0。

有几种方法可以获得所需的噪音。首先,如果您使用 的非整数值z,那么您应该得到随机噪声值。但是,由于 64 的网格间距比噪声基大得多,这看起来像静态的,而不是 Perlin 噪声。更好的方法是通过执行类似noise(j/4., i/4., z). 在每个噪声单元上采样 4 个点将允许看到噪声的一些平滑度。

Note also that your noise implementation is designed to repeat with tiles of size 256 in each direction (see the first line of noise(). This is why you get repeating values every 4 in your array.

于 2012-03-06T03:12:01.923 回答