concentrate on c/c++ related technology

plan,refactor,daily-build, self-discipline,

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  37 Posts :: 1 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(9)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

Dsound提供了模拟的声源对象和听者(listener),声源和听者的关系可以通过三个变量来描述:在三维空间的位置,运动的速度,以及运动方向.
产生音效的几个条件是: 1)声源不动,听者移动,2)声源走动,听者移动, 3)声源和听者都移动.
3d环境里面,通过IDirectSound3DBuffer8接口来表述声源,这个接口只有在创建时设置DSBCAPS_CTRL3D标志的DirectSound buffer才支持这个接口,这个接口提供一些函数来设置和获取声源的一些属性,可以通过主缓冲区来获取IDirectSound3DListener8接口,通过这个接口,我们可以控制着声学环境中的多数参数,比如多普勒变换的数量,音量衰减的比率.

当听者接近声源的时候,听到的声音就越大,否则就越小,直到消失.
声源的最小距离,就是声音的音量开始随着距离大幅度衰减的起始点.
DirectSound的缺省的距离DS3D_DEFAULTMINDISTANCE定义为1个单位,或者是1米,我们规定,声音在1米处的音量是full volume,在2米衰减一半,4米衰减为1/4,一次类推.
最大距离,就是声源的音量不再衰减的距离,我们称为声源的最大距离.
sound buffer处理模式: normal, head-relative, disabled.

在正常模式下面,声源的位置和方向是真实世界中的绝对值,这种模式适合声源相对于听者不动的情形.

 在head relative模式下,声源的所有3d特性都跟听者的当前的位置,速度,以及方向有关,当听者移动,或者转动方向,3d buffer就会自动重新调整world space.这种模式下可以实现一种在听者头部不停的嗡嗡叫的声音,那些一直跟随着听者的声音,根本没必要用3d声音来实现.

在disable 模式下,3d声音失效,所有的声音听起来好象来自听者头部的.
主要注意的是两个位置: 声源位置, 听者位置,之前我遇到的问题就是这个问题了,listenerPosition在登陆界面播放界面音效的时候,就记录了,但是在进入游戏以后却没有将玩家的坐标重新赋给听者的位置,并且根据玩家的状态不停地更新.
1)声源位置确定,但是听者位置不对,这样就无法找到声音的有效距离,这样使3d音效看起来像是环境声音一样,走到哪里听到哪里.
2)从模型里面获取的位置只是初始化的时候的位置,后来绑定到模型上面的位置却没有确定下来,这样一来,造成了声源位置和听者位置都不对.

后来在direct sound里面做了尝试代码:将listener和sound buffer都设置成相应的位置,然后在这个位置上面播放声音,结果发现毫无距离感和衰减,directsound里面的play3DSound例子其实也并非真正意义上的positional sound,因为它只是用正余弦函数在改变声源的位置.给的感觉只是声音飞来飞去的,并没有有什么衰减的成分在里面,另外在那边做一些测试,将声源位置固定,然后改变听者的距离,我猜想这样应该就有一种,靠近声源位置的话,声音就大,远离声源位置的话,声音就小.事实上就跟播放普通音乐一样.不过唯一值得赞扬的是:directsound里面有次缓冲区这个概念来支持声音混合,以及可以播放音乐,真正意义上的3d音效还是不用directSound比较好.建议使用fmod,或者openal之类的,比较实在.

DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY = DSBCAPS_CTRLDEFAULT.

DirectSound不支持双声道混合(双双,或者单双),即只支持单声道混合,并且要求声音的信息(比如频率,采样)一致. 建议采用8位采样大小,以及22Khz的采样频率,相关转换软件用goldwave.
posted on 2008-10-31 10:10 jolley 阅读(867) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理