用VB.Net实现DirectSound9 (4) DS3D

关键字:VB DirectX9 DirectSound 3D 作者:董含君

昨天去百度搜索DirectSound3D的资料,真是一点都没有。惊讶啊。

google有一些,还是微软的。看来真的要填补国内空白了。

高手门看来都很忙啊。

========以上是废话================

一开始看微软DSound3D的例子很困难,主要是术语太多,如果准备工作做的不够,可以说几乎看不懂。

从家里翻出一本DirectX的速成教材,看来有解释的必要。

=========以下是正文===============

一个3D的声音,我们可以理解为一个3D的缓冲区(Buffer)

研究D3D的同志们知道,需要创建一个场景,然后设置顶点,光照,摄像机...

DS3D也是类似,大体有一下概念。这些需要跟现实联系起来理解。

1 声源 就是发声的物体。具备很多属性(慢慢讨论)(Buffer3D)

2 listenner 可以理解为听众,同样具备很多属性。(Listener3D)

3 声源与听众之间有各种关系,这就组成了场景,再代码里面不存在,是通过声源与听众的关系体现的。

4 声源是可以移动的,于是他有了位置(Vector3 position)

5 听众也是可以移动的,他也有位置(Vector3 position)

6 声源与听众都有位置,所以存在距离(distance)

7 由于存在距离又可以移动,于是便有了速度。(辅助概念)

8 有了声源的移动跟听众的位置,所以产生了多普勒效应(DopplerFactor)
(不懂?就是接近的物体音调变高,离去的时候相反。还不懂?去看看初中物力教科书....)

9 声音也有特性,比如衰减。距离越远,效果自然不一样。(RolloffFactor)

10 有两种声音:A 360度空间的声音(如爆炸) B 有方向的声音(如说话具有方向性)
对于前者,好说,需要注意的是,听众也有这两种属性。
带有方向的分为3个部分可以想象成3个嵌套的圆锥,声源(你的嘴巴)在顶点位置,发出的声音在最内的圆锥没有感觉出强烈的衰减。但是在外测的圆锥能够明显的感觉到(靠近内侧圆锥听得更加清楚,也许你会进去),最后剩下的就是听不到的了。
(也许你会说现实生活中我朝一个方向喊话,周围都能听到。那是因为波的传播特性以及反射的结果)

以上就是DS3D再现实中的参考模型。如果上面的你不能充分理解,那么你永远无法进入DS3D.

下一步,进入代码。

用设备device创建关联大家都会了,也知道他们都有自己的相关的参数的类,比如listenerParameters,Listener3DSettings

播放声音依赖于Buffer.play()

前3章说的就是如何通过修改Buffer的参数来达到声音效果的不同。

DS3D也是如此,修改Buffer的
application3DSettings.Position = position;(x,y,z,)
application3DSettings.Velocity = velocity;
然后利用这些位置参数
applicationBuffer3D.AllParameters = application3DSettings;

这样听到的声音就不一样了。

实质上,初始化完成DS 以及 DS3D之后,开始播放,我们修改的就是这些参数而已。

跟修改音量类似,只不过音量我们可以直接增大10或者减少5。而修改三维坐标需要用方程来解决罢了。
(也许会用到立体解析几何的知识)

DS3D理解起来不是很难了吧,就是修改坐标参数。其他的多普勒或者衰减微软已经做好了(什么!你要自己做,那你不用看本文了)

至于代码理解起来比较复杂,个人认为微软的例子使用了太多的技巧,导致理解起来难度增大。

下次我自己做个简单的例子,用来结束DS3D这一章。

为了写代码,用这么多文字介绍这些预备知识是值得的

时间: 2024-10-30 01:45:48

用VB.Net实现DirectSound9 (4) DS3D的相关文章

VB.NET 实现DirectSound9 (5) DS3D2

关键字: VB .NET DirectX DirectSound 3D 作者:董含君 经过一下午的奋战,走了若干弯路,终于可以播放3D声音效果了 感动 ~ ~ 大体按照下列的步骤来: 1 关联设备 SetCooperativeLevel2 设置3D硬件效果 DSoundHelper.Guid3DAlgorithmHrtfFull3 格式要求 SoundFormat 必须是单声道,不能是立体声4 主要缓冲区描述5 创建Listenner6 辅助缓冲区读取wav7 创建3D缓冲区8 播放9 控制空间

VB.NET实现DirectSound9 (6) 声音特效

