摘要:VRML語言是一種建模語言,廣泛應用于虛擬實驗中。本文介紹如何利用VRML語言實現幻燈機的虛擬實驗。
關鍵詞:VRML;虛擬實驗;幻燈機
中圖分類號:TP393文獻標識碼: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)即虛擬現實建模語言,是一種用于建立真實世界的場景模型或人們虛構的三維世界的場景建模語言,具有平臺無關性,是目前虛擬實驗制作的主流語言。VRML的對象稱為節點,子節點的集合可以構成復雜的景物。節點可以通過實例得到復用,對它們賦以名字,進行定義后,即可建立動態的VR(虛擬世界)。
虛擬現實的三大特點就是沉浸感、交互性、構想性。VRML不僅支持數據和過程的三維表示,而且能提供帶有音響效果的節點,用戶能走進視聽效果十分逼真的虛擬世界。用戶能與虛擬對象交互,并得到相應的反饋信息,就像在真實的實驗環境中,為用戶帶來了全新的感受。
2 幻燈機虛擬實驗的設計
2.1 創建虛擬實驗環境的VR界面
構建逼真三維效果的空間場景和實體。這些場景和實體與真實世界的幾何特征和物理特性基本相同,提供實驗環境和進行實驗操作的虛擬空間。實驗者在進行實驗時,能夠體驗到具有基本真實感的三維視覺空間。本虛擬實驗室需要進行建模的實驗實體有實驗室場景(包括墻壁、地面、頂棚、燈光、實驗臺)、幻燈機、幻燈片、銀幕。
2.2 設計并實現基于VRML的幻燈機操作功能
這是實現系統功能的主要部分。實驗者在虛擬實驗環境中完成幻燈機實驗的各個環節。操作功能包括連接電源、放置幻燈片、調焦、換片等。
2.3 實驗組成部分
該實驗包括以下幾個部分:正確放置幻燈片、連接電源、調焦、換片。
3 幻燈機虛擬實驗的實現
這里以直線盒式幻燈機為例。
3.1 實驗器材的設計
實驗器材包括實驗臺、銀幕、幻燈機三部分。有兩種方法可以實現。一是直接用VRML語言創作,主要用到了Transform、Shape節點;二是用3DMAX制作完之后,導出VRML文件格式,再對其中的一些錯誤進行修改。這里采用VRML語言直接編輯,幻燈機的效果如圖1。

3.2 正確放置幻燈片
幻燈機就是利用凸透鏡當物體距透鏡的距離大于一倍焦距而小于二倍焦距時成倒立、放大的實像這個原理制成的。當幻燈片離鏡頭的距離在一倍焦距和二倍焦距之間,用強光照射幻燈片時,就可以在屏幕上得到倒立、放大的實像。為了使得到的像成為“正立”的,所以要把幻燈片上下顛倒放置。幻燈片的初始位置在實驗臺上,在幻燈片上加一個接觸傳感器,當單擊幻燈片時,便出現一個動畫,演示如何放置幻燈片。制作這個動畫較簡單,這里不再贅述。
3.3 連接電源
放好幻燈片后,需要接通電源,開始實驗。電源的連接操作應該是將電源插頭插入插座。為了實現連接電源,有兩種方式:一是電源導線由無到有的顯示;二是做一個動畫,將電源插頭插入插座的過程進行模擬。兩種方式都可以。這個相對來說也簡單,重點開發的是下面兩方面。
3.4 調焦
根據成像公式1/f=1/u+1/v(u、v、f分別代表像距、物距、焦距),幻燈機的放置位置不一樣,在銀幕上成的像的清晰度就不一樣。所以需要調焦。調焦動畫的模擬是這樣的:當單擊鏡頭左半部分時,鏡頭向左轉動、向后移動;單擊鏡頭右半部分時,鏡頭向右轉動、向前移動。為使動畫模擬更逼真,鏡頭的轉動應具有繼承性,這就需要兩個變量分別記錄上次轉動的角度及距離,然后再加上本次轉動的角度及距離,使動畫具有了繼承性。還有一點,那就是在鏡頭轉動的過程中,物距發生變化,像距也隨之發生變化,那么,幻燈片能否在銀幕上成清晰的像也在變化。為了實現成像的清晰度的變化的模擬,采用了在銀幕前加一個很薄的方體,設置為白色,通過改變其透明度屬性(transparency),來改變成像的清晰度。主要代碼及注釋如下:
DEF tiaojiaocontrol Script {
eventInSFFloatjingtoutimefraction#時間片段
eventInSFVec3fjingtoutouchpoint#接收點擊點位置的入事件
eventInSFTime jingtoustarttime#點擊的開始時間
eventOut SFRotation jingtourotation#轉動角度的出事件
eventOut SFVec3f jingtouqianhouyidong#鏡頭前后移動的距離
eventOut SFFloat jiaoju#改變銀幕成像的清晰度
field SFVec3f touchpoint 0 0 0#判斷點擊位置的中間變量
field SFFloat jtzd 0#記錄上次轉完后,所處的角度
field SFFloat qianzd 0#記錄上次轉過的角度
field SFFloat houzd 0#記錄本次轉過的角度
field SFFloat juli 0#記錄上次轉完后,所處的位置
field SFFloat qianydjuli 0#記錄上次移動的距離
field SFFloat houydjuli 0#記錄本次移動的距離
url \"javascript:
function jingtoustarttime(value){
qianzd=jtzd;
houzd=0;//在本次轉動之前,先將其置零 ,使其具有繼承性
qianydjuli=juli;
houydjuli=0;
}
function jingtoutouchpoint(value){touchpoint=value;}
function jingtoutimefraction(value){
houzd=houzd+0.002;
houydjuli=houydjuli+.002;
if(touchpoint[0]<0.035) { //向左轉
jingtourotation[0]=0;jingtourotation[1]=0;jingtourotation[2]=1;
jingtourotation[3]=qianzd+houzd*1.57; //本次轉動后的角度
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 換片操作
在進行幻燈機操作時,需要按下一個按鈕來換上下一個幻燈片,這是換片操作。這個操作包括兩部分:一是直線盒要往前移動一個格,導桿將幻燈片推入鏡頭的后面,二是銀幕上的像也要作相應的變化。主要代碼如下:
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 總結
這里只是實現了幻燈機虛擬實驗的部分主要功能。還有擴展的地方,如成像原理模擬、內部結構模擬、實驗方式、其他型號幻燈機功能的模擬等。這里不能一一細述,有待以后進一步完善。
參考文獻:
[1] 段新昱.虛擬現實基礎與VRML編程[M].北京:高等教育出版社,2004.
[2] 陸昌輝.使用VRML與JAVA創新網絡虛擬環境[M].北京:北京大學出版社,2003.
收稿日期:2008-03-12