2012-03-06 105 views
0

我正在使用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(); 
    } 

回答

2

Perlin杂被定义为0,在所有网格位置(整数的x,y,z)表示。您可以通过在您链接的代码中手动模拟来证明这一点。由于xy,并且z全部变为0时,他们的地板相减,该grad()值都为0,所以lerp()值都为0

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

还请注意,您的噪音实现设计在每个方向上的尺寸256瓦重复(见noise()第一行。这就是为什么你得到你的数组中的重复值每4。

+0

我都试过了你我做了一个非int值,并得到了相同的结果,我也尝试通过噪声(j/4,i/4,z)来缩放噪声,并获得了相同的结果。另外,你的意思是一个大小为256x256的tile或者一个包含256个tile的数组? – theDazzler 2012-03-06 03:47:27

+0

我试图在最后一段中提到的一点是,噪声函数每256(在x,y和z中)重复,所以, (1,3)处的值与(257,259)或(1,769)或通常(x + 256n,y + 256m)处的值相同。由于1024和768是多个当然,第二个数组与第一个匹配。 – 2012-03-06 17:52:00

+0

我回家时会看看。无论如何,我是一个FBM功能,我只是用它来测试。我昨天晚上做了一些改变,但是我不认为这是理想的。 – theDazzler 2012-03-06 21:22:40

相关问题