虚拟现实基础与VRML编程主讲何东健第9章VRML声音技术第9章VRML声音技术VRML虚拟环境中立体音效的产生是通过在场景中添加Sound、AudioClip以及MovieTexture节点加以实现的。AudioClip、MovieTexture节点用以创建音源,Sound节点则用以创建声场并指定声音的播放方式。VRML场景中可引用的数字声音文件类型有WAV、MIDI、MPEG-l三种格式。9.1音源节点9.1.1AudioClip节点AudioClip节点用于提供音源信息,其域值指明从哪里可以获得一个预先录制好的声音文件以及播放时如何加以控制。AudioClip节点仅能出现在声音节点Sound的source域中。AudioClip节点语法格式如下:AudioClip{url[]#exposedFieldMFStringdescription“”#exposedFieldSFStringloopFALSE#exposedFieldSFBoolpitch1.0#exposedFieldSFFloatstartTimeO.0#exposedFieldSFTimestopTime0.0#exposedFieldSFTimeduratio_changed#eventOutSFTimeisActive#eventOutSFBool}(1)url域:指定一个由高到低优先级排列的声音文件url列表,指明声音文件的具体位置。VRML在装入一个高优先级的声音文件的同时浏览器可以播放一个低优先级的声音文件。AudioClip节点支持的数字声音文件类型有WAV和MIDI两种格式。(2)description域的域值:设置用以描述所引用声音的文本字符串。实际使用时根据浏览器的不同,可在浏览器播放该声音文件的同时显示此描述;或在不能播放该声音文件时显示此描述,以说明该声音文件,就如同网页中由于不能显示一张图片而代之以文字说明一样。该域值缺省为一个空串。(3)loop域的域值:指定是否循环播放所引用的声音文件。如果该域值为TRUE,视startTime和stopTime的情况,无限循环播放或循环播放直到stopTime为止;如果该域值为FALSE,视startTime和stopTime的情况,播放一周期后停止,或播放不到一周期,在stopTime处停止。(4)pitch域的域值:指定音调因子,用以加快或减慢声音的播放速度。当该域值在0.0和1.O之间时,音调降低,声音播放速度减慢;当该域值为1.0时,声音正常播放;当该域值大于1.0时,音调升高,声音播放速度加快。该域值缺省为1.0。(5)startTime域的域值:指定所引用声音文件开始播放的时间,该时间是以格林威治时间1970年1月1日午夜12时开始计时,并以秒为单位的时间值。该域值缺省为0.0秒。当声音正在播放时,set_startTime事件将被忽略。(6)stopTime域的域值:指定所引用声音文件结束播放的时间,与startTime域相对应。该域值缺省为O.O秒。loop、startTime、stopTime、pitch域共同控制着AudioClip节点的声音播放模式,其综合效果见表9.1。loop域值startTime、stopTime、pitch域值之间的关系作用效果TRUEstopTime≤startTime无限循环播放TRUEstartTimestopTime循环播放直到stopTime为止FALSEstopTime≤startTime播放一周期后停止FALSEstartTime(startTime+duration/pitch)≤stopTime播放一周期后停止FALSEstartTimestopTime(startTime+duration/pitch)播放不到一周期,在stopTime处停止9.1.2MovieTexture节点MovieTexture节点用于设置一个电影纹理以及将该纹理映射至几何体表面时所需要的映射参数和控制播放参数。MovieTexture节点主要有两方面的作用,作为电影纹理对造型进行纹理映射以及进行纹理映射的同时同步产生电影伴音。该节点通常用做Appearance节点texture域的域值,产生伴音时则用做Sound节点source域的域值。MovieTexture节点已经学习过。不再赘述。9.2声音节点AudioClip节点和MovieTexture节点的功能在于创建音源,但音源必须作为Sound节点中source域的域值出现,才能够在VRML,场景中渲染音效。Sound声音节点主要用于在VRML环境中生成声场及声音发射器。该节点通过指定各种声音播放参数,以指定场景中声源的位置以及声音的立体化表现形式。VRML中的虚拟声源可以位于局部坐标系中的任意位置,并以球面或椭球面的模式发射声音。声音既可以是立体声表现形式,也可以是非立体声表现形式。Sound{sourceNULL#exposedFieldSFNodelocation0.00.00.0#exposedFieldSFBooldirection0.00.01.0#exposedFieldSFBoolintensity1.0#exposedFieldSFFloatmaxBack10.0#exposedFieldSFFloatmaxFront10.0#exposedFieldSFFloatminBack1.0#exposedFieldSFFloatminFront1.0#exposedFieldSFFloatpriority1.0#exposedFieldSFFloatSpatializeTRUE#exposedFieldSFBool}(1)source域的域值:为VRML场景播放声音提供音源。其域值可以为AudioClip节点或MovieTexture节点之一。该域值缺省为NULL。(2)location域的域值:指定声音发射器在当前坐标系中的实际位置。该域值缺省为(O.O0.00.0),即当前坐标系的原点。(3)direction域的域值:指定声音发射器在VRML世界中的空间朝向,即设置声音发射器发射声音的方向矢量。该矢量由三个浮点数组成,分别表示一个三维向量的X、Y、Z值。该域值缺省为(0.00.01.0),即默认指向z轴正方向,即用户方向。(4)intensity域的域值:指定声音的强度,即音量。该域值在0.O到1.O之间的范围内变化时,1.O表示音量最大,为声音文件建立时的全音量;0.0表示静音。该域值缺省为1.0。(5)maxBack域的域值:指定在当前坐标系中,从声音发射器所在location沿direction域所指方向的相反方向假想的直线距离,超过此距离将无法听到声音。该域值要求大于或等于0.0,缺省为10.O。(6)maxFront域的域值:指定在当前坐标系中,从声音发射器所在location沿direction域所指方向的假想直线距离,超过此距离将无法听到声音。该域值要求大于或等于O.0,缺省为10.0。(7)minBack域的域值:指定从声音发射器所在location沿direction域所指方向的相反方向假想的直线距离,超过此距离则声音开始衰减,直到maxBack域指定距离处,音量衰减为0.0。该域值要求大于或等于0.0,缺省为1.O。(8)minFront域的域值:指定在当前坐标系中,从声音发射器所在location沿direction域所指方向的假想直线距离,超过此距离则声音开始衰减,直到maxFront域指定距离处,音量衰减为0.0。该域值要求大于或等于0.0,缺省为1.O。(9)priority域的域值:确定该声音发射器的发射优先级。取值范围为0.0到1.O,1.0表示最高优先级,0.0表示最低优先级。该域值缺省为0.0。(10)spatialize域的域值:是否进行声音立体化处理,以使浏览者可以实际辨认声音发射器在三维空间中的具体位置。该域值指明声音是作为空间点播放(域值为TRUE,此时可以辨认音源),还是作为环境声播放(域值为FALSE,此时无法辨认音源)。该域值缺省为TRUE。Sound节点中,location、direction、maxBack、maxFront、minBack、minFront域共同作用,在VRML世界中设置了两个不可见的代表声音传播范围的椭圆球,minBack和minFront域定义了一个内椭圆球,maxBack和maxFront域定义了一个外椭圆球,如图9.1所示。当位于最小范围椭圆球内时,由于距声音发射器较近,所听到的声音强度最大,且处处相等;当位于最小与最大范围椭圆球之间时,距声音发射器越远,所听到的声音强度越小,直到最大范围椭圆球边缘处,声音强度衰减为零;当浏览者位于最大范围椭圆球之外时,将无法听到该声音发射器发出的声音。声音强度变化规律可用图9.1中的直角坐标系形象地表示出来。其中,P1、P2、P3三点分别代表最小范围椭圆球内、最小范围椭圆球与最大范围椭圆球之间、最大范围椭圆球之外的空间中的一点,横坐标为距离,纵坐标为声音强度。一般情况下,为了产生真实的衰减效果,应将maxBack域值设置为minBack域值的10倍,同时将maxFront域值设置为minFront域值的10倍。如果其比值大于10,则衰减相对缓慢;若比值小于10,则衰减相对迅速。9.3声音技术示例例9.1立体化声音(vr9_1.wrl)本例创建了三个几何造型。中心的红球代表音源所在的位置,两个经过旋转的圆柱顶面代表音场。较大的圆柱顶面(粉色)半径为6.0,与Sound节点maxFront、MaxBack域值相同;较小的圆柱顶面(黄色)半径为1.0,与Sound节点minFront、minBack域值相同。本例在浏览器中渲染时的场景效果如图9.2所示。使用控制按钮逐渐向场景上方移动,不断靠近红色音源球,声音效果逐渐体现并增强。此时若使用控制按钮逐渐向场景左侧或右侧移动,沿两个方向不断偏离红色音源球,可以明显感觉声音效果逐渐减弱;此时若仔细聆听左右扬声器发出的声音大小,还可以明确辨认音源是在当前观察位置的右侧或左侧,这就是Sound节点spatialize域值设置为TRUE的功效。思考:尝试改变spatialize域值为FALSE,看是否还能明确辨认音源位置?例9.2MIDI和WAV格式文件的播放音效(vr9_2.wrl)本例在场景中创建了2个Box音箱造型,分别位于x轴的-3.0和3.0处。一个播放MIDI音乐,一个播放WAV音乐。渲染时的场景效果如图9.3所示。使用控制按向场景上方移动,不断靠近两音箱的中间位置,可以同时聆听到两个不同的音源所播放的MIDI和WAV音乐。使用一控制按钮直接单击左音箱,可以聆听到加强的MIDI音乐;单击按钮取消移动,再使用控制按钮直接单击右音箱,可以聆听到加强的WAV铃声音乐。例9.3虚拟有声电影(vr9_3.wrl)MovieTexture节点既可用做Appearance节点中的texture域值,以指定纹理映射属性;也可用做Sound节点中的source域值,以描述含有声音的影像文件。为了使音频和视频同步输出,首先必须使用DEF语句对MovieTexture节点加以定义,然后将其作为纹理和音源域值使用,从而同步产生影像及虚拟立体声伴音的虚拟电影效果。本例在浏览器中播放时的场景如图9.4所示。