关键字: VB.NET DirectSound 9 声音特效 回声Echo 作者:董含君转载请注明来自:http://blog.csdn.net/a11s 实际上这个就是传说的混音,微软把各种效果添加起来变成了混音程序严格的讲,这个算作声音的特效. 微软的DirectX的例子还有一个特点,就是爱把简单的问题复杂化,我用了大量的时间搞清出中间的各种对象怎样协作的,明白之后再来考虑各自的用途.虽然相信微软这么做也许是有道理的,但是不适合初学者.经过尝试整理出了以下结果. 首先大体介绍一下步骤====

VB.NET实现DirectSound9 (7) 录音

关键字: VB.NET DirectX 9 DirectSound 录音 riff文件格式 作者:董含君 下午看了微软提供的例子,居然把录音定位成Beginner级别晕哦,虽说我认为这个例子是微软提供的最"直接"的例子,但是步骤超多.而且还牵扯到多线程开辟缓冲区回调riff文件格式 IO 输出等等.由于录音的复杂性,以及微软这个例子的直接性,坚持原创的我最终还是复制了大量的代码.(希望不要骂我....) OK,先来说录音的步骤,里面牵扯到riff或者使用技巧的地方,有注释.我仅仅说步骤

VB.NET基础语法

很久以来,VB因为缺乏完善的面向对象支持.缺乏高效的错误处理机制和性能表现不佳,因而一直受到某些人的嘲笑.VB.NET将彻底改变这种情况.然而,VB.NET在这些方面的改进也要付出代价,许多旧的代码需要手工进行转换才能在VB.NET下运行. 下面几个表格总结了VB.NET语言在语法上的改动之处.注意这些表格并没有完全列出所有改动之处,但列出了最重要的一些改动. 表A对比了VB6中一些熟悉的语法形式及其在VB.NET中类似功能最接近的语法形式. 表A:语法对比旧语法 新语法 说明窗体装载事件,类初

VB.NET中有用的通用对象列表

要使用List(of T),我们需要了解如何部署.NET框架所提供的多种方法.这也将是本文要介绍的内容.我已经编写好了三个示例--使用ForEach, FindAll,和Sort--来阐述同样列表类的工作原理. 第一步是要创建一个同用列表.你可以从多种途径获取数据,但是最简单的方法是添加.文本中,我们会编写代码以便为举例中的集来分类.因此,下面我们就来讲讲创建集的代码. 首先,我需要一个能代表集中的Bottle的对象.为此而编写的代码是完全符合标准的,而且事实上,VB.NET 2008 Expr

VB.NET多线程应用

开发者一直要求微软为VB加入更多的多线程功能,对于VB.NET也是这样.VB6已经支持建立多线程的EXE.DLL和OCX.不过使用多线程这个词语,可能也不太确切.因此VB6仅支持运行多个单线程的单元.一个单元实际上是代码执行的空间,而单元的边界限制了代码访问任何单元以外的事物. VB.NET就不同了,它支持建立自由线程(free-threaded)的应用.这意味着多个线程可以访问同样一套的共享数据.本文的以下部分将讨论一下多线程的一些基本点. 问题 虽然VB6支持多个单线程的单元,不过它并不支持

VB.NET局部静态变量介绍

经过长时间学习VB.NET局部静态变量,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西.VB.NET能够实现很多C#不能做到的功能,如When语句.Optional参数.局部Static变量.对象实例访问静态方法.Handles绑定事件.On Error处理异常.Object直接后期绑定等等.VB和C#同属.NET的语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢.我们一起来探究一下VB.NET局部静态变量. VB.NET局部静态变量 VB支持用Stati

使用VB.NET加密文件

加密 本文介绍使用XOR加密算法对数据进行加密, 这是一种很简单的算法,使用了尽量简单的VB编程方法,通俗易懂.我们可以采用更安全的算法如DES算法,IDEA算法等.各位如有任何见解,请不吝赐教. 在窗体中添加一RichTextBox,设置其Name属性为SourceFile,Multiline属性为True,ScrollBars属性为3-both.添加一MainMenu,设置一菜单项"文件",其下有"打开","保存","加密"

编程-VB 引用同一根目录下的文件夹的Excel

问题描述 VB 引用同一根目录下的文件夹的Excel exe文件跟文件夹的根目录一样,要引用文件夹下面的Excel部分单元格的数据各位高手帮我解答下,新人的第一条提问 解决方案 '工程-引用-将Microsoft Excel 12.0 Object Library选中,'工程-部件-将Microsoft Common Dialog Control 6.0选中,'在窗体上添加一个按钮Command1对象,一个CommonDialog1通用对话框对象Private Sub Command1_Clic