包装2D Perlin噪声

12

我正在使用Perlin噪声生成高度图算法,我希望使其环绕边缘,以便它可以被视为连续的...是否有一种简单的方法或技巧可以做到这一点?我想我需要像球形噪声一样的东西,使得水平和垂直方向上都能环绕。我也可以只使用一个环绕轴,但两个会更好。

现在,我正在使用经典算法,您可以设置要添加的八度音程数量以及每个连续八度波之间用于更改振幅和频率的乘数。

提前致谢!


你不会在尝试构建定期的Minecraft世界吧?:D - Cephron
当然我并不是在尝试这样做,虽然我知道有人会这么说 :) (而且它也是2D而不是3D) - Jack
1个回答

8
Perlin噪声是由波形的总和获得的。这些波形是通过插值随机值获得的,较高的八度波形具有较小的缩放因子,而插值的随机值彼此更接近。为了使其环绕,您只需以通常的环绕方式正确地沿y轴和x轴进行插值即可。例如,如果您的X轴从x_min到x_max,最左边的随机点(正在插值)在x0处,最右边的随机点在x1处(x_min < x0 < x1 < x_max),则从x1到x0(绕过边缘)插值得到x1右侧和x0左侧的插值像素的值。
以下是使用线性插值的一个八度的伪代码。假设Perlin噪声网格大小为2的幂像素,矩阵大小为256 x 256……仅为了易读性。例如,想象size==16:
 wrappable_perlin_octave(grid, size):
   for (x=0;x<256;x+=size):
     for (y=0;y<256;y+=size):
       grid[x][y] = random()
   for (x=0;x<256;x+=size):
     for (y=0;y<256;y+=size):
       if (x % size != 0 || y % size != 0): # interpolate
         ax = x - x % size
         bx = (ax + size) % 256 # wrap-around
         ay = y - y % size
         by = (ay + size) % 256 # wrap-around
         h = (x % size) / size # horizontal balance, floating-point calculation
         v = (y % size) / size # vertical balance, floating-point calculation
         grid[x][y] = grid[ax][ay] * (1-h) * (1-v) +
                      grid[bx][ay] * h * (1-v) +
                      grid[ax][by] * (1-h) * v +
                      grid[bx][by] * h * v

1
我发现这个信息同样有帮助:http://webstaff.itn.liu.se/~stegu/TNM022-2005/perlinnoiselinks/perlin-noise-math-faq.html#toc-tile - David Braun
我认为这个问题在每个Perlin网格单元的中间存在“混合”伪影,如此处所述:http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/ 和 http://staffwww.itn.liu.se/~stegu/TNM022-2005/perlinnoiselinks/。(第一个链接还描述了更好的解决方案。) - Leftium
2
上面的答案不合理,因为第二个循环以 size 的步长进行,那么取模运算在每一步都必须为零。因此,主要的计算从来没有被调用过! - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接