问题描述
我正在尝试获得自然景观,例如Terraria游戏。我使用元胞自动机生成洞穴和表面的1d Perlin噪声。结果是这样的:my prototype
但这对我来说并不令人满意,因为最初的目标是获得类似的东西: what i want to get
我知道在第二种情况下,也会使用Perlin噪声,但是我完全不知道如何精确实现这一点。有人可以建议我如何用Perlin噪声实现第二种情况,和/或在此主题上给出适当的链接吗?
解决方法
我会做什么:
-
对您的2D噪波使用Simplex而不是Perlin。 Simplex避免了Perlin的许多可见网格对齐特征。您可以在this image中看到,顶部的Perlin遵循45度和90度方向。我创建/使用/推荐的噪音应该是
this,尤其是(编辑:由于您使用的是Python,因此可以使用this)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)
,其中f(t) =
类似于t / (t + 1)
。请注意,height(y) - y
是如何随着您位于地下的距离变大而变大的(假设Y值在您下降时变为负数),以及t / (t + 1)
preserves the increasingness but smoothly prevents it from exceeding 1。f(t) = t / (t + 1)
可能无法单独工作,因此您可能需要像f(t) = thresholdMax * t / (thresholdIncreaseRate * t + 1)
一样将其推广。选择最适合您目的的thresholdMax和thresholdIncreaseRate值。