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



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

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

下面是一些测试代码。我正在尝试创建两个不同的2D阵列,其中填充了噪声值。x和y输入是我游戏中的坐标。在后面有"**"的行上,如果我不增加这些值,两个数组都将用全零填充。在本例中,坐标(0.0,-768.0)和(-1024.0,-7680)返回完全相同的噪波值。在我的游戏中,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();
    }

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

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

还请注意,您的噪声实现设计为在每个方向上重复大小为256的瓦片(请参阅noise()的第一行。这就是为什么您在数组中每4个都会得到重复值。

相关内容

  • 没有找到相关文章

最新更新