转自:http://blog.sina.com.cn/s/blog_4de8abbb01000atp.html

3D中的声音

使用DSound,可以为声音建立一个3D世界与3D图形结合。可以在空间定位声音资源和收听者的位置,允许使用多普勒变换移动声音,控制物理参数,例如在距离远时声音削弱的频率。

DSound可以在两个扬声器或者耳机设备上建立虚拟的3D效果。如果用户已经在控制面板中选择了环绕声音扬声器,也可以利用WDM驱动的多声道。更多的信息参考DSBUFFERDESC。

3D空间的坐标

声音资源和收听者的位置,速率和方向在3D空间中是以笛卡尔坐标系表示的。坐标是与程序建立的视点有关系的。X轴从左到右,Y轴从小到上,Z轴从近到远。

D3DVECTOR结构包含了在3向坐标系上描述声音,速率和方向的值。

方便地,向量如下表示(x,y,z)。

位置,默认的单位是米。如果程序的3D图形没有使用米作为单位,可以设置一个距离因数,表示每一个制定单位是多少米。例如,如果程序使用尺作单位,可以制定距离因数为.3048,即.3048米是一尺。更多的信息,参看Distance Factor。

速率,是描述每秒钟沿每个坐标轴移动速率的向量。同样的,默认的单位是米,但是可以被程序改变。

方向,可以是任意单位,因为都是成比例的。如果基本3D坐标系默认方向向北,收听者的方向是(-1,0,1),那么收听者面向西北方。这个方向也可以表示为(-5,0,5)或者(-.25,0,.25)。

可以在纸上画出它们以便观察向量是怎样在2D空间工作的。从(0,0)画到(1,1)和从(0,0)画到(5,5)是具有相同的方向的,但是后者代表更远的距离或者更快的速率。

声音位置的理解

在真实的世界里,空间中声音位置的理解是被几个因素影响的。不是所有的这些因素都是声学方面的,另一个重点是视觉。声音本身的线索包括以下几个方面:

1)  声音减弱。当一个声音资源远离收听者时,被感觉到的声音以一个固定的速率递减。

2)  耳间的音强差别。从收听者右面传来的声音在右耳的声音会比在左耳的声音大。

3)  两耳间的时间差别。声源在收听者右边发出时到达右耳的时间会比到达左耳的时间略微早一点,这些时间大概为1毫秒。

4)  遮挡。耳朵的形状和位置保证了从收听者后面传来的声音和从前面传来声音相比是有一定遮挡的。另外,如果一个声音从右边传来,声音到达左耳的时候会被收听者的头部遮挡。

5)  耳垂的效果。耳朵和它的褶皱导致了从不同方向传来声音的细微差别。数学上将这种效果视作头部反应传送函数(head-related transfer function (HRTF))

头部反应传送函数(head-related transfer function (HRTF) )

HRTF:是一种音效定位算法,它的实际作用在于欺骗我们的耳朵。简单说这就是个头部反应传送函数(Head-Response Transfer Function)。要具体点呢,可以分成几个主要的步骤来描述其功用。第一步:制作一个头部模型并安装一支麦克风到耳膜的位置;第二步:从固定的位置发出一些声音;第三步:分析从麦克风中得到声音并得出被模型所改变的具体数据;第四步:设计一个音频过滤器来模仿那个效果;第五步:当你需要模仿某个位置所发出的声音的时候就使用上述过滤器来模仿即可。过滤器的回应就被认为是一个HRTF,你需要为每个可能存在声源的地方来设置一个HRTF。其实我们并不需要无限多个HRTF。这里的原因也很简单,我们的大脑并不能如此精确。对于从我们的头部为原点的半球形表面上大约分布1000个这样的函数就足够了,而另一半应该是对称的。至于距离感应该由回响、响度等数据变化来实现。

DSound 3D缓冲区

每一个3D环境中的声音资源都是由IDirectSound3DBuffer8接口描述的。这个接口只被使用DSBCAPS_CTRL3D标志位建立的声音缓冲区所支持。

