Wwise 同时支持 2D 和 3D 声音。3D 声音模拟 3D 环境,可充分利用 5.1 环绕声扬声器设置。另外,玩家的位置被称为listener(听者),可以用于视听体验,让玩家沉浸在逼真的 3D 环境中。
3D 声音的定位信息分为两类:
3D 游戏定义的定位用相对于游戏中听者的位置和方位来定义传播和衰减属性。然而,3D 用户定义的定位可创建“预定义”音频体验,其中声音顺着预定义路径环绕扬声器传播,与游戏中听者的位置和方位无关。
|
Note: 本节讨论游戏对象层级的定位。有关听者定位的信息,请参阅 设置 Listener 的位置信息 。 |
要设置游戏对象的实际位置,必须为需要游戏定义型 3D 定位的每个游戏对象调用 AK::SoundEngine::SetPosition()
函数。每当游戏对象的位置改变时,您都需要设置位置。
使用 AK::SoundEngine::SetPosition()
方法来设置游戏对象位置:
AKRESULT AK::SoundEngine::SetPosition( AkGameObjectID in_GameObjectID, // Game object 的标识 const AkSoundPosition & in_Position // 想要设置的位置 );
第一个参数是游戏对象的 ID。请参阅 集成详情——游戏对象 了解详情。
第二个参数是 AkSoundPosition 结构,其中包含的向量代表游戏对象的位置和朝向。请参阅 X-Y-Z 坐标系统 了解 Wwise 声音引擎中 X、Y 和 Z 轴分别对应什么。
|
Note: 每个 3D 位置每帧最多可应用一次。这意味着,即使您在调用 AK::SoundEngine::RenderAudio() 函数前多次调用 AK::SoundEngine::SetPosition(),也仍将只考虑最后一个值。 |
|
Tip: 设置为 2D 或 3D 的声音——Wwise 中用户定义的声音不需要 3D 位置。如果对这样的声音设置了位置,则此位置会忽略掉。有些游戏对象永远都不会使用 3D 游戏定义的声音,要避免为这些游戏对象设置无用的 3D 位置,这样可以节省一些宝贵的 CPU 周期。 |
为了模仿游戏对象位置能自动跟随听者位置的行为,您需要在每一帧将游戏对象位置明确设置为和听者位置一样的数值,或者使用以下小技巧。
|
Tip: 模拟跟踪用户的另一种方式是使用 2D 或 3D 用户定义定位。由于此定位由声音设计师定义,并且不是在所有情况下都适用,因此您应该参阅 Wwise 文档了解详情。您也可以使用 RTPC 方便地在 2D 和 3D 定位间切换。 |
您可以使用方法 AK::SoundEngine::SetMultiplePositions()
为单个游戏对象设置多个 3D 位置,而不可使用方法 AK::SoundEngine::SetPosition()
,因为后者只可为单个游戏对象设置一个 3D 位置。
AKRESULT AK::SoundEngine::SetMultiplePositions( AkGameObjectID in_GameObjectID, ///< 游戏对象标识符。 const AkSoundPosition * in_pPositions, ///< 要应用的位置数组。 AkUInt16 in_NumPositions, ///< 所提供数组中指定的位置数。 MultiPositionType in_eMultiPositionType ///< \ref AK::SoundEngine::MultiPositionType ); );
|
Note: 每个游戏对象至少要有一个 3D 位置。 |
应仔细选择 MultiPositionType
。您选择的方法将取决于要创建的场景和效果类型。
MultiPositionType_MultiSources
方法,则会将各个声音的音量累加,以此来模拟多个对象同时发出同样的声音。此方法用处很多,在有多个对象发出同样声音的时候特别适用。然而,此方法在各个声音距离太近时可能会出问题。这个问题在于:因为多个声音完全同相播放,所以音量累加的时候容易出现削波失真。MultiPositionType_MultiDirections
方法,则各个扬声器中播放的音量是各个方向上的最大值。由于没有让音量相加,所以此方法比较省 CPU。此方法可用于模拟游戏中的许多场景,包括墙洞、面声源和多个对象同时发出同样的声音。然而,如果游戏玩家希望当若干发声对象距离很近时声音变响,则应使用 MultiPositionType_MultiSources 方法添加声音。MultiPositionType_SingleSource
不得结合 SetMultiplePositions()
一起使用,因为它只考虑一列位置中的第一个。通过为单个游戏对象创建多个位置,您可以模拟很多音效,包括:
- 面声源
您可以来模拟面声源,方法是选用 MultiPositionType_MultiDirections
,并设置合适的 Spread(散布)和基于距离的音量衰减值。在使用此方法时,需要位置增多的时候音量不会累加升高。通过使用这种方法重建面声源,您可以用一个声音获得从多个方向传来的、有逼真衰减的效果。
在下列中,黑点代表声音的初始位置,黑圆圈代表衰减的最小距离和散布,红圆圈代表最大衰减半径:
图:有多个位置的面声源示例
蓝色区域代表游戏中的湖泊。湖泊发出的环境声通过使用有四个位置的声音来模拟。
当听者位于 A 位置时,湖泊的声音应来自所有方向。这可以通过设置适当高的散布值来实现,高散布值可使声音散布,使它们在所有扬声器中播放。
当听者位于 B 位置时,听者超出了最大衰减距离。这意味着在最大衰减距离处,听者要么会听不到湖泊的声音,要么只能听到微弱的声音。由于您用了多个位置来模拟大湖,因此声音总是会从合适的方向传过来。
当听者位于 C 位置时,将从张角很大的扬声器(~180 度)中听到湖声,但听者到湖泊有一定距离,因此声音会发生衰减。在这种情况下,听者仍位于衰减半径内,因此湖声不会发生最大衰减。
使用这项技术,您可以通过重叠多个声音位置来重建任何类型的对象形状。然而请记住,每添加一个新位置,就需要更多的 CPU 来计算音量结果。
- 同一区域中多个对象发出同样的声音。
举例来说,在游戏的某一关中,走廊墙壁上布置了一系列的火炬,将走廊照得透亮。这些火炬完全一样,会播放完全相同的声音。如果您为各个火炬分别设置一个播放事件(假设有 20 个火炬),那么这将极大地增加 CPU 和内存消耗。另外,如果使用流播放声音,则您可能会有多条重复的流,这会增加 I/O 访问次数。
在这种情况下,使用 SetMultiplePositions()
将极大地提高性能。它还可让您用一次操作来轻松控制所有声音,并减少需要注册的游戏对象的数量。
在游戏中创建此场景时,您可以使用以下两种方法之一: MultiPositionType_MultiSources()
还是 MultiPositionType_MultiDirections()
。
MultiPositionType_MultiSources
通常更准确,不过如果相互距离太近,则可能会出问题。记住,当只播放一个声部来模拟多个声音时,Wwise 会累加不同位置上的音量,从而可能导致音量超过 0 dB。MultiPositionType_MultiDirections()
占用 CPU 更少,只采用最大音量,然后让各个扬声器按此音量来播放。由于 MultiPositionType_MultiDirections()
不会增加音量,因此它可以保证不会有削波失真发生,因此更适用。
尽管一个声音有多个位置,但声音引擎仍只播放一个声部。这意味着当所有声音都超出值域时,只会处理一个虚声部。
- 模拟从豁口传来的声音(声音重定位)
当声音遇到声障或声笼时,那么可能听起来就像从别的方向而不是从声源的实际位置传来。在这些情况下,您可以将声音摆在多个位置,创建出您希望的效果。
举例来说,假设声部的直接传播路径被建筑物遮挡——见下图。那么使用两个替代点 A' 和 A'',而不是使用对象 A 的实际位置,听起来会更加逼真。当这样做的时候,使用 SetObjectObstructionAndOcclusion()
,这样会对所有位置应用同样的声笼和声障参数,或者也可以使用 SetMultipleObstructionAndOcclusion()
,为各个声音位置指定独有的声笼和声障值。
图:使用替代位置重新定位声音
此方法还非常适用于模拟已经被摧毁的环境,声音来自于许多随意的位置。在重新定位声音时,使用这个方法更好:MultiPositionType_MultiDirections()
。
X、Y 和 Z 轴在 Wwise 声音引擎中定义如下:
Wwise 声音引擎中 X、Y 和 Z 轴的方向。
|
Caution: 确保使用正确的 X-Y-Z 规则传递位置和朝向向量。如果您的游戏引擎用的是别的坐标系统,则在将它们传递给 AK::SoundEngine::SetPosition() 等方法之前需要转换坐标。 |
有关集成 3D 位置的示例,请参阅 3D 位置示例 。