首页 > 解决方案 > 如何使用 python 获得像地图一样的二维泰拉瑞亚

问题描述

我正在尝试获得像游戏泰拉瑞亚这样的自然景观。我使用元胞自动机为表面生成洞穴和 1d Perlin 噪声。结果是这样的:我的原型

但这对我来说并不令人满意,因为最初的目标是得到类似的东西: 我想要得到什么

我知道在第二种情况下,也使用了 Perlin 噪声,但我完全不知道如何实现这一点。有人可以建议我如何使用 Perlin 噪声实现第二种情况和/或提供有关此主题的适当链接吗?

标签: pythongame-developmentprocedural-generationperlin-noise

解决方案


我会做什么:

  1. 对 2D 噪声使用 Simplex 而不是 Perlin。Simplex 避免了许多 Perlin 的可见网格对齐特性。您可以在这张图片中看到,顶部的 Perlin 非常遵循 45 度和 90 度方向。我创建/使用/推荐的噪音是this,特别是Noise2_XBeforeY函数,因为它旋转了三角形网格以试图看起来最适合 Terraria 风格的游戏。(编辑:因为你使用 Python,你可以使用这个

  2. 开始abs(noise(frequency*x, frequency*y)) < threshold ? cave : leave_solid。调整频率阈值,直到它们产生所需的大小/分布。

  3. 通过使用分形噪声改善洞穴的形状和变化。abs(noiseA(frequency*x, frequency*y) + noiseB(2*frequency*x, 2*frequency*y)*0.5 + ...) < threshold ? cave : leave_solid

  4. 与高度进行比较,以使洞穴随着您的上升而变小。将阈值替换为您在地下多远的某个函数,例如,threshold = f(height(y) - y)在哪里。请注意,您越深入地下(假设 Y 下降时为负数)如何变大,并保持增长但平稳地防止它超过 1。可能无法单独工作,因此您可能需要将其概括为. 选择最适合您目的的 thresholdMax 和 thresholdIncreaseRate 值。f(t) = t / (t + 1)height(y) - yt / (t + 1) f(t) = t / (t + 1)f(t) = thresholdMax * t / (thresholdIncreaseRate * t + 1)


推荐阅读