块加载噪声算法的故障查找

2024-05-19 13:26:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个基本的2d地形生成器,目前它使用perlin-numpy生成了一个1024x1024“样例”地形。 我感兴趣的是在我的当前地形上生成另一个不同的“块”(如Minecraft),但在我的当前地形上平滑地匹配

TL;博士: 我使用的noise函数采用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)


Tags: ofnumpygenerate感兴趣noise地形tlchunk
1条回答
网友
1楼 · 发布于 2024-05-19 13:26:05

一般来说,这对于噪声非常容易,因为噪声是一个点评估函数。如果这个库提供了一个“offset”参数,它就可以工作,但它似乎不工作。另外,您使用“柏林”噪声库而不是(开放式)单纯形有什么原因吗?Perlin是一个较老的噪声函数,它会产生明显的网格偏差。(开放式)Simplex可以在这方面做得更好。你可以在this image中看到顶部的柏林有很多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), ...)等操作

我可能在代码中犯了错误,但我希望它能有所帮助

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

相关问题 更多 >