程序在使用DSound的3D兼容性的时候必须提供单声的声音资源。如果尝试使用DSBCAPS_CTRL3D标志位建立一个缓冲区并且WAV格式多于1个声道的话会导致错误。下面的章节描述了怎样获得和管理3D缓冲区对象。

获得3D缓冲区对象

IDirectSound3DBuffer8接口是从一个由DSBCAPS_CTRL3D标志位建立的次缓冲区获得的。可以通过呼叫QueryInterface在IDirectSoundBuffer8接口上获得IDirectSound3DBuffer8接口:

LPDIRECTSOUND3DBUFFER8 lpDs3dBuffer;
 
HRESULT hr = lpDsbSecondary->QueryInterface(IID_IDirectSound3DBuffer8,
                (LPVOID *)&lpDs3dBuffer);

最小和最大距离

当一个收听者接近一个声源时,声音变大;当距离缩小到一半时,声音加倍。传递一个特定的指针,不过音量的增强并不是那么有规律的。

设置的最小距离决定了声音以多快速度消失。例如,对一个喷气式飞机可能设置这个值为100米,而对于一只蜜蜂设置为2厘米。根据这些设置,喷气式飞机在离收听者200米的时候音量减半,而蜜蜂音量减半的距离仅为4厘米。

SDK帮助文档中的附图表示了最小距离和最大距离是怎样在距离增大的情况下影响喷气式飞机和蜜蜂的音量的。

 

最小距离:声音缓冲区默认的最小距离是DS3D_DEFAULTMINDISTANCE,被定义为1个单位或者使用默认距离因数的时候为1米。除非改变这个值,声音离收听者1米外的时候听到的声音是最大音量的,2米外音量减半,4米外变为四分之一等等。对于大多数的声音可能需要设置一个大一点的最小距离,这样当声音离远时不至于衰减过快。

最大距离:一个声源的最大距离是指超过这个距离声音就不再衰减。默认的最大距离是1billion,这意味着在听觉范围外声音的衰减也会被继续计算。为了避免不必要的处理,在VXD驱动的软件缓冲区下,程序可以设置一个合适的最大距离并且在创建缓冲区的时候包含DSBCAPS_MUTE3DATMAXDISTANCE标志位(在DMusic中,这个标志位载3D缓冲区中是被自动设置的)。

最大距离也可以用来组织声音消失。例如,如果设置了100米的最小距离,那么可能在1000米以外就听不到了,通过设定800米为最大距离,可以保证在更远的距离仍然可以保持最大音量的八分之一。在这种情况下当然就不能设置DSBCAPS_MUTE3DATMAXDISTANCE标志位了。

默认的,距离值使用米来描述。如果想调整距离的影响效果可以改变距离衰减因数。

处理模式

声音缓冲区有3种处理模式:正常,头部相关和禁止

