项目记录过程内容生成(PCG)与快速泊松碟采样算法实现Unity中的物件摆放
Posted Mmy8671
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目记录过程内容生成(PCG)与快速泊松碟采样算法实现Unity中的物件摆放相关的知识,希望对你有一定的参考价值。
背景
在当今游戏开发过程中,创建一个内容丰富的虚拟世界一直是一个十分费时的工作。游戏制作者们希望在更短的时间内在游戏中增加更加多样的内容,过程内容生成技术为有限时间内制作复杂的虚拟世界提供了一种解决方案。
过程内容生成
Procedural Content Generation(PCG),也可以翻译为程序内容生成,主要指的是通过算法并输入参数来自动生成游戏内容,包括地形、地图、关卡、故事、对话、任务、角色等等。广泛意义上的PCG不仅限于游戏行业,如在动画领域皮克斯使用RenderMan动画工具通过算法来定义纹理和材质。
这里就不得不提及Minecraft这款优秀的游戏。游戏中通过算法生成了整个游戏世界,包括平原、森林、山丘、湖泊、河流、洞穴、海洋、村庄、地牢等。
Houdini则是另一个常被提及的过程生成工具。
快速泊松碟采样算法
Fast Poisson Disk Sampling,算法用于在空间内生成整体具有规律、局部具有变化的点分布,特点是采样点之间密集分布而又能保持一定距离。核心思想是将空间网格化,每个格子中最多只存在一个采样点,从而快速进行采样点之间距离的检测(只需要检测是否与附近网格中的采样点存在距离冲突即可)。算法基本步骤如下:
- 采样半径为r,维度为n,则以r/√n为网格宽度划分网格,此时格子对角线长度为r。
- 随机选取一个点,并加入“活动列表”。
- 当“活动列表”不为空时,从活动列表中随机选择一个点,并从以该点为圆心,半径r到2r的圆环范围内随机选取一个新的采样点。如果该采样点满足距离要求,则将其加入“活动列表”,并重复该步骤;如果采样点不满足距离要求,最多重复选择k次,全部不满足则将该选择点移出“活动列表”。
这里在Unity中做了一个简单的过程演示(网格是均匀分割的,转成gif压缩后比较糊导致少了几条线):
物件摆放
以快速泊松碟采样算法为基础并进行了一定的扩展,通过在二维平面进行采样并使用射线检测将其映射至三维空间,实现了在Unity中自动摆放多类物体。物体可以正确摆放在了崎岖的地面上,同时不同物体可以具有不同的分布情况,且所有物体间保持合理的距离。
通过配置参数,可以达到各种不同的风格,并避开特定区域:
最后补一张简陋的邻近网格检测图(如下),因为原算法中网格宽度与检测半径之间的关系是确定的(检测半径为采样半径r,网格宽度为r/√n),所以可能产生距离冲突的格子也是确定的。但在扩展后这一关系变得不确定,需要额外判断要进行距离检测的格子。下图左为实际能产生距离冲突所覆盖的格子,图右为为了简化算法所真正采用的进行距离检测的格子。
一些其他的东西
项目中的物件摆放是基于已有地形的情况下来做的。除此之外,还可以通过高度图、密度图等同时生成地形与地形上的物体(如植被)。
写到地形生成,就让我想起了几年前做过的一个简陋的基于柏林噪音生成的体素地形(整个世界都是同一种地形,没有进行噪音的多级叠加或者进一步处理做出其他地形效果)。当时做这个自然是因为mc,毕竟曾经自己打算进入游戏行业也与mc密不可分。
附上快速泊松碟采样原文:https://www.cct.lsu.edu/~fharhad/ganbatte/siggraph2007/CD2/content/sketches/0250.pdf
读书笔记 PCG in Games 程序化内容生成 介绍
总起
最近入手一本神书——《人工智能与游戏》,它介绍了AI与游戏相辅相成的关系,并且梳理了整个游戏AI的知识脉络。它可以当成游戏AI目录书籍,薄薄的一本书引用了800多篇文献。
游戏中我们接触到的AI可能更多的是寻路算法(Navigation),而这个话题在这本书中属于玩游戏 -> AI可以怎样地玩游戏 -> 基于规划的方法 -> 传统的树搜索。不过介于市面上已经有很多关于寻路算法的书籍,如《游戏人工智能编程案例精粹》,所以它只是简单介绍了一下并没有展开说明。
接下来我通过这本书,了解到了一本在PCG(程序化内容生成)领域第一本教材书籍——《Procedural Content Generation in Games》。
本篇笔记主要目的是记录读书过程中的重点内容,方便以后查阅。本次内容来源于《PCG in Games》的第1章——PCG的介绍,辅助会参考《人工智能与游戏》的第4章——生成内容。
本人水平有限,如有错误的地方欢迎讨论和指正。
介绍
首先我们定义一下PCG:PCG是基于有限或间接的用户输入的游戏内容生成算法,换句话来说PCG可以自己创造内容,也可以和人类玩家或设计师共同创造。
第一个关键词“内容”,根据我们的定义内容主要包含:关卡、地图、游戏规则、纹理贴图、故事、物品、任务、音乐、武器、载具、角色等。而游戏引擎和NPC AI则不包含在其中。
另一个关键词“游戏”,游戏包含了主机游戏、电脑游戏、桌游、卡牌游戏、猜谜游戏等。
最后两个关键词“程序化”和“生成”,我们使用电脑程序和算法进行创造。
为了让我们讨论更加具体,我们来列举一下我们使用PCG想做的事情:
1. 为类《塞尔达传说游戏》生成一个关卡;
2. 在一个太空射击游戏中生成武器;
3. 生成一个完整的、可玩的、平衡的桌游;
4. 一个可以使用植物快速填满游戏世界的引擎中间件;
5. 在策略游戏中一个让玩家自定义地图生成的图形设计工具,并且对其平衡性和乐趣进行评估。
我们不考虑做以下事情:
1. 一个可以让用户自由添加、删除物件的地图编辑器;
2. 桌游的AI玩家;
3. 一个可以自动生成植被的引擎(这边我的理解是地形自带的功能,而非使用空间算法之类进行生成)。
使用PCG的原因
1. 人类即是昂贵的又是迟缓的,使用PCG可以节约成本;
2. 让美术和策划从无聊的重复中解放出来,专注于必要的细节;
3. PCG方法能够实现全新的游戏类型;
4. 通过测量及使用神经网络对玩家进行建模,可以创建自适应玩家的游戏;
5. 使设计师更能理解设计并具有创造力,通过更好的PCG方法可以更好地理解设计过程,其反过来也能产生更好的PCG算法。
那些使用PCG的游戏
早期的《Elite》、《Rogue》等游戏使用PCG是为了克服存储容量的限制。Roguelike游戏可以自动生成复杂的游戏过程,但它们往往缺乏视觉吸引力。
PCG很快在商业化的游戏中受到越来越多的关注:
1. 《暗黑破坏神》,PCG用于生成地图、道具和怪物;
2. 《孢子》,程序化动画,玩家创建的生物用填充整个星系;
3. 《文明4》,随机地图;
4. 《我的世界》,生成整个世界和内容;
5. 《洞穴探险》,2D平台roguelike游戏;
6. 《翼飞冲天》,2D手游,生成地形和纹理。
(除了最后一个游戏,我基本都玩过。我们可以看到这些游戏使用PCG主要目的是生成关卡和地形,这是在PCG领域最重要的一个方向,当然最近几年其他方向也开始慢慢的受到重视)
PCG的愿景
PCG技术应用于发行的游戏中已经有30多年,而近几年该技术在学术界的关注迎来激增,结果产生了很多新的方法,以及跟旧方法改进和组合,其中有些方法在真正用于游戏之前还需要进一步研究和开发。
我们需要一些愿景来指明方向:
1. 基于PCG内容生成器,根据规定的游戏引擎和规则,能够产生高质量、自恰的游戏内容;
2. 基于PCG游戏设计,PCG作为gameplay的一部分,如果你将PCG生成的内容移除,那么游戏中将不具有任何的可辨识的游戏内容;
3. 生成一个完整的游戏,但现阶段我们只能生成一些简单的游戏规则。
在开发生成器时我们定义一个更具体的愿景是非常值得的。
评估PCG方案
我们可以将PCG方法作为一种解决内容生成问题时的方案,针对不同的应用不同的方案有其所权衡点,比如速度和质量、多样的和可靠的。
几种评估PCG方案的属性:
1. 速度,主要依赖于是gameplay实时生成还是开发阶段进行生成;
2. 可靠性,生成内容可能需要满足某种条件;
3. 可控的,设计师或算法可以具体指定生成哪些内容;
4. 多样性的,从极端角度考虑生成的内容是固定的还是随机的;
5. 创造性和可信度,使内容看上去像是人类创造的。
PCG的分类标准
1. 动态生成和离线生成,动态生成可以生成无尽的变化,而离线生成更适用于生成复杂的环境和地图;
2. 必要内容和可选内容,必要内容必须保证其正确性;
3. 可控性,使用随机种子或一组参数,在《我的世界》中使用相同的种子将会生成完全相同的世界;
4. 体验无关的和体验驱动的,在学术界体验驱动的受到了越来越大的关注,但大部分商业游戏仍然以一种通用的、与体验无关的方式来处理PCG;
5. 随机的和确定的,随机性允许一个算法提供极大的差异,另一方面完全确定的PCG方法可以被视为某种形式的数据压缩;
6. 构造性的和先生成再测试,分型和元胞自动机生成关卡是构造性的,并且只生成一次,而基于搜索方法的则需要先生成再测试,需要迭代多次直到内容足够优秀;
7. 自主生成的和混合主导的,生成过程中是否需要人类设计师或玩家参与。
PCG的象征意义
Khaled提出使用PCG的四种象征意义:
1. 工具,仅作为辅助设计师的一种工具;
2. 材料,成为设计师新的一种材料,一个流行的商业例子是SpeedTree;
3. 设计师,成为游戏设计师本身,现在属于勘探阶段;
4. 领域专家,提供额外的知识,用来评价和提升设计。
本书大纲
第二章,基于搜索方法的PCG,其中来源于达尔文进化论的进化算法是用于寻找合适的游戏内容。
第三章,讨论了一个创建地牢的roguelike游戏,以及2D空间下的导航。一些方法来源于开发者社区,并广泛应用于如《暗黑破坏神》等游戏。其他的,如元胞自动机,起源于物理学。最后,我们也会讨论一下马里奥AI框架用于测试关卡生成算法。
第四章,将介绍来源于计算机图形学的算法研究,即简单分型算法和其他噪声算法,用于处理地形、景观、纹理和云。这些算法快速并且可靠,但缺乏可控性。因此提出其他两种生成景观的方法:基于搜索方法的和基于代理集合的。
第五章,语法,首先介绍了一个创建植物的例子。近年来许多3A游戏使用语法创建植被,当然语法也可以用于创建关卡,本章剩余的部分将介绍使用语法来生成《塞尔达传说》风格的动作冒险游戏的关卡和任务,以及如何进化语法生成《超级马里奥兄弟》的关卡。
第六章,创建游戏规则,从桌游到卡牌游戏和街机游戏,这些尝试有些是构造性的,但大多数都是基于搜索的,本章还将会讨论电子游戏描述语言,一种编码简单街机游戏规则的方法。
第七章,生成游戏叙事,几乎所有方法都来源于规划算法,规划算法是一种来源于控制机器人的经典AI方法,本章还会讨论游戏叙事如何与地图生成相结合。
第八章,ASP(Answer Set Programming),答案集编程,在一种名为AnsProlog语言中指定内容生成方法和条件,求解器将生成满足指定条件的所有内容,用于猜谜游戏的关卡。
第九章,回到第二章基于搜索方法PCG的主题,本章示范了几种游戏内容表达形式的选择,表达形式很重要,因为其定义了搜索空间的形式及搜索的方式,本章将演示如何明智的选择表达形式以生成满足评估的内容。比如花被表示为神经网络,关卡生成器被表示为代理集合。
第十章,介绍经验驱动的PCG,对玩家进行建模。
第十一章,谈及PCG与人类设计师进行合作。
第十二章,讨论如何评价PCG生成内容的质量。
参考
《Procedural Content Generation in Games》
《人工智能与游戏》
以上是关于项目记录过程内容生成(PCG)与快速泊松碟采样算法实现Unity中的物件摆放的主要内容,如果未能解决你的问题,请参考以下文章
读书笔记 PCG in Games 程序化内容生成2 基于搜索的方法