如何产生类似于Minecraft的洞穴?


34

我已经在3D程序世界中工作了一段时间,并且想开始添加洞穴系统。我目前正在使用2D / 3D Perlin Noise来生成地形,并结合使用Marching Cubes来实现更平滑的地形。当涉及到相互连通的山洞时,我感到很困惑。

我希望能得到更多类似于Minecraft的洞穴系统的东西。它们似乎是非常紧密的联系,几乎可以在任何方向随机分支,并且洞穴中的几乎任何点都将具有相当圆形的外观,并且整个半径范围都相等(不是最好的措词,但是不确定如何放置它) 。

生成我想要的洞穴的最大挑战是,我要动态生成世界。当前,世界是逐块生成的,从玩家所在的地方开始,然后从那里向外生成。我不想产生任何世界,然后使用游荡模式,细胞自动机等将洞穴挖出来。

是否有任何众所周知的算法可用于此目的?如果是这样,是否有人想分享他们如何做类似的事情?我将不胜感激任何帮助。

一个很好的例子: 在此处输入图片说明


5
在这里看看,然后向下滚动。
William Mariager 2012年

在过去的24个月中,有一本游戏开发者杂志对此进行了深入讨论,讨论如何去做您想做的事情。我会去他们的网站。
乔伊·格林

@JoeyGreen杂志的名字是什么?还是您有指向他们网站的链接?
jumpnett 2012年

1
它被称为游戏开发者杂志。gdmag.com。您可以订阅并获得过去10多年的杂志pdf版本。如果您注册,则可以搜索以前的问题并找到所需的问题。
乔伊·格林

Answers:


30

Minecraft的洞穴是通过“ Perlin蠕虫”方法生成的。发电机蜿蜒穿过地形并在隧道中塌陷。Minecraft 不会使用3d perlin噪声生成洞穴,因为它会在地形中留下未连接的口袋。自从非常早的Alpha版本以来,Minecraft洞穴就没有通过3d Perlin噪声生成。

这是通过“ perlin蠕虫”方法在Gnomescroll中产生的洞穴。

Gnomescroll洞穴系统第一人称视角1

Gnomescroll洞穴系统第一人称视角2

侏儒洞穴系统第三人称视角2

这些是libnoise教程中的libnoise“ Perlin Worms”。该技术紧密复制了Minecraft中产生的洞穴。

Linoise教程Perlin蠕虫

蛇行参数会影响洞穴系统的质量,并确定洞穴的垂直程度以及改变方向的速度。我的世界分支中的洞穴和洞穴隧道的半径随洞穴的长度而变化。

Minecraft会逐块生成洞穴。尽管服务器改装者很感兴趣,但所需的方法很复杂,而且还没有人对Minecraft的洞穴生成器进行完全反向工程。

随着无限图的生成并向外扩展,最可能的方法是逐块生成蛇洞。当前块上的洞穴是某个N上最接近的N个块上的洞穴种子的函数。使用随机数生成器(该函数是块坐标对种子进行播种的函数),可以计算当前块上的洞穴。无限贴图,而仅评估有限块半径内的块。


3
您可以添加一些信息或资源来了解有关“ Perlin蠕虫”的知识吗?
David Gouveia

1
这是有关“ perlin蠕虫”的教程libnoise.sourceforge.net/examples/worms/index.html
HaltingState

没必要,但是如果您能详细介绍最后一段,我将不胜感激。要生成蠕虫,我假设您需要每个蠕虫的起点,该起点必须在任何玩家的N个块内,其中N是蠕虫的最大长度。
Mythics

3
究竟。每个蠕虫都有一个起点,如果它徘徊在一定的块半径之外,则会终止。有一个随机数生成器,它确定性地生成伪随机数序列,该序列是块坐标的函数。这些随机数确定该节点中的蠕虫起源和数量。蠕虫也可以分支。如果蠕虫更“本地”并且不能冒险超过小块半径,则可以减少计算负担。
HaltingState

也许不是我想听到的,而是我所期望的。再次感谢HaltingState。:)
神话

7

我会在地形坚实的区域内生成点云-您可以尝试不同的密度。然后,我将使用最小生成树之类的算法来连接所有点-这将确保每个区域都是可到达的。然后简单地在节点之间绘制大的空心区域(由空气组成)(即,粗体素线)。


我可能只是不完全理解您的意思,但是随着世界的发展,我将如何一步一步地做到这一点?
神话

一种可能的方法是分别在每个块中生成最小生成树,然后通过查找两个块之间最接近的两个节点来连接每个块。用默认的地形算法填充块后,可以将其挖空到最小生成树周围。
Gavan Woolery

1
另一个(更简单的)解决方案虽然效率较低并且可能“更嘈杂”,但它使用布朗运动来开辟一条路径(有点像蚂蚁在周围随机挖掘)。
Gavan Woolery 2012年


1

使用噪声函数为每个块分配值,以确定是否有隧道,然后使用它们来确定在哪里放置洞穴。如果要使用隧道,只需使用更多噪声函数(带有不同的种子),然后使用它们的值确定是否存在隧道。之后,使用普通的“绘图”功能创建隧道。为了使一切更真实,请使用更多噪声对所述洞穴/隧道的原点进行随机位移。

如果您不想使用多个噪声函数,则可以在更大的距离上进行探测-例如,而不是对(2,2,2)处的块执行noise3d(2,2,2),而不要对noise3d(2,2, 16),将(2,2,16)用作一个值,将(2,2,17)用作第二个值,依此类推...然后只需相应地调整频率,以使所有值独立或在小范围内相关。

要改变整个世界的洞穴密度,请使用另一个会影响所述值的低频函数。

如果这导致了混乱的洞穴,只需增加所述互连点的距离或以其他方式调整算法。

我不确定Minecraft是否会像这样进行洞穴探险(尽管我认为确实如此),但是这种解决方案应该会产生令人满意的结果。


-5

这是

尽管大多数洞穴(例如上述洞穴)都使用Perlin蠕虫,但有些人还是希望手动进行。这样,他们就可以按照自己希望的方式逐块进行。使用Perlin蠕虫制作的洞穴可能不准确,可能只会使洞穴高5英尺,宽6英尺,这可能是不准确的,因为您可能希望它高10英尺,宽15英尺。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.