普通模式(DS3DMODE_NORMAL声源的位置和方向完全依赖世界空间。这个是默认的模式,用于声源相对于收听者不移动并且不转动的情况。

头部相关模式(DS3DMODE_HEADRELATIVE声源的3D属性和当前收听者的位置,朝向和速度都是有关系的。当一个收听者移动或者转动的时候在世界空间缓冲区重新配置。头部相关可以用来制作环绕在收听者头部的效果。但是,大多数的声音都不必是3D的。

禁止模式(DS3DMODE_DISABLE3D声音处理被禁止,声音貌似从收听者的头部中心传来

缓冲区的位置和速度

当一个声源移动时,程序为它的位置和速度指定值。

位置使用三个坐标轴的距离单位表示,和世界空间和收听者有关,决定于处理模式。

速度使用每秒在三个坐标轴上移动的向量为单位。默认的,距离单位是米。速率只有在多普勒变换的时候才会被使用。

声音圆锥

一个没有方向的声音在各个方向都具有相同的振幅。有方向的声音在朝向的方向声音最响。描述带方向声音大小的模型叫做声音圆锥。声音圆锥由内锥和外锥组成。外锥的角度必须等于或者大于内锥的角度。

在内锥以内的任何角度,音量的大小都是在考虑基本音量,收听者距离,收听者方向等各种因素后没有圆锥的音量大小。

在外锥以外的任何角度,正常的音量通过程序设置的一个因子衰减。外锥音量使用百分贝表示,并且是负数,因为声音从0衰减。音量等于内锥音量+定义的外锥音量。

在内锥和外锥之间是声音从内锥到外锥的裱画过程。音量随着角度的增加减小。

每一个3D声音缓冲具有一个声音圆锥,但是默认的缓冲区是一个全方位的声源,因为外围的声音没有衰减,并且内锥和外锥的角度都是360度。除非程序改变这些值,声音表面听起来没有任何方向。

恰当的设计声音圆锥可以为程序增加动态效果。例如:可以在屋子中间放置一个声源,设置它的方向朝向一个走廊的开着的门。然后设置内锥的角度这样它可以延伸至,使外锥角度稍微款一点,设置外锥的声音是听不见的。一个沿着走廊走的收听者只有靠近门的时候才会听到声音,并且声音在收听者开着的门的时候会最大。

3D缓冲区的一批参数

程序可以单独或者批量的获得或者设置3D声音缓冲区的参数。如果声源正在移动,可能需要马上一起设置位置,朝向和速率等很多参数。可以通过调用IDirectSound3DBuffer8::GetAllParameters来获得目前的参数,改变其中的DS3DBUFFER结构成员的值,然后将修改过的值传给IDirectSound3DBuffer8::SetAllParameters

参数的改变也可以通过标记他们为延缓执行并且在以后一起执行来提高效率。

DSound3D收听者

在虚拟的3D环境和在真实世界一样,声音的存在只和接收点有关。在DX程序中3D声音效果不仅受声源的位置,方向和速度值的影响,还和虚拟收听者的位置,方向和速度有关。

默认的,收听者在原点,鼻子的方向朝向Z轴的方向,头顶朝Y轴的方向。程序可以改变这些值来影响用户的移动和朝向。收听者也控制声学环境中一般参数,例如多普勒变换和声音衰减率。

这个章节描述了怎么获得并且管理一个全局的3D声音参数。

获得3D收听者

全局声音参数从主缓冲区的IDirectSound3DListener8表面设置和获得。在一个程序中只有一个主缓冲区和一个收听者。

为了获得一个收听者借口,必须首先使用IDirectSound8::CreateSoundBuffer建立一个主缓冲区,定义DSBCAPS_CTRL3D和DSBCAPS_PRIMARYBUFFER标志位。调用QueryInterface方法获得一个指向IDirectSound3DListener8接口的指针。

下面的例子获得了一个收听者的指针:

GetListener(LPDIRECTSOUND8 lpds, LPDIRECTSOUND3DLISTENER8* ppListener)
{
  DSBUFFERDESC             dsbd;
  LPDIRECTSOUNDBUFFER      lpdsbPrimary;  // Cannot be IDirectSoundBuffer8.
  LPDIRECTSOUND3DLISTENER8 lp3DListener = NULL;
  HRESULT hr;
 
  ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
  dsbd.dwSize = sizeof(DSBUFFERDESC);
  dsbd.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER;
  
  if (SUCCEEDED(hr = lpds->CreateSoundBuffer(&dsbd, &lpdsbPrimary, NULL)))
  {
    hr = lpdsbPrimary->QueryInterface(IID_IDirectSound3DListener8,
                                 (LPVOID *)ppListener);
    lpdsbPrimary->Release();
  }
  return hr;
}

收听者的空间参数

收听者向量默认的,前方向量是(0.0, 0.0, 1.0),上方向量是(0.0, 1.0, 0.0)。两个向量必须时刻互相保持直角。如果必要,DSound会调整前方向量来使其与上方向量成直角。

位置通过向量的距离单位来衡量。

速度使用沿向量的速率来衡量。默认单位是米。速率只有多普勒变换才有用。

距离因子

距离因子是在一个向量单位表示多少米。默认的距离因子是1.0。如果一个缓冲区的速度是(2.0, 0.0, 0.0),声源被认为沿X轴以每秒2米的速度移动。为3D图形使用不同度量单位的程序可能因此作相应的改变。

假设,例如基本度量单位是英尺,或者.3048米。设置距离因子为.3048。从此就使用英尺作为单位,它们自动被转换成米。

通过改变通过n度量单位每秒描述的实际速度,距离因子可以影响多普勒变换。它并不直接影响衰减,因为距离的衰减率是在最小距离的基础上的。如果设置最小距离为2个度量单位,音量在4个度量单位处为一半,不管度量单位是英尺,米或者其它度量衡。更多的信息,参考Minimum and Maximum Distances。

多普勒效应

DSound自动为拥有速度的缓冲区或者收听者建立多普勒变换效果。效果是累积的:如果收听者和缓冲区都在移动,系统自动计算相关速度,从而调整多普勒效果。

为了在程序中拥有真正的多普勒变换效果,必须计算正在移动的任何物体的速度,然后为声源或者收听者设置合适的速度。在特殊情况下可以自由的增大或者减小这个值来建立特殊效果,也可以通过改变多普勒因子在全局加强或者减弱多普勒效应。

多普勒效应可以从DS3D_MINDOPPLERFACTOR 到 DS3D_MAXDOPPLERFACTOR,分别被定义为0.0和10.0。0意味着声音没有多普勒变换。其它数值表示多少倍的多普勒变换。

衰减因子

衰减因子是作用于声音的衰减数量,基于收听者和声源的距离。DSound可以忽略,增大衰减或者使用和真实世界一样的效果,这些取决于一个全局的衰减因子。

衰减因子可以从DS3D_MINROLLOFFFACTOR到DS3D_MAXROLLOFFFACTOR,分别被定义为0.0和10.0。DS3D_MINROLLOFFFACTOR 表示无论声音离收听者多么远都会是最大声音。任何其它的值表示真实世界的衰减。

衰减因子是全局的。想要为每一个单独的声音缓冲区改变距离效果,可以为缓冲区设置最小距离。

3D收听者的一批参数

程序可以分别或者批量的得到和设置一个3D收听者对象的参数。如果收听者在移动,可能希望马上设置大量的参数例如位置,方向和速率等等。可以通过调用IDirectSound3DListener8::GetAllParameters获得当前的参数,改变当中DS3DLISTENER结构中的成员变量,传递到IDirectSound3DListener8::SetAllParameters.。参数变化可以通过标记它们为延缓处理的,然后一起执行它们来提高效率。获得更多信息,参考Deferred Settings

延缓设置

每一次3D声音的变化都会导致在消耗CPU周期情况下的重混合。为了最小化改变3D设置对执行性能的影响,在调用IDirectSound3DListener8 或者 IDirectSound3DBuffer8中的方法改变3D声音的设置时设置DS3D_DEFERRED标志。然后调用IDirectSound3DListener8::CommitDeferredSettings方法立刻执行所有延缓执行的命令。

延缓设置会被立即模式覆盖。例如,如果使用DS3D_DEFERRED设置收听者的速度是(1.0,0,0)然后使用DS3D_IMMEDIATE设置收听者的速度为(2.0, 0.0, 0.0),那么收听者的速度变为(2.0, 0.0, 0.0),当CommitDeferredSettings被呼叫时也不会被改变

DirectSound 3D声音世界相关推荐

  1. krpano漫游加方向性3D声音(这篇文章已被移到krpano中国网站 krpano360.com)

    需求:      在场景转换视角时.会出现不同方位的声音以及对应的音量变化,也即是将声音视作hotspot.当视角转到该声音热点时,也随之听到声音.官方样例:点击打开链接 本文已经搬迁到下述网址.请点 ...

  2. 如何打造3D立体世界?跟随图片一同探寻

    怎样让平面的手机,呈现出炫酷的三维立体世界效果?虚拟与现实又要怎样完美结合? HMS Core图形等领域能力全面开放,使能3D数字世界创新.请跟随图片一起进入HMS Core打造的3D立体世界吧. 了 ...

  3. 3D游戏世界里的万向节锁

    我们通常认为当前世界是一个三维的世界,用坐标系来表示就是XYZ,在3D游戏世界里也是用这样的三维坐标系来表示的. X代表水平坐标,Y代表垂直坐标,Z代表的是由屏幕往里的一个深度坐标,也就是垂直于屏幕的 ...

  4. OpenGL与3D图形世界

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

  5. 3D 声音实验室开始提供3D音频制作

    音频是制作沉浸式虚拟现实(VR)或360度体验的重要组成部分. 3D 声音实验室专注于3D / VR音频,并已宣布音频技术随时可供MainBerlin工作室的创作者和艺术家使用. 3D 声音实验室使用 ...

  6. 侏罗纪2来袭,看3D电影和探险3D恐龙世界,你选哪个?

    带上3D 眼镜在影院看新上映的侏罗纪世界,感觉已经够惊心动魄了吧!? 可如果你有机会坐上这趟开往侏罗纪公园的列车,就会进入更加逼真的3D恐龙世界:血口喷张的恐龙近在眼前,有没有肾上腺素飙升,心跳加快- ...

  7. PyOpenGL——走进3D的世界

    PyOpenGL--走进3D的世界 PyOpenGL介绍 功能解析 PyOpenGL实例 问题处理 一.缺少glut文件 参考文章 PyOpenGL介绍 功能解析 # 调用PyOpenGL库 impo ...

  8. 计算机图形Opengl的实验报告,opengl计算机图形学实验报告之3D漫游世界.doc

    opengl计算机图形学实验报告之3D漫游世界.doc 北师大珠海分校信息技术学院计算机图形学实验报告实验报告文件命名方式学号姓名_实验序号_实验名称.doc姓名学号1001010092专业计算机任课 ...

  9. 黎明纪元-3D魔幻世界角色扮演游戏

    <黎明纪元>是一款以西方魔幻世界为背景题材的手游大作.在游戏里,你可以与好友携手作战,荣耀并肩:可以不断地完成任务,提升战力体验实时pk的热血激战:可以杀boss爆神装,秀出个性.玩出风采 ...

最新文章

  1. element-- 修改MessageBox 弹框 中确定和取消按钮顺序
  2. 读写应用程序数据-SQLite3
  3. linux cat 命令详解
  4. mysql主主keepalived_MySQL主主+Keepalived实现高可用
  5. java 堆转储快照_Java堆转储:您可以完成任务吗?
  6. Linux基础学习导图
  7. EasyUI DataGrid 中字段 formatter 格式化不起作用
  8. linux crypto cbc 接口,Linux 2.6.38.4: User-space interface for Crypto API
  9. 【kafka】kafka RecordAccumulator封装消息流程
  10. php smarty配置,PHP中使用Smarty模板目录结构配置
  11. 软件工程大一至大四课程
  12. SD卡格式化|SD卡数据恢复技巧
  13. CMD命令Program Files问题
  14. mysql查询当前时间的前后几天时间
  15. dnf命令 (常用总结)
  16. 推荐一本书《亚马逊网络书店传奇》
  17. java web开发入门学习笔记(手打超细版)
  18. 强化学习keras-rl2的安装注意点
  19. 信号与系统(Python) 学习笔记 (6) 拉普拉斯变换 Laplace Transform
  20. 陌上花开,可缓缓归矣

热门文章

  1. 迅为IMX6Q四核核心板商业级|工业级|IMX6Plus版本|IMX6D双核核心板
  2. 三相一体式电流互感器选型
  3. 【转】商品详情页系统的Servlet3异步化实践
  4. 第五届马丁•伍德爵士中国物理科学奖将颁发暨第十七届全国低温物理研讨会召开
  5. 如何借助官网例程学习STM32
  6. 声优直播互动平台克拉克拉获1.2亿元融资,将布局虚拟偶像互动
  7. 贝索斯回应员工忧虑:我一如既往地专注于亚马逊
  8. Python列表按降序排列
  9. android 画笔轨迹,Android中SurfaceView和view画出触摸轨迹
  10. 软件需求分析案列_软件需求分析案例解析