CSDN博客

img allencnj1980

基于VRML的虚拟音乐厅

发表于2003/5/18 11:05:00  1379人阅读

基于VRML的虚拟音乐厅

一.VRML简介
   有没有见过三维网页,有没有见过网上商店的3D展示品,是不是感叹它们的真实感强,引人入胜?其实很多就是用VRML做的,VRML(Virtual Reality Modeling Language)是一种与互联网结合,用来描述三维交互世界的程序语言,可应用于创建虚拟现实的对象、景象和展示模型等。但是我们今天要做的不是虚拟3D网页,而是虚拟3D音乐厅,一个属于你自己的"虚拟音乐厅",怎么样?心动吧,心动不如行动,跟我来吧!:)

二.准备工作
   "磨刀不误砍材工",先来看看我们需要准备些什么:
首先,如果你的浏览器是Netscape的Navaigator的话,恭喜你,你不需要装任何插件就可浏览vrml网页;但是,如果是IE的话,还要装外挂程序,如ParallelGraphics公司开发的Cortona,或platinum公司开发的Cosmo Player,可以到上"华军软件园"down,网址是:http://www.onlinedown.net.安装过程就像装flash插件一样简单.
还要准备好Broland公司的最新"利器"--Delphi7.
好,"万事具备,只欠东风",现在就开始:

三.具体实现过程
   打开Delphi7.0,新建一个Project,在Form上添加一个Button,按钮的Caption属性设为"打开音频文件";再添加一个OpenDialog控件,用于打开音频文件;然后再在控件栏中的Internet项选取WebBrowser控件,WebBrowser控件用于把IE浏览器内置于Form窗体里.
好,现在双击Button1,在里面填入以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
fp : TextFile;//文本文件
CurrentDir : string;//文件路径
sSelectSong:String;//用于组成VRML文件
begin
if OpenDialog1.Execute() then//选择音频文件
begin
sSelectSong:= sSelectSong+'Shape {appearance Appearance {material Material {}} geometry Sphere {radius 0.25}}';
sSelectSong:= sSelectSong+'Sound { source AudioClip { url "';
sSelectSong:= sSelectSong+ExtractFileName( OpenDialog1.FileName) ;//打开音频文件
sSelectSong:= sSelectSong+'" loop TRUE } ';
sSelectSong:= sSelectSong+' maxBack '+'10.0';
sSelectSong:= sSelectSong+' maxFront '+'10.0';
sSelectSong:= sSelectSong+' minBack '+'5';
sSelectSong:= sSelectSong+' minFront '+'6';
sSelectSong:= sSelectSong+'spatialize FALSE}';
//产生.vrml文件,并调用IE浏览器播放
AssignFile(fp, 'wrltestfile.wrl');//指定生成vrml的文件名
Rewrite(fp);
Writeln(fp,'#VRML V2.0 utf8');
Writeln(fp,sSelectSong); //写入vrml代码
CloseFile(fp);
GetDir(0,CurrentDir);//取文件路径
WebBrowser1.Navigate(CurrentDir+'/wrltestfile.wrl');
end
end;

   简单吧,好,现在就运行看看.

四.运行与扩展程序
   运行后,按"打开音频文件"选择.WAV或.MIDI音频文件播放(注意是.WAV或.MIDI文件,.MP3文件经笔者测试有些机子可以播放,有些不能,因为VRNL2.0标准只支持这两种音频格式和MPEG视频格式),用你的鼠标在上面前后或左右地慢慢拖动,你会感觉到声音的变化,好好地体会体会,是不是跟现实的声音传播一样真实啊?
但是,这时候的场景是非常简单的,里面只有一个圆球,四周漆黑一遍(姑且想象成在茫茫宇宙中吧:)),如果你已经熟悉VRML语法的话,你可以做出更加漂亮的场景,这样你在你自己做的场景里面听心爱的音乐,在里面走动,音乐随着你的走动在不断改变...
笔者通过对上面程序的扩展,作成一个完整的虚拟音乐播放器--虚拟音乐厅,并且参加广东省的高校杯获得一等奖,我想各位也可以通过扩展做一个属于自己的"虚拟音乐厅"..怎样扩展呢?其实通过以上程序的运行会产生一个名为wrltestfile.wrl的文件,包含以下vrml代码:

(1) #VRML V2.0 utf8
(2) Shape {
(3) appearance Appearance {material Material {}}
(4) geometry Sphere {radius 0.25}}
(5) Sound {source AudioClip {url "jita.WAV" loop TRUE }
(6) maxBack 10.0 maxFront 10.0 minBack 5 minFront 6
(7) spatialize FALSE
(8) }

   也许有人会奇怪,这么一点代码就能做成上面的效果?秘密就在我们一开始装的vrml的插件,这些插件就有如一个游戏引擎一样重要,它借助浏览器执行VRML代码.让我们来分析以下上面的VRML代码吧,其实,上面的8句代码,我们在程序里面都有出现,只是第五句有点不同,对啦,就是加入了"jita.WAV",这是我们通过OpenDialog引入的外部.WAV音频文件.聪明的你可能想到了,通过改变或增加其他VRML代码,不是可以达到个丰富的互动效果吗,完全正确!你可以通过改变第四句的radius来改变圆球的大小,或者把圆球改成其他形状(例如做个音箱),你可以通过改变第六句的 maxBack , maxFront ,minBack和minFront来改变声源的扩展方向扩展范围,另外还可以通过在第八句的后面添加一下代码来加入你喜欢的场景背景图案:

(9) Background
(10) {
(11) frontUrl "bgsky.jpg"
(12) backUrl "bgsky.jpg"
(13) leftUrl "bgsky.jpg"
(14) rightUrl "bgsky.jpg"
(15) topUrl "bgsky.jpg"
(16) bottomUrl "bgsky.jpg"
(17) }

   分析一下就知道,第(11)句加入场景中的前背景图片,第(12)句加入场景中的后背景图片,第(13)句加入场景中的左背景图片,第(14)句加入场景中的右背景图片,第(15)句加入场景中的上背景图片,第(16)句加入场景中的底背景图片,我在这里加入的图片是前后上下都一样的,你可以随意加入自己喜欢的图片,当然你的图片要放在程序本目录下.
当然你还可以加入其他的东东,加入其他的互动效果.例如要做成一个完整的播放器还要有菜单选择,播放暂停,换歌等功能,另外,你还可以定制多个声源点("音箱"),方法就是添加多个sound节点,例如你可以在上面代码的基础上添加一个背景声音(如鸟叫声)的代码:

Sound {source AudioClip {url "bird.WAV" loop TRUE }

   然后分别调节maxBack , maxFront ,minBack和minFront,就可以出来很好的效果,但是要提醒的是增加过多的声源点将会导致占用资源过多,从而拖满你的机子哦,而且会出现重叠音现象.
充分发挥你的想象力吧,只要你知道了VRML的一些基本原理和知识,然后遵从以上的方式,没有你做不到的,只有你想不到的.

 

0 0

相关博文

我的热门文章

img
取 消
img