包裹2D perlin噪音

Jac*_*ack 11 language-agnostic algorithm perlin-noise

我正在使用Perlin Noise进行高度图生成算法,我想让它环绕边缘,以便它可以看作是连续的...有一个简单的方法或技巧吗?我想我需要类似球形噪音的东西,以便水平和垂直环绕它.我也很高兴只有1个包裹轴,但两个会更好.

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

提前致谢!

Ant*_*ima 8

获得Perlin噪声作为波形之和.通过内插随机值获得波形,并且较高倍频程波形具有较小的缩放因子,而内插随机值彼此更接近.要使其环绕,您只需要以通常的环形方式在y轴和x轴周围进行正确插值,即如果X轴从x_min跨越到x_max,则最左边的随机点(正在插值)是在x0和最右边的x1(x_min <x0 <x1 <x_max),通过从x1到x0的内插(环绕边缘)获得直到x1和从x0向左的内插像素的值.

这里使用线性插值的一个八度音阶的伪代码.这假定为256 x 256矩阵,其中Perlin噪声网格大小是两个像素的幂...只是为了使其可读.想象一下例如尺寸== 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
Run Code Online (Sandbox Code Playgroud)

  • 上面的答案没有意义,因为第二个循环以“size”为步长,然后每一步的模计算必须为零。所以主要的计算从未被调用过! (2认同)