我以前遇到过类似的问题,经过大量调整和测试,我得出结论:普通的2D perlin噪声永远不会像自然地形一样,它本质上是白噪声(即没有巨大的山脉或峡谷,只有靠在一起的小山丘)。
我最近发现的一个好方法是使用多个Perlin噪声制作分形,但具有不同的“分辨率” - 如果您愿意,将它们相加以获得使用不同八度音高(即高八度=地形中的高噪声)的自定义地形分辨率。我通常使用增益= 0.5(这实际上不需要太多更改,看起来非常好),以及八度数=〜16。
注意:这是在Processing中完成的,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;
}
我在这里找到了相关网站:这里
如果你用这个替换你的noise()函数,最终可能会得到更好的结果。
至于你的接缝问题,你很可能把每个块中噪声函数调用的坐标偏移量设置错误了,应该像这样:
noise( localX * tileSize + (chunkX * chunkSize) , localZ * tileSize + (chunkZ * chunkSize) );
您可能需要添加一些分辨率系数,使噪声变得更平滑。
现在,您说您正在将高度值存储在2D高度图中,这很好,如果您需要经常更新它们或需要轻松访问它们,则可以很容易地访问高度值。
问题在于数组的大小非常大,我指的是非常大。根据我的经验,我曾经加载一个小地图(记不清了,但比你的小),耗用了4 GB 的存储器。不过,我使用的是浮点数组,使用整型数组可能会稍微减少内存使用。
现在我如何做是每当我需要更新几何图形时就重新计算地形中的每个点,我目前的设置会在移动时每次更改地形时引入轻微的延迟。好处是,我可以拥有4倍更大、更详细的地图,仍然只使用约1-2GB 的 RAM。
由于我理解您只是想在地形周围移动和查看它,因此最好不要将高度图存储在数组中,因为在生成地形后您实际上并不需要这些值(如果您手动平滑地形,情况可能有所不同)。
最后请注意一件事:我不是专业程序员,这只是我从使用随机生成的噪声中学到的经验。