Perlin噪音,程序内容生成和有趣的空间

可能在过程内容生成领域发生的最糟糕的事情(假设这确实是过程内容生成领域,我不确定),这是Perlin的声音。 Perlin的噪音非常适合(至少如果您看起来不太近的话)产生有趣的风景。 在subreddit / r /过程生成中,如果没有人发布“过程生成系统”,结果证明佩林的噪声以不同的颜色可视化,那么一周就不会过去。 (在撰写本文期间,出现了两个这样的帖子!)


我不想羞辱Perlin的声音。 这对于生成过程非常有用,它已成为包括我在内的许多人进入该领域的切入点。 但是同时,这也很令人困惑,因为它意味着程序生成比实际要简单得多。 当他们的作者发现下一步程序生成要复杂得多时, / r /程序生成中有关“程序生成系统”的大多数每周帖子都消失了。 事实是,佩林的喧闹声是一种快乐的巧合。 这非常适合生成有趣的景观,但是没有系统或可重复的原因。

迈克·库克(Mike Cook)最近发表了一篇教程 ,将可能性空间与世代空间进行了对比。 如果您创建一个生成系统来创建X,则可能性空间等于所有可能的X,并且生成空间就是系统实际可以生成的所有X。 Mike通过Minecraft阐述了这个想法:


在《 Dragons Abound》游戏中,可能性空间包括所有可能的地图,包括许多退化的情况,例如,一张完全由海洋和一个小岛组成的地图。 生成空间是Dragons Abound实际可以生成的所有卡中较小的空间。 由于使用了各种规则,因此《 无尽的巨龙》无法从带有小岛的海洋生成地图,因此该地图不在游戏生成空间中。 比较可能性空间和生成空间是过程生成的有趣且有用的外观,因此我建议您阅读Mike的文章 ,该文章更详细地解释了这种想法,并且有几个交互示例。

除了可能性空间和世代空间之外,想到“有趣的空间”也很有用。 如果我们创建X,那么这就是所有有趣的 X的空间。也就是说,在我的游戏中,这就是所有有趣的幻想卡的空间。 有趣的空间是可能性空间的子集,我们希望与生成空间相交-例如,我希望至少我的游戏生成的某些纸牌会变得有趣。

在继续之前,我很容易承认“兴趣”是一个模糊而主观的概念。 我和您关于有趣事物的想法很可能不一致。 我什至不总是知道什么对我来说很有趣-经常我看到一些新东西并发现它很有趣,尽管直到我看到它才认为自己不喜欢它。 更糟糕的是,我们看到的越有趣,就会变得越不有趣。 当您连续看到20张卡片上的有趣功能时,它似乎就不再有趣了。 因此,“兴趣”并不是那么容易掌握。 将来,我将更多地讨论什么使事情变得有趣(并且在过去,我有话要说关于创造空间的想法),但是到目前为止,这并不是很重要。 我们足以同意,有些事物比其他事物更有趣,并且更有趣的事物在“有趣的空间”中,而不太有趣的事物则不是。

是否有可能像迈克展示可能性空间和世代空间一样,来说明一个有趣的空间? 如上所述,一个有趣的空间是可能性空间的子集,这些空间(如果您很幸运)与生成空间相交:


一个好的生成器与一个有趣的空间强烈相交。 不良的发电机是弱小的。

这些模式只是一个隐喻,但是在这个隐喻的框架内,我想问一个问题:我是否正确指出了不同空间的形状 ? 可能性空间的形状并不是很重要,它只需要包含其他两个空间即可。 但是,生成空间和有趣空间的形式是更有趣的问题。 我在可能的范围内将它们都绘制为单一的紧凑形式。 这合理吗?

我相信,将生成空间指定为紧凑的椭圆形对于许多程序生成器是一个不错的选择,尤其是对于像Perlin噪声这样的东西。 这种形式意味着生成器在一个清晰定义的紧凑空间内创建所有解决方案。 如果生成器可以创建X,则它通常可以创建X的所有邻居。通常,生成空间中没有大的“空洞”或奇怪的变形。

