Perlin噪音的平铺地形生成 - Java

时间:2014-04-15 20:41:40

标签: java noise terrain

我目前正在为2d数组生成2d Perlin噪音,并且(插值后)将结果渲染为高度图(基本上为array[x][z] = y)。

这适用于一个阵列,但不适用于基于摄像机位置的平铺加载,并且我很难在拼接处遇到拼块。

[Noise Tiles]

noise tiles

我最好的尝试是生成一个大的2d基本噪声数组(-1到1),然后将每个tile作为一个对象,存储基本网格的偏移值(要读取的噪声部分) 。

这允许我对基本网格的区域进行采样(用于插值),这些区域比图块阵列大得多,但它仍然没有排队!

我的目标是让一个flycam在移动时加载tile,并且可以远行而不重复。


这种二维数组的方法是否足以实现目标?

如果是这样,如何实现平铺或正确包装?

1 个答案:

答案 0 :(得分:2)

我在调整和测试很多之前和之后都遇到了类似的问题我得出的结论是,普通的2D perlin噪声看起来永远不会像自然地形,它基本上是白噪声(即没有巨大的山脉或山谷,只是丘陵靠近在一起)

我最近发现的方法是用多个Perlin Noises制作分形但具有不同的“分辨率” - 如果你愿意的话,加在一起以获得使用不同八度音阶的自定义地形分辨率(即更高的八度音程=更高的噪音)在你的地形)。我通常会使用增益= 0.5(这真的不需要改变很多,它看起来很不错),而八度音程= ~16

注;这是在处理过程中,Java可能有一些不同的语法,但它应该是完全相同的

float fractal(int x,int y,float gridSubs,float gain,int octaves){
  float total = 0;
  float freq = 1.0/gridSubs;
  float amp = gain;

  for(int f=0;f<octaves;f++){
    total += noise(x*freq,y*freq)*amp;
    freq *= 2.0;
    amp *= gain;
  }
  return total;
}

我找到它的网站:here

如果用此替换noise()函数,最终可能会获得更好的效果。

<小时/> 至于你的接缝问题你可能在每个块组的噪声函数调用中有错误的坐标偏移量,它应该看起来像这样:

noise( localX * tileSize + (chunkX * chunkSize) , localZ * tileSize + (chunkZ * chunkSize) );

您可能需要添加一些分辨率koefficent以使噪音稍微平滑。


现在您说过要将高度值存储在2D heightMap中,现在可以正常使用,如果您需要经常更新它们或者需要轻松访问它们,可以轻松访问高度值。

这个问题是数组的大小很容易变得非常大,我的意思是,非常大。根据我过去的经验,我可以得到一张小地图(不记得大小,但比你的小),只需加载它就可以吃掉4Gb的内存。我确实使用了一个float数组,所以使用整数数组可能会略微减少内存使用量。

我现在如何做到这一点就是每当我需要更新几何体时,我只是重新计算地形中的每个点,我现在如何设置它在每次移动时改变地形时会引入一个轻微的lagspike。好处是我可以使用更大细节的4倍大的地图,并且仍然使用大约1-2Gb的RAM。

根据我的理解,你只想在地形上移动并观察它。这不会因为没有将高度图存储在数组中而受益,因为在生成地形后您并不真正需要这些值(如果您手动平滑地形,这可能会有所不同)。

<小时/> 最后要注意的事情;我不是一名专业的程序员,这正是我从过去使用随机生成的噪音中学到的经验。