需要 perline noise ursina 的帮助来打造一片平原

Need help in perline noise ursina to make an a plain land

我知道使用 perlin-noise 来制作带有立方体的图案,但我想要的是随机地形 平原,比如这个叫 muck 的游戏(已经被 unity 开发)

我试过:

noise = PerlinNoise(octaves=3, seed=2007)
amp = 3
freq = 24
width = 30


for po in range(width*width):
s = randint(200, 255)
q = Entity(model="cube", collider="box", texture="white_cube",
           color=color.rgb(s, s, s))
q.x = floor(po/width)
q.z = floor(po % width)
q.y = floor(noise([q.x/freq, q.z/freq]) * amp)

所以这将提供 - 几乎 - 完美的随机地形,但我希望我的地形看起来比立方体更真实 提前致谢 ;)

不出所料,您的景观看起来是立方体的,因为您是从立方体构建它的。所以为了让它更逼真,为它使用更灵活的Mesh。您必须分别分配表面的每个点并通过三角形将其连接到周围:

level_parent = Entity(model=Mesh(vertices=[], uvs=[]), color=color.white, texture='white_cube')

for x in range(1, width):
    for z in range(1, width):
        # add two triangles for each new point
        y00 = noise([x/freq, z/freq]) * amp
        y10 = noise([(x-1)/freq, z/freq]) * amp
        y11 = noise([(x-1)/freq, (z-1)/freq]) * amp
        y01 = noise([x/freq, (z-1)/freq]) * amp
        level_parent.model.vertices += (
            # first triangle
            (x, y00, z),
            (x-1, y10, z),
            (x-1, y11, z-1),
            # second triangle
            (x, y00, z),
            (x-1, y11, z-1),
            (x, y01, z-1)
        )

level_parent.model.generate()
level_parent.model.project_uvs() # for texture
level_parent.model.generate_normals() # for lighting
level_parent.collider = 'mesh' # for collision

但是,生成速度会很慢,主要是由于使用了 Perlin 噪声实现(我假设 this one). A faster option can be found in