背景

  在当今游戏开发过程中,创建一个内容丰富的虚拟世界一直是一个十分费时的工作。游戏制作者们希望在更短的时间内在游戏中增加更加多样的内容,过程内容生成技术为有限时间内制作复杂的虚拟世界提供了一种解决方案。

过程内容生成

  Procedural Content Generation(PCG),也可以翻译为程序内容生成,主要指的是通过算法并输入参数来自动生成游戏内容,包括地形、地图、关卡、故事、对话、任务、角色等等。广泛意义上的PCG不仅限于游戏行业,如在动画领域皮克斯使用RenderMan动画工具通过算法来定义纹理和材质。
  这里就不得不提及Minecraft这款优秀的游戏。游戏中通过算法生成了整个游戏世界,包括平原、森林、山丘、湖泊、河流、洞穴、海洋、村庄、地牢等。

Minecraft游戏截图(图源网络)  

  Houdini则是另一个常被提及的过程生成工具。

育碧分享了《孤岛惊魂5》中使用过程化工具生成自然环境(GDC 2018)  

快速泊松碟采样算法

  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)与快速泊松碟采样算法实现Unity中的物件摆放相关推荐

  1. 高效生成均匀分布的点:快速泊松碟采样算法实现(Fast Poisson Disc Sampling)

    快速泊松碟采样算法实现(Fast Poisson Disc Sampling) 前(fei)言(hua) 最近在看一些随机地图生成算法,涉及到生成Voronoi图,这需要提前在一个平面内随机生成一堆的 ...

  2. 读书笔记 PCG in Games 程序化内容生成 介绍

    总起 最近入手一本神书--<人工智能与游戏>,它介绍了AI与游戏相辅相成的关系,并且梳理了整个游戏AI的知识脉络.它可以当成游戏AI目录书籍,薄薄的一本书引用了800多篇文献. 游戏中我们 ...

  3. [项目过程中所遇到的各种问题记录]部署篇——项目部署过程中那些纠结的问题-SQLServer...

    前一篇文章说了些有关IIS的,这篇则是说SQLServer的,相比IIS来说,SQLServer的配置过程中问题就少了许多,而且都比较有针对性,下面开始记录: 注:由于实际项目的开发都是基于SQL20 ...

  4. 读书笔记 PCG in Games 程序化内容生成4 分型、噪声和代理,地形生成

    总起 本文主要基于Procedural Content Generation in Games第四章介绍地形生成,给游戏角色提供可以站立的地面. 关于PCG in Games之前的笔记可见: 第一章读 ...

  5. JAVA项目实训struts2_Java Web项目搭建过程记录(struts2)

    开发工具:eclipse 搭建环境:jdk1.7   tomcat 8.0 基础的java开发环境搭建过程不再赘述,下面从打开eclipse 之后的操作开始 第一步: 创建项目,File -> ...

  6. 读书笔记 PCG in Games 程序化内容生成3 构造性方法,针对地牢式关卡

    总起 本文主要基于Procedural Content Generation in Games第三章介绍构造性方法,他们的主要用途在于地牢和关卡,这些方法能在极短进行生成,并且不会进行评估或重新生成. ...

  7. 读书笔记 PCG in Games 程序化内容生成2 基于搜索的方法

    总起 本文主要基于Procedural Content Generation in Games第二章介绍PCG领域最重要的方法之一--搜索方法,而其中进化算法是我们主要使用的方法之一. 关于PCG i ...

  8. 苹果nfc功能怎么开启_苹果手机自带会议记录功能!一键开启这个按钮,快速记录重要内容...

    苹果手机自带会议记录功能!一键开启这个按钮,快速记录重要内容 大家身边都有使用苹果手机的朋友,选择它的原因大多都是因为手机系统的流畅性.还可以让我们在使用的过程中可以更安全的保护个人隐私数据.除了这些 ...

  9. AI:基于计算机视觉和语音识别案例项目打包过程记录20181226-19

    AI:基于计算机视觉和语音识别案例项目打包过程记录20181226-19 基于计算机视觉和语音识别案例项目打包过程 521 INFO: PyInstaller: 3.3.1 521 INFO: Pyt ...

最新文章

  1. python教程实例-Python实例教程
  2. spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava
  3. linux shell 脚本 supress,《linux Shell 脚本攻略》进阶学习(第一部分)
  4. 友情提示,你该找一份假期实习啦!
  5. 将 k8s 制作成 3D 射击游戏,好玩到停不下来 | 文末福利
  6. idea maven dependencies 总是报红
  7. 计算机网络3-DNS域名解析系统
  8. 使用spring-data-jpa实现简单的两表联查
  9. Flink :刷屏 forceKillApplication over null,Retrying immediately The Client is Stopped
  10. 问题 B: 编写函数:Swap (I) (Append Code)
  11. 揭秘:导致局域网网速变慢的五大真凶
  12. 12种JavaScript MVC框架之比较
  13. mac系统csv转ansi_迅捷文字转语音 for mac
  14. mysql主键和候选键有什么区别?
  15. 即将开幕!阿里云飞天技术峰会邀您一同探秘云原生最佳实践
  16. QUST程序设计赛F题:Bash博弈
  17. 计算机专业就业方向 【转】
  18. ABAP BDC个人使用见解
  19. EEG实验中Matlab打标方法及遇见问题
  20. 2016计蒜之道初赛第一场----A青云的服务器密钥【贪心】

热门文章

  1. Windows搭建Nodejs【全网最详细】
  2. php recordset,adodb.recordset PHP通过COM使用ADODB的简单例子 - ADOdb
  3. Swagger 学习笔记 | Swagger 简介 | Springfox 简介 | Springfox 2.9.2 常用注解 | Spring Boot 整合 Swagger2 案例
  4. CentOS 安装 Git
  5. 【Unity】用HDRI作为Unity的Skybox
  6. MATLAB医学三维重建可视化库
  7. vue中使用vue-video-player
  8. CSS换行 不换行 显示省略号
  9. vue使用vue-video-player实现视频播放:
  10. 跟华为P40学习如何做产品策略