我正在尝试了解柏林噪声和程序生成。我正在阅读有关生成带有噪点的景观的在线教程,但我不明白作者关于制作高程区域的部分解释。
在这个网页的"岛屿"部分下有文字
设计一个与您想要的岛屿相匹配的形状。使用下部形状向上推地图,使用上部形状向下推地图。这些形状是从距离 d 到高程 0-1 的函数。集合 e = 下(d) + e * (上(d) - 下(d))。
我想这样做,但我不确定作者在谈论上下形状时是什么意思。
作者所说的"用下部形状向上推地图,用上层形状下推地图"是什么意思?
代码示例:
from __future__ import division
import numpy as np
import math
import noise
def __noise(noise_x, noise_y, octaves=1, persistence=0.5, lacunarity=2):
"""
Generates and returns a noise value.
:param noise_x: The noise value of x
:param noise_y: The noise value of y
:return: numpy.float32
"""
value = noise.pnoise2(noise_x, noise_y,
octaves, persistence, lacunarity)
return np.float32(value)
def __elevation_map():
elevation_map = np.zeros([900, 1600], np.float32)
for y in range(900):
for x in range(1600):
noise_x = x / 1600 - 0.5
noise_y = y / 900 - 0.5
# find distance from center of map
distance = math.sqrt((x - 800)**2 + (y - 450)**2)
distance = distance / 450
value = __noise(noise_x, noise_y, 8, 0.9, 2)
value = (1 + value - distance) / 2
elevation_map[y][x] = value
return elevation_map
作者的意思是,你应该描述一个点的最终高程,fe
,根据它与中心的距离,d
,以及初始高程,e
,大概是由噪声产生的。
因此,例如,如果您希望地图看起来像一个碗,但保持最初生成的地形的噪声特征,则可以使用以下函数:
def lower(d):
# the lower elevation is 0 no matter how near you are to the centre
return 0
def upper(d):
# the upper elevation varies quadratically with distance from the centre
return d ** 2
def modify(d, initial_e):
return lower(d) + initial_e * (upper(d) - lower(d))
特别要注意以"这是如何工作的?"开头的段落,我发现它很有启发性。