python - 如何使用 python 获得像地图一样的二维泰拉瑞亚
问题描述
我正在尝试获得像游戏泰拉瑞亚这样的自然景观。我使用元胞自动机为表面生成洞穴和 1d Perlin 噪声。结果是这样的:我的原型
但这对我来说并不令人满意,因为最初的目标是得到类似的东西: 我想要得到什么
我知道在第二种情况下,也使用了 Perlin 噪声,但我完全不知道如何实现这一点。有人可以建议我如何使用 Perlin 噪声实现第二种情况和/或提供有关此主题的适当链接吗?
解决方案
我会做什么:
对 2D 噪声使用 Simplex 而不是 Perlin。Simplex 避免了许多 Perlin 的可见网格对齐特性。您可以在这张图片中看到,顶部的 Perlin 非常遵循 45 度和 90 度方向。我创建/使用/推荐的噪音是
this,特别是(编辑:因为你使用 Python,你可以使用这个)Noise2_XBeforeY
函数,因为它旋转了三角形网格以试图看起来最适合 Terraria 风格的游戏。开始
abs(noise(frequency*x, frequency*y)) < threshold ? cave : leave_solid
。调整频率阈值,直到它们产生所需的大小/分布。通过使用分形噪声改善洞穴的形状和变化。
abs(noiseA(frequency*x, frequency*y) + noiseB(2*frequency*x, 2*frequency*y)*0.5 + ...) < threshold ? cave : leave_solid
与高度进行比较,以使洞穴随着您的上升而变小。将阈值替换为您在地下多远的某个函数,例如,
threshold = f(height(y) - y)
在哪里。请注意,您越深入地下(假设 Y 下降时为负数)如何变大,并保持增长但平稳地防止它超过 1。可能无法单独工作,因此您可能需要将其概括为. 选择最适合您目的的 thresholdMax 和 thresholdIncreaseRate 值。f(t) =
t / (t + 1)
height(y) - y
t / (t + 1)
f(t) = t / (t + 1)
f(t) = thresholdMax * t / (thresholdIncreaseRate * t + 1)
推荐阅读
- c++ - 计算总和为 x 的所有整数子集(包括负数)
- sql - 为几个表之一设计外键
- ruby-on-rails - 使用 Capistrano 部署时,在任何来源中都找不到 Gem
- swift - Xcode 故事板:标签的角半径 (macOS)
- javascript - 使用 Javascript 在 Chrome 中打开一个新的选项卡式窗口
- android - 绘制数据前的 Android 错误:Invalid Region.Op - 只允许 INTERSECT 和 DIFFERENCE
- python - Pandas DataFrames If else 条件包含破折号的多列
- javascript - 访问框架 DOM chrome 扩展
- wpf - WPF组合框排序,但最初没有选择条目?
- android - 为 DialogFragment 上的导航栏设置颜色