我正在使用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();
}
答案 0 :(得分:2)
在所有网格位置(整数x,y,z),Perlin噪声定义为0。你可以通过在你链接的代码中手工模拟它来证明这一点。由于x
,y
和z
在减去其楼层时都变为0,因此grad()
值均为0,因此lerp()
值均为0
有几种方法可以获得您想要的噪音。首先,如果使用z
的非整数值,则应获得随机噪声值。但是,由于64的网格间距远大于噪声基础,因此看起来像静态,而不是Perlin噪声。更好的方法是通过执行noise(j/4., i/4., z)
之类的操作来扩大噪音。在每个噪声单元上采样4个点可以看到噪声的某些平滑度。
另请注意,您的噪声实现设计为在每个方向上重复大小为256的切片(请参阅noise()
的第一行。这就是您在数组中每4个重复值的原因。