Planet Coaster(过山车之星)-人群音频:Crowd Soundbox系统(PART 2)

游戏音频 / 声音设计

PLANET COASTER-人群音频:PART 2

crowd soundbox系统

在预生产期间,很显然使用“每个游客一个发声体”的解决方案在有数千游客时是不够有效的。这样的系统会导致CPU的工作随着越来越多的游客步入乐园而呈指数级增长

Blog2_Image_02.png

玩法以及管理人群的模拟代码面临着相似的问题。我们的程序员使用流体动力学模拟替代了路径查找,以便可以在任何时刻在屏幕上增加完全模拟的游客数量。如果您想了解更多,我们的主程序员欧文.麦卡锡(Owen Mc Carthy)就这一话题在这里为Gamastutra写了一篇文章。

在前期制作期间,Frontier的音频程序员和欧文紧密合作,保证我们的工作与他协调一致。这也使音频能够让“CPU工作量”与“游客数量”解耦。我们的做法并不是在每个人群成员身上放置一个发声体并通过列表过滤查看每个人的位置,而是让音频代码使用数据来完成这个步骤,该数据是欧文通过覆盖全乐园的人群网格提供的。

2.png

人群模拟网格的尺寸是固定的,并进一步细分为单元格。扫描所有单元格并找到游客的时间也是固定的。因为两个值都是固定的,工作量被分布在好几帧上,所以该系统的工作量是可以预计的,成本就是略微增加的滞后,但这是值得的。

3.png

对音频内容,我们使用了不同的人群录音和密度进行了各种实验。我们的目标是用细颗粒的元素来再现人群,而不是固定循环。音频设计师迈克尔.梅德门特(Michael Maidment)与代码人员丹.穆雷和琼恩.阿什比一起进行了多次测试,从他们的试验中我们决定,人群(围绕摄像机)可以用放在指南针四个方向上的四个发声体来表示。我们会加上第五个发声体来表示整个乐园中的人群。

此外,对我们来说性能质量比最高的选择是使用三种人群大小的音频素材(小,中,大),分为不同的人群组合类型(成年男/女,少年男/女,儿童)。我们本想把颗粒分的更细(细到个人,或者2-4人一组)但发现做得太细回报也没有高出很多。

Soundbox将以上做法都结合在了一起,并将音频内容绑定到发声体上。这个系统使用数据来决定在何处放置发声体,以及某一时刻在发声体上播放什么内容。

一个Soundbox的周期起始于收集分析相关信息的数据(如人群密度,大小,多样性,位置,以及行为)。当Soundbox理解了人群在乐园中分布的“形态”时,它就会创建发声体并在摄像机周围近似“正确”的位置放置发声体。

Soundbox通过数据来创造声音,而不是用传统方式从游戏对象上预置的发声体得到音频内容。这就意味着工作可以分配到多帧上,发声体可以集合起来,并且可以避免规模化上的缺陷。

Blog2_Image_05_ExtractingDataFromCrowdSimulation.png

人群模拟网格中提取数据人群模拟网格(黄色方块) 包含了游客位置的信息音频代码会提取游客密度,调试渲染会将这个信息显示为白色饼图。发声体(“Close 1”到“Close 4”)放置的位置就是人群平均密度的位置。“Far 1”是背景层,它会将整个网格考虑在内,而不只是摄像机周围的游客。

Crowd Soundbox围绕三个阶段不断迭代,将工作量分配到多帧上。提取和处理越详细,得到的结果听起来就越精确,但一个周期所花的时间也就越长。当我们寻找质量和更新速度间的平衡点时,用户控制的摄像机速度也会影响我们的设置。该周期循环会每帧更新发声体,与此同时,在同一段时间内它会提取并处理人群网格的1/30。一个完整的刷新在30fps下需要花一秒钟。

4.png

Soundbox在音频上解决了一些有趣的问题:

他提供了从可用数据中导出背景的框架。
它通过单接口应用了规则集,并且在需要的时候会动态变更这些规则。
音频代码不再根据游戏代码中的触发器(可能必须在之后进行过滤)来开播声音。
无论人群大小,它都能用更为可预测的方式来管理工作量。

  

使用数据来为虚拟音景提供信息

Crowd Soundbox情绪和大小

玩法和动画的目标之一就是创建出一个可解读的人群,玩家可以用他们来衡量自己乐园的成功程度,所以很自然地,音频团队希望能表达出这样的行为。当Soundbox放置发声体(并且理解人群的位置、大小和组成)时,它也需要知道他们的行为如何。我们把这些行为叫做“情绪”。

当我们最开始考虑情绪时,我们使用了细粒度的方式来做。我们想到了恶心、无聊、激动、拥挤、排队,以及更多的可能性。就像在为视觉效果添加音频时经常发生的那样,它可能会有不良的影响。一个无聊(抱怨)的人群是很让人烦的,实验也证明了这一点

我们决定不用情绪音频,而是这样区分:开心的人群会充满活力,而乐园中任何的问题会倾向于让人群安静下来,以此提示玩家去调查。拥挤和排队在过山车乐园中也是标准配置,我们也在参观乐园做调查时发现人们在排队的时候声音会比较大,这经常是因为他们离喧嚣的过山车很近。

5.png

我们选择不直接在音频中模拟情绪还有另一个原因。我们很少在网格-单元格中看到任何一种情绪的值超过60%(换句话说,一组游客不一定处在一样的情绪状态),所以我们无法找到一种确定的情绪来进行定义。我们可以创建很多不同的素材或者使用Blend Containers(混合容器),但觉得两种解决方案成本都比较高,而且收益不大。相反,我们使用了阈值,这样的话,如果40%的人在排队,我们就会把该发声体的音频切换到“排队”。

 

