我正在使用 Perlin Noise 进行高度图生成算法,我想让它环绕边缘,这样它就可以被看作是连续的。有没有简单的方法或技巧可以做到这一点?我想我需要类似球形噪声的东西,以便水平和垂直环绕。我也很高兴只有 1 个环绕轴,但两个会更好。
现在我使用的是经典算法,您可以在其中设置要添加的 Octave 音阶数,以及用于在每个连续 Octave 音阶之间改变波的振幅和频率的乘数。
提前致谢!
最佳答案
柏林噪声是作为波形的总和获得的。波形是通过内插随机值获得的,较高倍频程的波形具有较小的比例因子,而内插随机值彼此更接近。为了使它环绕,您只需要以通常的环形方式在 y 轴和 x 轴周围正确插值,即如果您的 X 轴从 x_min 跨越到 x_max,并且最左边的随机点(正在插值)是在 x0 处和最右边的 x1 处(x_min < x0 < x1 < x_max),从 x1 到 x0(环绕边缘)插值得到 x1 右边和 x0 左边的插值像素值。
这里是使用线性插值的 Octave 之一的伪代码。这假设一个 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
关于algorithm - 包装 2D 柏林噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587846/