我正在使用perlin噪声函数来生成我正在制作的游戏的数据,但由于某种原因,它不断返回不同输入的完全相同的结果。我花了4个小时试图在我的FBM功能上进行调试,并且无法弄清楚,所以我尝试了Ken Perlin改进的噪声功能,并且发生了相同的事情。Perlin Noise函数为不同的输入返回相同的结果
有谁知道这是为什么?什么是解决问题的好方法?我所能做的唯一事情就是在x和y坐标中添加一个像.6473这样的十进制值,这有助于提高其他问题的性能,例如在数组中重复自己的值。
这是一些测试代码。我正在尝试创建两个填充了噪声值的不同2D数组。 x和y输入是我游戏中的坐标。在'* *'后面的行上,如果我不增加这些值,那么这两个数组都将填充全零。在该示例中,坐标(0.0,-768.0)和(-1024.0,-768.0)返回完全相同的噪声值。在我的游戏中,9个不同的坐标返回相同的值。
我使用该测试的柏林噪声函数是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();
}
我都试过了你我做了一个非int值,并得到了相同的结果,我也尝试通过噪声(j/4,i/4,z)来缩放噪声,并获得了相同的结果。另外,你的意思是一个大小为256x256的tile或者一个包含256个tile的数组? – theDazzler 2012-03-06 03:47:27
我试图在最后一段中提到的一点是,噪声函数每256(在x,y和z中)重复,所以, (1,3)处的值与(257,259)或(1,769)或通常(x + 256n,y + 256m)处的值相同。由于1024和768是多个当然,第二个数组与第一个匹配。 – 2012-03-06 17:52:00
我回家时会看看。无论如何,我是一个FBM功能,我只是用它来测试。我昨天晚上做了一些改变,但是我不认为这是理想的。 – theDazzler 2012-03-06 21:22:40