Blog2_Image_09_CrowdMoodSwitchInWwise.png

人群情绪Switch的设置。. 我们并没有为人群大小使用Blend Containers,而是使用每种情绪所需最小的人群大小变化,以便找到质量成本比的平衡点。Planco(由高级音频设计师詹姆斯.斯坦特创建的Planet Coaster语言)对人群循环添加变化。当摄像机接近游客时,同样的对话会用于更为详细的对话中。

使用数据为虚拟音景提供信息

Crowd Soundbox放置发声体

在确定了可以只用四个发声体加上第五个描述整个人群的发声体来精确地在摄像机周围表现人群后,我们开始致力于将发声体放置到正确的位置上。为了将发声体放在正确的位置上,Soundbox会使用基本方位点针对人群大小来计算出质心。该功能的公式是这样工作的:

 

6.png

使用结果数据,发声体就被放置在了正确的位置。当游客都汇集在摄像机左边时,发声体就会定位在左边。如果他们围绕摄像机分布均匀,发声体会定位在正上方。

使用数据为虚拟音景提供信息

Crowd Soundbox:计算Spread(散布)

将人群发声体放置在质心上——而不是放在整个人群的位置——不可避免会导致一些极端例子。比如,质心位于听者的左边,而人群围绕听者延伸到了右边。幸运的是,Wwise拥有使用Spread来完美应对这种情况的方式。不幸的是,Spread是固定于一个衰减曲线内的,所以在这里我们要乱改一句老话:“如果我们不能改变Spread,也许我们还能移山”。现在有请Soundbox出场,它来控制发声体放在哪儿!

首先为了获取Spread,代码会从摄像机看向质心,并开始找到最外围左右的边缘。随着它划圆弧并找到90%的人群,该圆弧就代表了人群的“分散”程度,并会将其翻译为一个好用的Spread值:

听者(蓝点)附近人群(灰圈)的俯视图:

 

7.png

Soundbox控制发声体位置(Soundbox中的发声体毕竟不绑定到“真实”世界的实体对象上),我们可以控制它们在世界中出现的位置。我们用该功能来将发声体相对摄像机拉近拉远,并模拟距离,以便从衰减曲线中获取一个Spread值。衰减曲线并不包含任何实际的音量或距离衰减,因为它只是为Spread提供信息

 

Blog2_Image_13_DunamicSpredInWwise.png

Wwise中的动态散布。改换衰减曲线的意图并控制发声体的位置来创建动态散布。一个RTPC会控制实际的衰减。

随着发声体远离摄像机,我们依然使用质心作为轴,所以它永远处在正确的3D位置。方向性是不会受到我们操作调整影响的;但是,为了得到正确的距离过滤,我们也会发送一个校正的“到听者距离”RTPC,它包含了人群“实际的”距离位置。

 

 

在下一篇博客中我们会探寻核心Soundbox系统中添加了什么额外的背景/前景层级。

 

过山车之星 (Planet Coaster)

过山车之星 (Planet Coaster)

音频团队 Planet Coaster是一个建造经营模拟游戏,由Frontier Developments为Microsoft Windows开发,可在Steam上使用。Planet Coaster于2016年11月17日全球发行。

评论

留下回复

您的电子邮件地址将不会被公布。

更多文章

《除夕:双鱼玉佩》(Immortal Legacy: The Jade Cipher)音频设计 – 第 2 部分

请阅读博客第 1 部分。

20.5.2019 - 作者:刘海宜

Igniter Live 简介

在 Dehumaniser 的基础上,Krotos 打造了一体化解决方案,以帮助用户设计自定义车辆音效。 今年早些时候,我们发布了基于 Igniter Technology 的 VST/AU/AAX...

18.11.2020 - 作者:MATTHEW COLLINGS

Waapi 批处理工具:CA_Waapi_Tools

引子 相信很多声音设计师在使用 Wwise设计软件进行音频整合的时候,会遇到一些重复性很强的工作,比如:大量的导入/替换样本,生成事件,设定 Switch...

23.12.2020 - 作者:楼哲文

赛博朋克世界的声景塑造 — 以游戏《底特律:成为人类》为例 (第一部分)

30.8.2021 - 作者:赵茉茉

利用 Wwise 设计基于循环的汽车发动机声音 | 第 2 部分

欢迎继续阅读本系列博文,了解如何在 Wwise 中配置和设计基于循环的汽车发动机声音。在第 1...

22.2.2022 - 作者:阿托•科伊维斯托 (Arto Koivisto)

如何解决手游音频开发面临的难题

本文将试着阐明我们在 Rovio 的同人如何使用 Wwise 及其他工具进行免费 (F2P) 手游音频开发,以及都采用了哪些策略来改进工作流程并提升工作效率。...

23.2.2023 - 作者:约翰•乌瑟 (Can Uzer)

更多文章

《除夕:双鱼玉佩》(Immortal Legacy: The Jade Cipher)音频设计 – 第 2 部分

请阅读博客第 1 部分。

Igniter Live 简介

在 Dehumaniser 的基础上,Krotos 打造了一体化解决方案,以帮助用户设计自定义车辆音效。 今年早些时候,我们发布了基于 Igniter Technology 的 VST/AU/AAX...

Waapi 批处理工具:CA_Waapi_Tools

引子 相信很多声音设计师在使用 Wwise设计软件进行音频整合的时候,会遇到一些重复性很强的工作,比如:大量的导入/替换样本,生成事件,设定 Switch...