微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net2008 DirectX与VB.NET编程四3D音效理论篇

这次是3D音效理论篇。
作为DirectSound中最令人瞩目的一个组件,DirectSound3D(简称DS3D)被众多游戏厂商所推崇,其中最值得一提的是CS了,玩家之所以能通过声音判断敌人的位置,DS3D起到了至关重要的一步。下面就开始进入令人激动的DS3D!

===============华丽的分割线===============

学习要点:
·了解向量、三维向量、DirectX的向量类和坐标系;
·了解声源、听众及处理模式;
·了解距离、最大距离及最小距离;
·了解多普勒效应、衰减效应和锥形效应。

·DS3D只能播放单声道声音。

===============华丽的分割线===============

尽管DS3D向我们描述的是一个虚拟的三维空间,但是,我们还是需要使用一些手段来掌握它的规律,因此,我们首不可避免地需要使用一些名词概念,这一篇将完全讲述这些概念。看完这篇文章后你绝对会惊叹DS3D的鬼斧神工。(注:以下“√”代表根号)

===============华丽的分割线===============

向量(Vector):
假设在一个平面中有两个点,A和B,因此,我们可以用一个数学概念来表示A到B之间的位移过程,这个概念便被称作向量。向量拥有两个属性:长度和方向,长度即A与B之间的距离长度,方向即这个位移过程所面对的方向。每个向量都拥有一个值,这个值等于终点的左边减去起点的坐标,即向量AB=(Xb-Xa,Yb-Ya),如果A的坐标为(2,2),B的坐标为(3,3),那么向量AB的值就是(1,1)。由此我们还可以推断向量的值与其位置无关。最后,向量的长度等于√(X*X+Y*Y)

三维向量:
三维向量就是在原向量的基础上加上Z轴,由平面向三维的拓展。同时,三维向量的值应表示为(X,Y,Z),长度的表达式也变为√(X*X+Y*Y+Z*Z)

向量类:
DirectX提供了三个向量类:Vector2、Vector3和Vector4,分别代表二维向量、三维向量和四维向量,这些类都封装在Microsoft.DirectX名称空间中。

坐标系:
DirectX使用的是笛卡尔坐标系的左偏手性,因此,三维空间中的X轴与屏幕水平平行,大小顺序为左小右大;Y轴与屏幕垂直,外小内大;Z轴与屏幕垂直平行,上小下大。更形象的比喻是:你的计算机屏幕是一个平面,你屏幕的上边框就是X轴,左边框就是Z轴,你用一根手指戳进屏幕时,它就是Y轴。

===============华丽的分割线===============

声源:
在现实世界中,我们称声音的起源体为声源,正是由于起源体,声音才得以产生、传播,并被听众听到。在DS3D的虚拟空间中一样,3D音效也是由这些声源产生的,声源具有两个主要属性,位置(Position)和速度(VeLocity),而且它们都被归纳为Vecotr3,三维向量(虽然位置这个属性并非向量,但是它也有X、Y、Z三个属性,因此将其归纳为向量是为了方便程序的编写)。

听众(Listener):
听众在DS3D中扮演的角色是声音捕捉者,也就是说,我们最后听到的声音效果实际上是听众这个虚拟物体所听到的声音,听众同样也具有位置和速度两个属性

处理模式(Mode):
DS3D处理声音的模式有3种:normal、Head-relative和disabled。
disabled:屏蔽模式,在这种模式下,声源的位置和方向将完全不影响声音效果,这时声音听起来和没有使用3D音效一样,这种模式适合旁白或者源自听众自己的声音。
normal:普通模式,在这种模式下,声源的方向将不影响声音效果,这种模式适合爆炸等全方位的声音扩散。
Head-relative:方向模式,在这种模式下,声源的方向和速度都将影响到音效,真正的3D音效即这种模式。
处理模式是声源的属性

===============华丽的分割线===============

距离(distance):
我们称声源与听众之间的线段长度为距离。根据物理规律,听众听到的音量与距离之间应该成反比例函数关系,即距离越长,音量则越小。

最大距离(Max distance):
我们知道,声源与听众之间距离越长,听众听到的声音便越小。当声源与听众之间的距离足够远时,远到听众无法声源发出的声音,也就是音量小到可以忽略不计时,我们便可以放弃它们,也就是说当距离到达足够远时,声音太小的音效将不会被播放了,以节省系统资源,除非它们之间的重新距离缩短,听众可以听到声音时,才会被再次播放。这里面所指的足够远就是最大距离。最大距离是声源的属性

最小距离(Min distance):
同样道理,当距离越短时,声源的音量会不断提高,如果距离足够近甚至重逢时,声音的分贝将远远超出音箱所能播出的范围,因此这里引进了最小距离的概念,用户设定最小距离后,如果距离小于最小距离时,那么音量还是按最小距离计算,这样实际上是间接设置了一个音量上限。最小距离是声源的属性

关于最大距离和最小距离您可以参照图1,这样可能会帮助您理解。

图1

===============华丽的分割线===============

多普勒效应(Doppler Factor):
多普勒效应是物理学中的经典理论,由克里斯丁·多普勒于1842年提出。多普勒效应讲述当声源与听众之间的距离在不断缩小时,那么听众听到的声音的频率将不断变高;反之,如果距离扩大,则频率会减低。当然,用户不必知道这其中原理,只需要设置频率的改变强度——多普勒因子就可以了。多普勒效应是听众的属性

衰减效应(Rolloff Factor):
声音在介质中传播,必将受到阻力的干扰,阻力会使声音出现衰减现象,即声音强度不断减低,直至被忽略。我们可以通过衰减因子来设定虚拟空间中的阻力强度,例如水中的衰减因子与空气中的不同,这样,我们就可以更加真实地模拟出空间场景了。衰减效应是听众的属性

锥形效应(Cone Factor):
如果用户设置了声源,而且这个声源拥有方向,那么,这个声音会对其指定方向(Cone Orientation)的锥形范围形成声音辐射。声音锥分内锥与外锥,内锥有一个内锥角(Inside Cone Angle),外锥则有外锥角(Outside Cone Angle)这与最大距离和最小距离是同样道理的,在内锥中听到的声音是最大音量,在内锥与外锥之间声音由锥外声音(Cone Outside Volume)。 过渡到最大音量,而外锥的声音将永远是锥外声音。 锥形效应请参考图2。

图2

===============华丽的分割线===============

最后需要注意的是:DS3D只能播放单声道的声音!

好了,理论知识准备完毕,下一次开始实践

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr