我正在使用一个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。您可以通过在链接的代码中手动模拟来向自己证明这一点。由于x
、y
和z
在减去它们的楼层时都变为0,因此grad()
的值都为0,所以lerp()
的值都是0。
有几种方法可以获得您想要的噪音。首先,如果您使用z
的非整数值,那么您应该获得噪声的随机值。但是,由于64的网格间距比噪波基础大得多,所以这看起来像是静态的,而不是Perlin噪波。更好的方法是通过做类似noise(j/4., i/4., z)
的事情来放大噪声。在每个噪声单元上采样4个点将允许看到噪声的一些平滑度。
还请注意,您的噪声实现设计为在每个方向上重复大小为256的瓦片(请参阅noise()
的第一行。这就是为什么您在数组中每4个都会得到重复值。