我正在使用 Perlin Noise 进行高度图生成算法,我想让它环绕边缘,以便它可以被视为连续的.. 有没有简单的方法或技巧可以做到这一点?我想我需要像球形噪声这样的东西,以便它在水平和垂直方向上环绕。我也会很高兴只有 1 个包裹轴,但两个会更好。
现在我使用的是经典算法,您可以在其中设置要添加多少个八度音阶,以及用于改变每个连续八度音阶之间波的幅度和频率的乘数。
提前致谢!
我正在使用 Perlin Noise 进行高度图生成算法,我想让它环绕边缘,以便它可以被视为连续的.. 有没有简单的方法或技巧可以做到这一点?我想我需要像球形噪声这样的东西,以便它在水平和垂直方向上环绕。我也会很高兴只有 1 个包裹轴,但两个会更好。
现在我使用的是经典算法,您可以在其中设置要添加多少个八度音阶,以及用于改变每个连续八度音阶之间波的幅度和频率的乘数。
提前致谢!
Perlin 噪声作为波形的总和获得。波形是通过插值随机值获得的,倍频程越高的波形比例因子越小,插值后的随机值越接近。要进行此环绕,您只需要以通常的环形方式在 y 轴和 x 轴周围正确插值,即如果您的 X 轴从 x_min 跨越到 x_max,并且最左边的随机点(正在插值)是在 x0 和最右边的 x1 (x_min < x0 < x1 < x_max) 处,通过从 x1 到 x0 的插值(环绕边缘)获得从 x0 到 x1 右边和左边的插值像素的值。
这里使用线性插值的八度音阶之一的伪代码。这假设一个 256 x 256 矩阵,其中 Perlin 噪声网格大小是两个像素的幂......只是为了使其可读。想象一下,例如 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