生成空间通常看起来像这样,有两个原因。 首先,在实际应用的水平上,生成器是少量与可能空间相关的代码。 当前, Dragons Abound包含约28万行源代码。 与许多其他程序卡生成器相比,这是很多(也许甚至是记录),但是与所有幻想卡的可能性空间相比,它仍然非常小。 因此,无论游戏代码多么聪明,它的生成空间将仅占据可能性空间的一小部分,并且由于计算机代码从定义上讲是算法和确定性的,因此该空间将相对紧凑。 也就是说,如果游戏可以创建一种类型的卡,则几乎可以肯定会创建许多其他类似的卡。

发电空间紧凑的第二个原因是战略性的。 对我而言,创建《 龙腾飞腾》的目的是生成有趣的地图,以使它们尽可能与有趣的空间相交。 而且很难进入有趣的空间,与可能性空间相比,空间很小。 实际上,它很小。 所有这些空间都有大量的尺寸,并且空间的大小实际上随尺寸数量的增加而增长。 有趣空间与可能性空间之间的真实关系如下所示:


只有一个有趣的空间要小得多。 这迫使程序生成必须遵循某些策略。 例如,为什么游戏不创建完全随机的地图? 然后,生成空间将如下所示:


只有绿色的点要小得多。 从一张随机纸牌进入一个很小的有趣空间的机会基本上为零。 为了增加进入有趣空间的机会,过程生成器的创建者使用有关可能性空间和有趣空间的知识来控制生成-创建者移动生成空间,使其主要位于有趣空间的附近,而不仅仅是随机分布。

由于所有这些原因,将发电空间视为一个相连的紧凑区域将是合乎逻辑的。

但是我相信,绘制这样一个有趣的空间可能是完全错误的。 应该将其描述为分散的,分散的奇怪形状的区域。 怎么了 因为(1)由于各种正交原因,事物可能变得有趣,并且(2)兴趣是不连续的函数。

例如,考虑以下两个地图片段:



第一个片段很有趣,因为海岸线错综复杂,包含许多小岛。 第二部分的海岸线无聊而平坦,但是海岸却具有有趣的特征-它无人居住,名字叫“荒凉的海岸”。 从某种意义上说,这两个片段都很有趣,但是出于完全不同的原因。 因此,我们不会期望有趣空间的这两部分成为邻居。

而且,有趣空间的这两部分很可能甚至没有连接。 绝不可能将第一张有趣的地图逐步转换为第二张有趣的地图,而不会在此过程中创建一些无趣的地图。 因此,有趣空间的这两部分是分开的。

因此,一个有趣的空间不是单个区域,而是一组划分的区域。 每个这样有趣的空间是否都具有光滑紧凑的形状?

我再说一遍,我没有声明我可以给出“兴趣”的完整定义。 但是在某些方面,我们可以在几点上达成共识。 首先,如果X是有趣的,那么这并不意味着2X将是有趣的两倍。 以“悲伤的海岸”为例-地图上神秘海岸的一个区域很有趣,但其中有十几个区域将非常有趣。 您可能还会想出其他示例,说明“兴趣”如何以一种奇怪且违反直觉的方式表现。 因此,兴趣具有不连续性的某些元素-它不是一个平滑的函数,它在可能性空间中移动时会以合理且可预测的方式发生变化。

所有这些使我们理解,我们应该将一个有趣的空间指定为一系列形状奇异的分割区域。


您已经开始理解为什么创建一个好的过程生成器是一项艰巨的任务。 由于算法的工作方式和我们功能的局限性,生成空间将很小且紧凑。 同时,我们希望进入有趣的空间中尽可能多的奇特和分散区域。 我们甚至设法加入其中,真是太神奇了!

现在让我回到Perlin噪声的话题。 对于景观空间中的Perlin噪声生成空间,该方案会是什么样? 我认为是这样的:


Perlin的噪声生成器与所有可能景观的宇宙内的特定有趣空间有更多的交集。 这非常好-几乎可以使用Perlin噪声创建的所有内容都可以进入该区域,并且看起来非常有趣。

