摘要:VRML語言是一種建模語言,廣泛應(yīng)用于虛擬實(shí)驗(yàn)中。本文介紹如何利用VRML語言實(shí)現(xiàn)幻燈機(jī)的虛擬實(shí)驗(yàn)。
關(guān)鍵詞:VRML;虛擬實(shí)驗(yàn);幻燈機(jī)
中圖分類號:TP393文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)12-20ppp-0c
The Design and Realization of Virtual Experiment of the Slide Projector Based on VRML
XIN Yun-dong
(The Information and Technology Department of Jining College, Qufu 273155, China)
Abstract: The VRML is a Modeling Language, which is applied in virtual experiment widly. The virtual experiment of slide projector is realized in VRML language.
Key words: VRML; Virtual experiment; Slide projector
1 VRML語言介紹
VRML(Virtual Reality Modeling Language)即虛擬現(xiàn)實(shí)建模語言,是一種用于建立真實(shí)世界的場景模型或人們虛構(gòu)的三維世界的場景建模語言,具有平臺無關(guān)性,是目前虛擬實(shí)驗(yàn)制作的主流語言。VRML的對象稱為節(jié)點(diǎn),子節(jié)點(diǎn)的集合可以構(gòu)成復(fù)雜的景物。節(jié)點(diǎn)可以通過實(shí)例得到復(fù)用,對它們賦以名字,進(jìn)行定義后,即可建立動態(tài)的VR(虛擬世界)。
虛擬現(xiàn)實(shí)的三大特點(diǎn)就是沉浸感、交互性、構(gòu)想性。VRML不僅支持?jǐn)?shù)據(jù)和過程的三維表示,而且能提供帶有音響效果的節(jié)點(diǎn),用戶能走進(jìn)視聽效果十分逼真的虛擬世界。用戶能與虛擬對象交互,并得到相應(yīng)的反饋信息,就像在真實(shí)的實(shí)驗(yàn)環(huán)境中,為用戶帶來了全新的感受。
2 幻燈機(jī)虛擬實(shí)驗(yàn)的設(shè)計
2.1 創(chuàng)建虛擬實(shí)驗(yàn)環(huán)境的VR界面
構(gòu)建逼真三維效果的空間場景和實(shí)體。這些場景和實(shí)體與真實(shí)世界的幾何特征和物理特性基本相同,提供實(shí)驗(yàn)環(huán)境和進(jìn)行實(shí)驗(yàn)操作的虛擬空間。實(shí)驗(yàn)者在進(jìn)行實(shí)驗(yàn)時,能夠體驗(yàn)到具有基本真實(shí)感的三維視覺空間。本虛擬實(shí)驗(yàn)室需要進(jìn)行建模的實(shí)驗(yàn)實(shí)體有實(shí)驗(yàn)室場景(包括墻壁、地面、頂棚、燈光、實(shí)驗(yàn)臺)、幻燈機(jī)、幻燈片、銀幕。
2.2 設(shè)計并實(shí)現(xiàn)基于VRML的幻燈機(jī)操作功能
這是實(shí)現(xiàn)系統(tǒng)功能的主要部分。實(shí)驗(yàn)者在虛擬實(shí)驗(yàn)環(huán)境中完成幻燈機(jī)實(shí)驗(yàn)的各個環(huán)節(jié)。操作功能包括連接電源、放置幻燈片、調(diào)焦、換片等。
2.3 實(shí)驗(yàn)組成部分
該實(shí)驗(yàn)包括以下幾個部分:正確放置幻燈片、連接電源、調(diào)焦、換片。
3 幻燈機(jī)虛擬實(shí)驗(yàn)的實(shí)現(xiàn)
這里以直線盒式幻燈機(jī)為例。
3.1 實(shí)驗(yàn)器材的設(shè)計
實(shí)驗(yàn)器材包括實(shí)驗(yàn)臺、銀幕、幻燈機(jī)三部分。有兩種方法可以實(shí)現(xiàn)。一是直接用VRML語言創(chuàng)作,主要用到了Transform、Shape節(jié)點(diǎn);二是用3DMAX制作完之后,導(dǎo)出VRML文件格式,再對其中的一些錯誤進(jìn)行修改。這里采用VRML語言直接編輯,幻燈機(jī)的效果如圖1。
3.2 正確放置幻燈片
幻燈機(jī)就是利用凸透鏡當(dāng)物體距透鏡的距離大于一倍焦距而小于二倍焦距時成倒立、放大的實(shí)像這個原理制成的。當(dāng)幻燈片離鏡頭的距離在一倍焦距和二倍焦距之間,用強(qiáng)光照射幻燈片時,就可以在屏幕上得到倒立、放大的實(shí)像。為了使得到的像成為“正立”的,所以要把幻燈片上下顛倒放置?;脽羝某跏嘉恢迷趯?shí)驗(yàn)臺上,在幻燈片上加一個接觸傳感器,當(dāng)單擊幻燈片時,便出現(xiàn)一個動畫,演示如何放置幻燈片。制作這個動畫較簡單,這里不再贅述。
3.3 連接電源
放好幻燈片后,需要接通電源,開始實(shí)驗(yàn)。電源的連接操作應(yīng)該是將電源插頭插入插座。為了實(shí)現(xiàn)連接電源,有兩種方式:一是電源導(dǎo)線由無到有的顯示;二是做一個動畫,將電源插頭插入插座的過程進(jìn)行模擬。兩種方式都可以。這個相對來說也簡單,重點(diǎn)開發(fā)的是下面兩方面。
3.4 調(diào)焦
根據(jù)成像公式1/f=1/u+1/v(u、v、f分別代表像距、物距、焦距),幻燈機(jī)的放置位置不一樣,在銀幕上成的像的清晰度就不一樣。所以需要調(diào)焦。調(diào)焦動畫的模擬是這樣的:當(dāng)單擊鏡頭左半部分時,鏡頭向左轉(zhuǎn)動、向后移動;單擊鏡頭右半部分時,鏡頭向右轉(zhuǎn)動、向前移動。為使動畫模擬更逼真,鏡頭的轉(zhuǎn)動應(yīng)具有繼承性,這就需要兩個變量分別記錄上次轉(zhuǎn)動的角度及距離,然后再加上本次轉(zhuǎn)動的角度及距離,使動畫具有了繼承性。還有一點(diǎn),那就是在鏡頭轉(zhuǎn)動的過程中,物距發(fā)生變化,像距也隨之發(fā)生變化,那么,幻燈片能否在銀幕上成清晰的像也在變化。為了實(shí)現(xiàn)成像的清晰度的變化的模擬,采用了在銀幕前加一個很薄的方體,設(shè)置為白色,通過改變其透明度屬性(transparency),來改變成像的清晰度。主要代碼及注釋如下:
DEF tiaojiaocontrol Script {
eventInSFFloatjingtoutimefraction#時間片段
eventInSFVec3fjingtoutouchpoint#接收點(diǎn)擊點(diǎn)位置的入事件
eventInSFTime jingtoustarttime#點(diǎn)擊的開始時間
eventOut SFRotation jingtourotation#轉(zhuǎn)動角度的出事件
eventOut SFVec3f jingtouqianhouyidong#鏡頭前后移動的距離
eventOut SFFloat jiaoju#改變銀幕成像的清晰度
field SFVec3f touchpoint 0 0 0#判斷點(diǎn)擊位置的中間變量
field SFFloat jtzd 0#記錄上次轉(zhuǎn)完后,所處的角度
field SFFloat qianzd 0#記錄上次轉(zhuǎn)過的角度
field SFFloat houzd 0#記錄本次轉(zhuǎn)過的角度
field SFFloat juli 0#記錄上次轉(zhuǎn)完后,所處的位置
field SFFloat qianydjuli 0#記錄上次移動的距離
field SFFloat houydjuli 0#記錄本次移動的距離
url \"javascript:
function jingtoustarttime(value){
qianzd=jtzd;
houzd=0;//在本次轉(zhuǎn)動之前,先將其置零 ,使其具有繼承性
qianydjuli=juli;
houydjuli=0;
}
function jingtoutouchpoint(value){touchpoint=value;}
function jingtoutimefraction(value){
houzd=houzd+0.002;
houydjuli=houydjuli+.002;
if(touchpoint[0]<0.035) { //向左轉(zhuǎn)
jingtourotation[0]=0;jingtourotation[1]=0;jingtourotation[2]=1;
jingtourotation[3]=qianzd+houzd*1.57; //本次轉(zhuǎn)動后的角度
if(juli<=.2){jingtouqianhouyidong[0]=0;jingtouqianhouyidong[1]=0;
jingtouqianhouyidong[2]=qianydjuli+houydjuli;
if(jingtouqianhouyidong[2]<=.1){jiaoju=jingtouqianhouyidong[2]*10;}
else{jiaoju=2-jingtouqianhouyidong[2]*10;}
}
}
else{……}
jtzd=jingtourotation[3];
juli=jingtouqianhouyidong[2];
}\"
}
#鏡頭變動
ROUTE jingtoutouch.isActive TO jingtoutime.set_enabled
ROUTE jingtoutouch.touchTime TO tiaojiaocontrol.jingtoustarttime
ROUTE jingtoutime.fraction_changed TO tiaojiaocontrol.jingtoutimefraction
ROUTE tiaojiaocontrol.jingtourotation TO jingtouti.set_rotation
ROUTE tiaojiaocontrol.jingtouqianhouyidong TO jingtouti.translation
ROUTE jingtoutouch.hitPoint_changed TO tiaojiaocontrol.jingtoutouchpoint
ROUTE tiaojiaocontrol.jiaoju TOqingxidu.transparency
效果如圖2、圖3。
3.5 換片操作
在進(jìn)行幻燈機(jī)操作時,需要按下一個按鈕來換上下一個幻燈片,這是換片操作。這個操作包括兩部分:一是直線盒要往前移動一個格,導(dǎo)桿將幻燈片推入鏡頭的后面,二是銀幕上的像也要作相應(yīng)的變化。主要代碼如下:
DEF piankongzhi Script {
eventInSFTime huanpiananxia
eventOut SFVec3f pian1dong
……
eventOut SFVec3f pian10dong
eventOut SFVec3f dihedong
eventOut MFString urlchange
field SFVec3f piandi1weizhi -.12 .066 -0.2
……
field SFVec3f piandi10weizhi -.12 .066 0.16
field SFVec3f fangpian1weizhi .15 0 0
……
field SFVec3f fangpian10weizhi .15 .0 -0.36
field SFVec3f huipian1weizhi 0 0 0
……
field SFVec3f huipian10weizhi 0 0 -0.36
field SFInt32 cishu 0
url \"javascript:
function huanpiananxia(){
cishu+=1;
if(cishu==1){pian1dong=fangpian1weizhi;
dihedong=piandi1weizhi;
urlchange[0]='huandengji1.jpg';
}
……
if(cishu==10){pian10dong=fangpian10weizhi;
pian9dong=huipian9weizhi;
dihedong=piandi10weizhi;
urlchange[0]='huandengji2.jpg';
}
}\"
}
ROUTE huanpiananniu.touchTime TO piankongzhi.huanpiananxia
ROUTE piankongzhi.pian1dong TO huandengpian1.translation
……
ROUTE piankongzhi.pian10dong TOhuandengpian10.translation
ROUTE piankongzhi.dihedong TO pianjidizuo.translation
效果如圖4、圖5。
5 總結(jié)
這里只是實(shí)現(xiàn)了幻燈機(jī)虛擬實(shí)驗(yàn)的部分主要功能。還有擴(kuò)展的地方,如成像原理模擬、內(nèi)部結(jié)構(gòu)模擬、實(shí)驗(yàn)方式、其他型號幻燈機(jī)功能的模擬等。這里不能一一細(xì)述,有待以后進(jìn)一步完善。
參考文獻(xiàn):
[1] 段新昱.虛擬現(xiàn)實(shí)基礎(chǔ)與VRML編程[M].北京:高等教育出版社,2004.
[2] 陸昌輝.使用VRML與JAVA創(chuàng)新網(wǎng)絡(luò)虛擬環(huán)境[M].北京:北京大學(xué)出版社,2003.
收稿日期:2008-03-12