Algorithm 二维柏林噪声

Algorithm 二维柏林噪声,algorithm,language-agnostic,perlin-noise,Algorithm,Language Agnostic,Perlin Noise,我正在使用Perlin Noise进行高度贴图生成算法,我想让它环绕边缘,这样它就可以被看作是连续的。。有没有一个简单的方法或技巧来做到这一点?我想我需要一种类似球形噪音的东西,这样无论在水平方向还是垂直方向,它都能环绕。我也会很高兴只有一个包装轴,但两个更好 现在我使用的是经典的算法,你可以设置你要加多少个八度,哪些是用来在每个连续八度之间改变波的振幅和频率的乘法器 提前谢谢 将柏林噪声作为波形之和获得。波形通过插值随机值获得,高倍频程波形具有较小的比例因子,而插值随机值彼此更接近。为了实现这

我正在使用Perlin Noise进行高度贴图生成算法,我想让它环绕边缘,这样它就可以被看作是连续的。。有没有一个简单的方法或技巧来做到这一点?我想我需要一种类似球形噪音的东西,这样无论在水平方向还是垂直方向,它都能环绕。我也会很高兴只有一个包装轴,但两个更好

现在我使用的是经典的算法,你可以设置你要加多少个八度,哪些是用来在每个连续八度之间改变波的振幅和频率的乘法器


提前谢谢

将柏林噪声作为波形之和获得。波形通过插值随机值获得,高倍频程波形具有较小的比例因子,而插值随机值彼此更接近。为了实现这种环绕,您只需要以通常的环形方式围绕y轴和x轴进行适当的插值,即如果您的x轴跨度从x_min到x_max,并且最左侧的随机点(正在进行插值)位于x0,最右侧的随机点位于x1(x_min 这里使用线性插值对其中一个倍频程进行伪码。这假设一个256 x 256的矩阵,其中柏林噪声网格大小是两个像素的幂。。。只是为了让它可读。想象一下,例如大小==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
wrappable_perlin_倍频程(网格,大小):

对于(x=0;XY你没有试图建立周期性的雷击世界,是吗?:DOf当然我没有尝试这样做,尽管我知道有人会告诉它:)(然后它也是2D而不是3D)我发现这些信息同样有用:我认为这会受到“混乱”的影响这里描述的每个PelLin格子单元中间的工件:(第一个链接也描述了一个更好的解决方案。)上面的答案没有意义,因为第二个循环以
size
的步骤进行,然后每个步骤的模计算必须为零。因此,从未调用过主计算!