FMOD继续翻译下——3D sound

只给自己看,有借阅的被误导不负责任。。

距离模型与线性滚动vs对数
对数

只是FMOD 3D默认的距离模型。所有声音在真实世界中自然地渐远使用的就是对数的变小。使用这个模式需要使用这个标记FMOD_3D_LOGROLLOFF,但实际你不用去设置,因为这是默认的。

当FMOD使用这个模式,声音或channel的"mindistance",即声音开始变小的距离,就可以模拟声音越来越小或越来越大。默认的情况,每一对mindistance,声音的音量也是对半分的。这个比率(rateof rolloff)可以使用System::set3DSettings进行改变。

举个例子,蜜蜂的声音与一个巨型怪物的声音。在距离蜜蜂一米或两米的时候就已经很难听到他们的声音了,但相对比的,一个怪物的声音去可以在百米之外都能听到。

在这个例子中我们可以设置蜜蜂声音的mindistance为0.1米,这样离开一小段距离后就会听不到了。

怪物声音的mindistance可以设置为50米,这样在声源与听者之间距离几百米之后才会完全听不到。

即时所有声音文件都是正常的16bit波形,但在这个例子中我们都得到了一个真实音量变换的表现。(也就是说,如果你使用2D来播放他们,他们都是同样的音量)

"maxdistance"不受这个比率(rate ofrolloff)的影响,因为这个距离表示的是声音停止变小的距离。

不要设置设个值太小,处分你想要人工的停止它变小。这个通常不建议,保持他的默认值10000.0就好。

 

线性
这是FMOD引进的一个可供选择的距离模式。它的标签为FMOD_3D_LINEARROLLOFF,可以通过System::createSound或Sound::setMode/Channel::setMode进行设置。

这种模式很假(fake),但却是很多程序员乐于使用的一种渐变方法。它同样也有"mindistance","maxdistance"的概念。mindistance与对数的方法一样(声音开始变小的最小距离,其他为全部音量).但"maxdistance"变为音量为0的距离。就在这两点间进行线性变小的变化。

 

一些3D全局设置

有三个主要的配置设定影响到3D声音:

*多普勒因素(Doppler factor).这是增强或减弱多普勒效果的方法。

*距离因素(distance fanctor).即距离单位的设定,米,毫米,英尺什么的。

*滚动比率(rolloffscale).影响3D声音使用FMOD_3D_LOGROLLOFF,如何控制声音衰减速度使用这个模式。

这3个因素都可以使用System::set3DSettings来设置,但一般来说都不建议去设置他们。

 

速率和保持帧速独立(velocity and keeping it frame rateindependent)

速率,是只有你想使用多普勒效应的时候才需要。否则在System::set3DListenerAttributes和Channel::set3DAttributes中这个值可以填0或NULL,这样就不会有多普勒效果了。

这里需要强调一下,速率(velocity),在FMOD里是指 米每秒,而不是 米每帧。注意两者的不同。

要获取正确的速率,要通过物理引擎的代码,而不是通过对象当前位置的最后一帧。这会受到帧速的影响,越高的帧速即意味着越小的位置变化,所以也就意味着较小的多普勒效应,但这是错误的。

如果你只能通过每帧才能获取对象的位置,那你就要进行转换,转换成 米每秒。

通过帧前帧后的的距离向量,以及一帧的时间,可以这样计算:

velx = (posx-lastposx) * 1000 / timedelta; 
velz = (posy-lastposy) * 1000 / timedelta; 
velz = (posz-lastposz) * 1000 / timedelta;
timedelta最后一帧的毫秒数,可以通过timeGetTime()来计算得到,你懂得。
所以如果帧速为60fps,则timedelta则为16.67ms,如果在这段时间对象移动0.1米,则实际速率就为:
vel = 0.1 * 1000 / 16.67 = 6 meters per second.
再,如果只有30fps,则每帧移动的距离将是60fps的两倍,所以:
vel = 0.2 * 1000 / 33.33 = 6 meters per second

方向与左右手坐标系
如果你想要在3D空间中让音乐有效果,获取正确的方向是很有必要的。
FMOD默认使用左手坐标系系统(+x=右,+Y=上,+Z=前),这和DirectSound3D什么的是一样的。
如果你需要使用不同的坐标系,使用System::set3DListennerAttributes与Channel::set3DAttributes来设置。
 
一个典型的游戏循环
3Dsound与FMOD channele管理器需要在每一帧的时候更新一次,使用System::update。
这是一段典型的游戏音频许愿的例子代码:
do { 
UpdateGame(); // 这里是游戏循环,并且可以使用channel->SetAttributes 
system->set3DListenerAttributes(0, &listener_pos, &listener_vel, &listener_forward, &listener_up); // 更新“耳朵” 
system->update(); // 需要更新3D声音的引擎,每帧一次. 
} while (gamerunning);

大多数游戏获取位置、速率、方向都是通过摄像头的向量或矩阵得到的。

 

立体声与多频道声音可以用于3D

当立体声用于3D时,在内部将会分成两个升到用于单独的3D声音位置的效果。

多频道的声音(multi-channel)同样支持,比如一个8Channel的声音将会在FMOD中分配8个声道。

在3D空间中可以使用Channel:: set3DSpread来交替左右声道。

默认的所有的子channel位置都在同一个位置,所以听起来像单声道。

 

分屏/多个听者(split screen / multi listeners)

在某些游戏中,可能会有个分屏的模式。对于音频来说,这意味着FMOD需要知道一个屏幕中的多余1个的听者。

这个可以通过两个简单的函数来达到目的:System:: set3DNumlisteners 与 System::set3DlistenerAttributes.

如果你有两个玩家分屏,对于每个摄像头或听者调用System::set3DListenerAttributes,用0填充表示第一个摄像头的听者数量,用1表示第二个摄像头的听者数量。

System:: set3DNumListeners需要设置为2.

这样就做完了,你将听到到一点不同,因为FMOD做了一些事情,用来避免不同窗口相同声音的混淆:

1. 它关闭了所有的多普勒。这是因为可能一个听者朝着声源移动,而另一个可能背对声源移动,为了避免混淆,关闭了多普勒。

2. 所有声音都是单声道。。。。。。。。。。

3. 每个声音只播放一次,就像是一个人在玩游戏一样,用于节约CPU等资源。

 

扬声器模式/模式(Speaker modes/output)

获取5.1音效很简单。如果声卡支持,所有使用FMOD_3D和FMOD_HARDWARE的声音都将自动转为环绕扬声器系统,但仅当用户确定扬声器在操作系统的设置正确,并能够输出5.1或7.1

你需要调用System:: setSpeakerMode,这个函数只有使用FMOD的软件混音引擎(software mixingengine)时使用。。。。。。。。。

发表评论

邮箱地址不会被公开。 必填项已用*标注

* Copy This Password *

* Type Or Paste Password Here *