【项目记录】过程内容生成(PCG)与快速泊松碟采样算法实现Unity中的物件摆放 | 您所在的位置:网站首页 › pcg是什么币 › 【项目记录】过程内容生成(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密不可分。 |
CopyRight 2018-2019 实验室设备网 版权所有 |