如何生成蠕虫风格的地形?


48

我正在开发蠕虫风格的游戏,并希望以程序方式生成一些地形。以前,我已经使用Perlin噪声完成了很多地形生成,而这正是我在此游戏中开始使用的。唯一的问题是它太简单又无聊,给了我一些麻烦,但没有我想要的复杂性。我想拥有诸如洞穴和悬空山脉之类的功能,而且我不介意漂浮的岛屿之类的东西。这样的事情,甚至更疯狂也可以:

在此处输入图片说明

我想到先使用经典的Perlin噪波生成地形,然后才移除零件以创建洞穴,但并非如此,但是我很难指导移除这些零件。生成这样的地形还有其他选择吗?


红色代表洞穴还是仅仅是地形的一部分?
理查德·马斯克

这是地形的一部分。我只是谷歌那个形象,是最接近我想要完成的。如果“洞”部分在左侧的地形中继续延伸,则可能是右侧的小洞。
Xeon06

@Drackir,编辑了图像。
Xeon06

相关信息:gamedev.stackexchange.com/questions/6721/…(但不是重复的,因为它似乎专注于实现与生成算法)。
乔什

确实是@JoshPetrie。我对破坏很满意。这是我遇到麻烦的那一代。
Xeon06

Answers:


51

我建议您从2D Perlin噪声开始。像这样:

佩林噪声

然后在图像上应用阈值,以便获得几个孤立的岛,如下所示:

带阈值的珀林噪声

我选择了0.04的阈值,高于该阈值的所有内容都会变为蓝色。其余的保持黑色。然后在那之后,是时候确定要保留哪些“岛”和丢弃哪些“岛”了。

一种可能的方法是在不同的高度从左到右遍历图像,并以给定的概率选择相交的“岛”。在示例图片中,最低线的概率为100%,因此将选择它穿过的每个岛(填充为白色)。第二行的概率为50%,最上面的行的概率为10%。

标记完岛后,您可以通过应用形态学操作dilate)来缩小两者之间的差距

扩张的岛屿

并且有可能的景观。

噪声的“粒度”将确定您的世界中的细节将有多小。因此,最好对这些值进行试验。

同样,您的“选择线”位于何处以及以何种概率定位,结果将大不相同。如果您在图像顶部附近有一条线很可能“选择”一个岛,那么您可以构建某种洞穴景观,等等。


非常感谢您提供详尽而详尽的答案!这正是我要做的。
Xeon06

如此详细的细节,您会不会对这种Perlin噪音的产生有任何建议?我整个晚上都在努力,却一无所获。
Xeon06

@ Xeon06我只是使用flash提供Perlin噪波功能。参数24baseXbaseY,1个八度,我选择输出灰度噪声并禁用“分形”。您用什么语言来实现?
bummzack 2011年

我正在实现JavaScript。我一直在网上搜索一个好的实施方案,该方案将在一周内给出相似的结果,但找不到任何东西。
Xeon06


6

我先从Perlin噪音开始,仔细过滤。您将以问题所附图片中的类似内容结束,带有浮岛。中庸之道删除浮岛以后使用计数算法喜欢讨论的一样在这里


哦,我想我明白了。我需要使用2D珀林噪声,而不是1D。您能详细说明一下过滤吗?
Xeon06

2
我现在不能发布图片,但是我只是在谈论一个简单的阈值过滤器-la if(0.3> pixelValue> 0.5)KeepIt();。“仔细”位是关于正确获得0.3和0.5。您还可以使用线性(或不使用)渐变,从顶部的高alpha开始,逐渐在底部变为0,这样您就有了腾出空间的空间,并且地面大部分被填满了。希望能有所帮助。
Ravachol

@Ravachol如果您发布图片链接,则代表更多的人可以为您添加该图片。
理查德·马斯克

“ if(0.3> pixelValue> 0.5)”,我想这只是一个错字,但是在您的帖子中有矛盾的内容可能会令人困惑……您能编辑一下吗?
jcora 2011年

我似乎无法编辑评论。显然,请阅读“ if(0.3 <pixelValue <0.5)”。
Ravachol

4

我实际上是从bummzack出色的答案开始实施的。

这是我最终完成的步骤:

  1. 产生具有Perlin噪点的图像
  2. 在需要地形的地方充水
  3. 膨胀+侵蚀以去除过小的孔洞
  4. 删除地形内的其余背景区域
  5. 抗锯齿

这是结果的一个示例: 生成地形的示例

在这里写了一篇关于整个过程的详细文章,并且代码(JavaScript)是开源的,请检查一下是否可以使用;)

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.