Perlin Noise函数为不同的输入返回相同的结果

时间:2012-03-06 02:50:49

标签: java noise perlin-noise

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

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

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

我用于此测试的Perlin Noise功能是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();
    }

1 个答案:

答案 0 :(得分:2)

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

有几种方法可以获得您想要的噪音。首先,如果使用z的非整数值,则应获得随机噪声值。但是,由于64的网格间距远大于噪声基础,因此看起来像静态,而不是Perlin噪声。更好的方法是通过执行noise(j/4., i/4., z)之类的操作来扩大噪音。在每个噪声单元上采样4个点可以看到噪声的某些平滑度。

另请注意,您的噪声实现设计为在每个方向上重复大小为256的切片(请参阅noise()的第一行。这就是您在数组中每4个重复值的原因。