但是这种快速的成功是令人误解的。 如果您不熟悉程序生成,您将看到Perlin噪声如何很好地工作,并且很可能会确定Perlin噪声是生成各种有趣场景的魔杖,更不用说所有类型的程序生成了。 但是,如图所示,Perlin的噪声生成空间实际上与有趣的景观空间的许多其他部分相去甚远。 程序性景观生成的第二步标准是增加河流。 但是,如果您尝试借助Perlin噪声实现河流,您将发现这是不可能的! 绝对不能扩大Perlin噪声生成空间的边界,以到达包含现实河流的遥远有趣空间。

珀林的声音从另一种意义上是误导性的。 之前,我谈到了这样一个事实,有趣的空间很小,如果您想进入它,就需要对可能性空间和有趣的空间有一定的了解,以便控制程序的生成。 但是Perlin的噪声算法对景观,地质过程,人们发现的有趣事物一无所知,但是,如果没有这些知识,它就可以很好地工作! 事实证明,Perlin的噪音是例外,确认了规则(*)。 但是,如果您不熟悉程序生成,那么您很可能不知道该规则。 实际上,您正在推论出错误的规则-整个过程的整体生成应该 Perlin噪声一样工作。

(*他并非只是“偶然地”成为例外。Perlin噪声之所以成为流行的起点恰恰是因为它是一个例外。从Perlin噪声入手非常容易,而无需研究大量有关景观的信息。)

考虑一下过程内容生成中另一个流行的起点:地下城计划。 与生成景观不同,地牢方案没有类似于Perlin噪声的算法,该算法在一个有趣的空间神奇地创建了解决方案。 根据我们对世代空间和有趣空间的了解,我们可以猜到地下城生成器应该(1)包括有关晚年和有趣程度的特定知识,或者(2)创建大多数不感兴趣的地下城。 的确,如果您查看过去一年在/ r /过程生成中发布的地牢生成器,您会发现除了检查所有房间的连接之外,它们大多数都不包含有关地牢的知识,因此,这些项目显示的数据很可能是随机的,而不是有趣的。


因此,如果您认为您或多或少同意我的著作,那么可以从这种有趣的空间概念中学到什么教训?

  • 程序生成从根本上来说很复杂,因为有趣的空间很小,很难达到目标。
  • 尽管偶尔会出现Perlin噪声等异常情况,但不应指望简单,幼稚的算法会成功生成有趣的内容。 良好的程序生成应包括并使用对主题领域的广泛而深入的知识,以及对使内容有趣的原因的理解。
  • 但是,即使在最佳生成算法中,生成空间也很紧凑,并且有趣的空间也不是,因此,预计过程生成经常会丢失,因此有必要相应地构建系统。
  • 在复杂的主题区域中,有趣的空间被划分并且具有奇怪的形状。 您不应期望在一个有趣的空间的一部分中能很好地工作的算法或方法在另一部分中也能同样好地工作。 因此,我们应该期望过程生成将包括使用有趣空间的不同部分的许多不同算法。

如果您刚刚开始使用过程生成,那么我建议您考虑一下乐趣。 什么会使输出变得有趣? 为了产生经常有趣的数据,算法需要了解什么? 还有什么其他方法可以输出数据呢? 我需要哪种新算法来产生这种兴趣? 如何与第一个算法结合/平衡?

例如,如果我想创建一个地下城生成器,那么我考虑了一段时间,并认为在以下情况下,地下城很有趣:

  1. 他们看起来像是被创造出来成为仓库,监狱牢房
    和大城堡的其他地下基础设施
  2. 后来他们充满了怪物,并由他们重建以满足住房,食物,水,免受攻击等的需求。

现在,您可以考虑地下仓库的高度应该如何,用于此主题的变体的程序生成算法的外观,以及怪物如何改变这种方案。 我相信,考虑到此类问题,您将比使用Perlin噪声上的其他景观生成器或随机房间和走廊中的地牢生成器实现更多有关程序生成的知识。

Source: https://habr.com/ru/post/zh-CN440286/


All Articles