无法找到块加载噪声算法
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 度的部分。地形特征不会沿更有趣的各种方向分布。
我会这样做:
- 改用Python OpenSimplex。
- 手动实现八度求和,因为库中没有。
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 下发布这些代码片段)。
我正在研究基本的 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 度的部分。地形特征不会沿更有趣的各种方向分布。
我会这样做:
- 改用Python OpenSimplex。
- 手动实现八度求和,因为库中没有。
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 下发布这些代码片段)。