测试Oculus
使用unity和oculus测试3D声音的效果。
Oculus Spatializer Plugin (OSP)是针对Unity工具的一款插件,让单声道的声源可以再3D空间中根据用户头部的位置来进行空间化。
目前OSP还存在一些缺陷:
某些功能,例如priotiry systems,还不完整
当early reflections打开时,CPU的使用率会提高,并且随着房间规模的增大,成比例的提高。
用户可能会听到click,当声音被一个优先级更高的声音偷走的时候。
安装软件
下载地址:https://developer.oculus.com/downloads/
Oculus Runtime for Windows
Oculus SDK for Windows
Oculus Audio SDK Plugins
Unity5.1 X86
VS_UnityTool2013(非必须)
SDK安装入Unity中
网址:https://developer.oculus.com/documentation/audiosdk/latest/concepts/osp-unity-install/
创建一个新的工程
双击OculusSpatializer.unitypackage,导入all
测试OSPTestScene
OSPTestScene
点击OSPTest,直接运行,可以看到3个球,每个球都在环播放音乐。
OSPManager
https://developer.oculus.com/documentation/audiosdk/latest/concepts/osp-unity-ospmanager/
包含信息
OSPManager包含本应用中spatializer的全局变量信息。
Bypass:选中后,就不进行空间化,所有通过OSPAudioSource的声音会使用Unity native 2D panning。
Global Scale:1表示unity的一个单位对应1m,0.01表示unity的一个单位对应1cm。
Gain:由于spatialized声音的音量被会spatializer减小,因此需要对这些声音加一个增量,让它们听起来和非空间化的相同。
Enable(EARLY REFLECTIONS):增强空间化的效果,但是会提高CPU的使用率。
Reverb On:给输出加入一个固定的reverb tail(逐渐衰弱的尾巴)。这个reverb是通过根据房间参数的反射计算得到的,并不一定会提到CPU的使用率。修改房间的参数可能会引起CPU使用率的提高。
Room Dimensions:理论房间的维度,用来计算反射。房间越大,反射的越远。目前房间的大小范围在【0-230米】
Reflection Values:0表示声音在墙面完全被吸收,1表示完全反射。
Reflection Gain:用来调整反射后的信号强度(both early reflections and reverb)。以米为单位,表示声音在衰减为0之前可以传播多远的距离。这个值越大,反射的声音也越大。
使用说明
最多可以空间化64个声音。
音频输出格式应该为2.1或者2 Stereo Channel Configuraion。Spatializer无法处理更高参数的信道。
这个理论的房间会根据听者的位置来计算反射,并且根据听者的朝向来旋转。未来的版本可以让用户在一个静止的房间里走来走去。
当使用early reflections时,要保证房间是非对称的。一个立方体房间会产生加强的回音,造成空间化效果很差。shoebox模型在模拟房间时的效果最好,对于很大的区域或者室外,应该采用一个单独的衰变模型。
重要:当使用early reflection时,要保证声源处于房间的内部,否则这个声音就无法被听到。
代码细节
调用C++库OculusSpatializerPlugin.dll,主要函数包含:
Awake()
Update()
AcuireContext()
ReleaseContext()
Spatialize(int context, float[] ioBuf)
UpdateEarlyReflections()
OSPAudioSource
https://developer.oculus.com/documentation/audiosdk/latest/concepts/osp-unity-ospaudiosource/
使用OSPAudioSource来创在要被空间化的声音。OSPAudioSource包含一个原始Unity Audio Source元素和一个OSPAudioSource脚本元素与spatializer进行交互。
Unity Audio Source
介绍几个比较重要的变量。
Audio Clip:声音文件
Output:声音的输出为audio listner还是audio mixer(一般是none)
Mute:静音
Loop:循环播放
Volumn:音量
Pitch:播放速度,1为正常速度
Stereo Pan:3D引擎对声音的影响
Spatial Blend:0为2D,1为3D
Reverb Zone Mix:
-
3D sound settings
Doppler level:多普勒效应,0为无
Volume Rolloff:声音的衰变模型
Spread:spread angle
Max Distance:声音的有效距离
包含信息
OPS工作时,是作为Unity Audio Source元素的一个扩展(add-on),从Audio Source元素中延伸出了许多自己的功能,包括距离衰变曲线。
注意:当需要手动启动声音时,必须调用OSPAudioSource中的Play和Stop函数,在OSPAudioSource.cs中有一系列控制空间化声音的函数。
Bypass:可以控制声源是采用3D空间化还是采用原始的2D Unity panning。这个特征在程序运行时,灵活的控制OSP Audio Sources,与现有的音频管理器融合起来也更简便。
Play On Awake: 推荐使用该开关,而不是Unity AudioSource中的原生的Play On Awake。直接使用原生的也可以播放,但是会在开始时听到一个hiccup噪声,这是由spatializer在得到所有的声源时引起的。
Disable Reflections:如果被设为true,则该声源将不会去计算反射/回声,因为计算回声需要额外的CPU计算,因此可以用来减少CPU的消耗。当然,OSP manager如果是false,则该变量不会有任何影响。
Frequence Hint:有3中选择,Wideband适合包含较多频率的内容,例如音乐和演讲。Narrowbank适合包含较少频率的内容,例如正弦波和简单的音调。None位于两者之间,是默认的参数。有一条经验,如果一个声源随着自己位置的变化,会产生不连续,例如clicking或crackling,这个时候就应该选择一个narrower frequency hint。
使用说明
在Unity native Audio Source中的3D Sound Settings可以被sound designer使用。但是里面的Pan Level和Spread被OSPAudioSource给重写了。因此在程序运行时,要保证这些变量不被修改,否则会严重影响空间化结果的输出。
目前只有单声道的声音会被空间化。即使用户在unity中把声音设置为3D sound,一个立体声也不会被分解为单声道的声音。
代码细节
继承MonoBehaviour类