【问题标题】:Perlin Noise function returning same results for different inputsPerlin Noise 函数为不同的输入返回相同的结果
【发布时间】:2012-03-23 13:13:49
【问题描述】:

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

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

这是一些测试代码。我正在尝试创建两个填充有噪声值的不同二维数组。 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();
    }

【问题讨论】:

    标签: java noise perlin-noise


    【解决方案1】:

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

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

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

    【讨论】:

    • 你说的我都试过了。我将 z 设为非 int 值并得到相同的结果。我还尝试按照您的建议通过做 noise(j/4, i/4, z) 来缩放噪音,并得到了相同的结果。还有其他建议吗?另外,您是指大小为 256x256 的图块还是包含 256 个图块的数组?
    • 我在最后一段中试图说明的一点是,噪声函数每 256 次(在 x、y 和 z 中)重复一次。因此,(1, 3) 处的值与 (257, 259) 或 (1, 769) 或通常 (x + 256n, y + 256m) 处的值相同。由于 1024 和 768 是 256 的倍数,当然第二个数组匹配第一个。
    • 我回家后看看。反正我是一个FBM功能,我只是用这个来测试。昨晚我确实通过进行一些更改使其正常工作,但我认为这并不理想。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多