无法找到块加载噪声算法

Trouble finding chunk loading noise algorithm

我正在研究基本的 2d 地形生成器,目前它使用 perlin-numpy 生成 1024x1024 'swatch' 的地形。 我感兴趣的是可以选择在我当前的地形上方生成另一个 'chunk'(如 Minecraft),它是不同的,但在我当前的地形上方平滑地适合。

长话短说: 我使用的噪声函数需要 generate_fractal_noise_2d((1024, 1024), octaves=6)
我希望能够做到 generate_fractal_noise_2d((1024, 1024), location=(<x coord of chunk (pixels)>, <y coord of chunk (pixels)>), octaves=6)

一般这对于噪声来说很容易,因为噪声是一个点评价函数。如果这个库提供了一个“offset”参数,它就可以工作,但它似乎没有。另外,您使用“Perlin”噪声库而不是(Open)Simplex 是否有原因? Perlin 是一个较旧的噪声函数,它会产生视觉上明显的网格偏差。 (Open)Simplex 在这方面可以明显更好。您可以在 this image 中看到顶部的 Perlin 有很多 45 度和 90 度的部分。地形特征不会沿更有趣的各种方向分布。

我会这样做:

class OpenSimplexFractal(object):

    def __init__(self, seed=0, octaves=6):
        self._instances = []
        for i in range(octaves):
            self._instances[i] = OpenSimplex(seed + i)
    
    def fractalNoise2(x, y, persistence=0.5, lacunarity=2, frequency=1, amplitude=1):
        value = 0
        for i in range(len(self._instances)):
            value += self._instances[i].noise2d(x * frequency, y * frequency) * amplitude
            amplitude *= persistence
            frequency *= lacunarity
        return value
  • 手动填充您的阵列。这是一个简单的循环,但如果你对 numpy 足够熟悉,你可以用它的语法来编写它。
    
    def arrayFractalNoise2(shape, offset, persistence=0.5, lacunarity=2, frequency=1, amplitude=1):
        noise = np.zeros(shape)
        for y in range(shape[0]):
            for x in range(shape[1]):
                noise[y+offset[1],x+offset[0]] = fractalNoise2(x, y, persistence, lacunarity, frequency, amplitude)
    return noise

在原点生成块时,你会做arrayFractalNoise2((1024, 1024), (0, 0), ...)。但是当在 X 中生成下一个块时,你会做 arrayFractalNoise2((1024, 1024), (1024, 0), ...) 和 so-on.

我的代码可能有错误,但我希望它能对您有所帮助。

(我特此在 CC0 下发布这些代码片段)。