吳 迪,吳億維,劉 軍,徐 朋,王彥春,李學慧
(1.大連大學 物理科學與技術學院,遼寧 大連116622;2.東北大學 機械工程與自動化學院,遼寧 沈陽110819)
目前許多學校設立了大學物理實驗網站,學生可以利用業余時間登陸網站學習實驗原理、操作.但問題是目前的網站多半是文字敘述加上儀器圖片展示,或有動畫描述實驗過程,而這一過程也是事先由程序編制者設定好的,只能按照一定的路線執行,與實際實驗相差甚遠.
虛擬現實(virtual reality)是計算機模擬的三維環境,是一種可以創建和體驗虛擬世界的計算機系統.虛擬環境是由計算機生成的,用戶可以通過計算機進入這個環境并能操縱系統中的對象并與之交互[1-3].VRML是第二代 Web上的關鍵技術,是一種三維場景的描述性語言,也是在Internet網上實現虛擬現實的關鍵性技術[4-8].在Internet上傳輸很少的數據,就可以在Web上實現三維虛擬場景瀏覽功能,克服了一般三維模擬軟件的缺點.因而采用VRML開發三維虛擬實驗應是解決這些問題的一種較好的方法[9-11].首先虛擬現實是三維的、立體的,是符合人們日常生活習慣的,學生可沉浸在實驗之中;其次虛擬環境中學生不是被動地感受,而是可以通過自己的活動改變感受的內容.采用VRML技術開發的三維虛擬現實實驗可以不受時間和地域限制,學生或教師可以自由地、無顧慮地隨時進入虛擬實驗室操作儀器,而他只需在聯網的計算機瀏覽器上安裝 VRML插件,如Cosmoplayer,Cortona或Blaxxun Contact等任意一種就可以進行各種實驗.顯然虛擬現實實驗可以給學生更多的思考時間和空間,從實驗儀器的構造到使用方法,從原理到測試公式的創建,再到實驗環境的搭建,完全由學生自行設計、組建.虛擬實驗可以仿真現實實驗,提高學生學習興趣,增加學生分析問題的時間和學習的時間,可以充分調動其主觀能動性.
但目前所開發的項目大多存在交互性弱、沉浸感不強等問題.本文以氣墊導軌上的實驗為例就虛擬實驗中復雜運動的聯動交互控制方法進行了研究.VRML本身不能進行復雜交互,因而對于儀器調整這種復雜交互操作就不能只通過VRML進行.為了實現創建的虛擬空間本身與操作者之間的復雜交互,要利用虛擬空間與操作環境的特定應用之間的接口來實現它與用戶之間的交互,筆者采用JavaScript編程實現這種功能[12-13],討論 VRML中 Script節點的應用,最終建立了具備交互功能的三維虛擬牛頓第二定律的研究和簡諧運動的研究實驗,較好地實現了復雜運動的交互操作與聯動控制.
虛擬場景的聯動是通過節點來實現的.一個節點狀態的變化能引起另一個節點狀態的相應變化.VRML中將狀態的變化記為一個“事件”,引起其他節點變化的節點發出“事件輸出”,發生變化的節點接受“事件輸入”.VRML提供了多種感知器節點,如可接收鼠標點擊形體的動作并使程序發生相應變化如動畫、發出聲音、改變顏色等的TouchSensor節點;可使鼠標的移動轉變成形體的繞坐標軸旋轉運動的CylinderSensor節點;可以檢測到觀察者接近的ProximitySensor節點,利用它們可控制其他操作,如發出聲音,讓形體運動、讓形體顏色變化,等等;還有時間傳感器TimeSensor節點等.
VRML空間中各節點間的數據交互可以實現控制場景中的物體產生一些簡單行為的聯動動作:如打開開關時燈會發光,走近自動門附近門會自動打開,等等.通過路由及感知器節點基本上能夠實現場景的簡單聯動交互.對于復雜的聯動交互控制VRML采用Script節點來實現這種功能.Script節點中的域指定一段實現事件處理的JavaScript腳本,然后將程序計算返回的結果遞交給Script節點的輸出事件,再通過路由將該事件傳遞給場景中某對象的相關域,達到改變場景的目的,實現過程如圖1所示.

圖1 VRML聯動動畫原理圖
大學物理實驗中氣墊導軌上的實驗主要有牛頓第二定律的研究和簡諧運動的研究.虛擬這2個實驗主要是向用戶提供盡可能真實的仿真儀器,可以通過 VRMLPad或vrbuild[14]直接建造三維模型,文件占用字節數較少,適宜在網上運行;也可采用3DMAX或MAYA等軟件建造再轉換成VRML格式文件,但缺點是形成文件太大,影響網上運行速度和運行質量.虛擬的簡諧運動實驗裝置如圖2所示,虛擬的牛頓第二定律實驗裝置如圖3所示.用戶可以利用鼠標拖動光電桿將其擺放在合適的位置上以取得滑塊在相應位置的速度,這個過程是通過人機交互來實現的.VRML允許用戶的行為能夠實時作用于場景,場景節點通過EventIn接收事件,通過Event Out發出事件,通過路由將一個節點的事件出口和另一個節點的事件入口聯系成為事件體系使VRML具有動態交互能力.但VRML語言本身所能完成的交互功能是有限的,要實現復雜聯動交互功能還需要通過腳本語言來實現,VRML提供了一個Script腳本節點,通過該節點可以實現復雜交互操作和邏輯控制等功能.Script節點允許用戶創建自己的域(field)和事件,其中包括入事件(EventIn)和出事件(Event Out),再通過編寫節點內部程序來完成目標功能,它支持多種腳本語言,如 VRMLScript,JavaScript,VBScript等.

圖2 簡諧運動研究

圖3 牛頓第二定律研究
需采用時間傳感器TimeSensor來執行開始、停止或者其他控制動畫的動作.
3.1.1 定義時間傳感器
格式如下:
DEF TS TimeSensor{
cycleInterval 1
loop TRUE
}
時間傳感器通過定時產生事件來表示時間的變化.
3.1.2 事件驅動
場景需要一系列的變化數值而產生動畫,產生變化數值的節點可以是插補器節點或者Script節點.域值通過Route語句傳送,由節點的入事件接收并處理.Script結點在VRML場景中不被顯示,其工作原理如圖1所示.Script結點可以由若干個EventIn,Event Out,包含腳本程序的url域等構成.其中EventIn入事件接收來自其他節點的出事件,并交給對應的同名函數進行處理.url域中的處理函數計算新的值,并通過節點的Event Out發送出去.
#### 實現滑塊的簡諧運動功能的腳本程序 ####DEF Program Script{
field SFFloat amplitude 1.25 #定義振幅
field SFFloat twoPi 0.0 #定義常量
……
url"javascript: #指明腳本
function initialize()#初始化程序
{
初始化滑塊位置等變量
}
function set_start Time(start Time,event Time)#設置開始振動時間
{
x1start Time=start Time;
}
function set_fraction(fraction,time)#實現交互功能函數
{
phase=-20.0;
translation_changed[0]=-2+amplitude*Math.sin
(twoPi*((phase/wavelength)-fraction))+0.05;
translation_changed[1]=0;
translation_changed[2]=2;
}
ROUTE TS.fraction_changed TO Program.set_fraction
Route語句把一個節點的出事件連接到另一個節點的入事件,從而建立起指定節點的域之間的通道.Route語句由出事件激活,當發生1個出事件時,包含該出事件的Route語句被調用,對應的入事件就會接收到信息,同時可以對入事件做出相應的處理.從而改變節點的狀態,實現簡諧運動.
3.2.1 光電桿位置的動態設置
首先使用平面傳感器節點PlaneSensor定義平面傳感器:
DEF gd Transform{
children[
DEF ts0 PlaneSensor{#其中一個光電桿
minPosition -2.0.4
maxPosition -1.1.4
offset 0.01 0 1.72
}
Inline{url"gd1.wrl"}
]
}
其中minPosition和maxPosition用于設定物體在空間的移動范圍.Inline為內聯節點,將另一wrl文件引入,這里gd1.wrl為光電門空間幾何結構文件.
其次定義路由語句實現交互功能:ROUTE ts0.translation_changed TO gd.translation實驗中只要用鼠標拖動光電桿即可在約束的范圍內調整其位置.
3.2.2 光電桿位置的獲得
將光電桿拖動到某一位置后,要想知道滑塊運動到此位置時的速度就需要定量給出光電桿被拖動后的確切位置,通過下述方法實現:
function set_fra0(trackPoint_changed,timeStamp){
xpointer1[0]=trackPoint_changed[0];
}
ROUTE ts0.track Point_changed TO Program.set_fra0
通過路由語句將其中1個拖動后的光電門位置賦給變量xpointer1.
與滑塊一起運動的擋光片上設有具有一定間隔的2個探針,與滑塊一起作簡諧運動,當其中每個探針經過光電門時記錄相應的時間,利用二者的時間差值和2個探針間距即可計算出滑塊經過光電門時的速度.
在function set_fraction(fraction,time)函數中采用語句timexs1=time-x1start Time取得運行時間,在下面函數中記錄滑塊探針經過光電門時的時間.
function set_check1(time1,timeStamp){
if (Math.abs(translation_changedpointer1[0]-
xpointer1[0])<=0.01)
t11=timexs1;
if (Math.abs(translation_changedpointer2[0]-
xpointer1[0])<=0.01)
t12=timexs1;
deltt1=t12-t11;
v1=0.6/Math.abs(deltt1);#計算速度
lblOut.set_string[0]=′Rightv1′+v1;#送顯
}
采用廣告版顯示運行數據.
Billboard{
geometry DEF output Text{
string""
fontStyle FontStyle{
size.3
}}}
在Script節點中采用field SFNode lblOut USE output 和 lbl Out.set_string[0]=′Rightv1:′+v1將數據送到顯示屏顯示,實驗運行結果如圖4所示.

圖4 實驗運行圖
復雜運動的聯動交互控制必須借助于功能強大的高級語言來實現,以彌補VRML本身如邏輯判斷、精確場景控制等的不足.本文通過使用VRML的Script節點編程著重研究了基于VRML技術的虛擬實驗聯動動畫技術,設計了具有聯動交互控制功能的氣墊導軌上的實驗,為傳統的教學注入了新的活力.可以預見VRML網絡虛擬技術在整個實驗教學、產品虛擬設計等方面有著廣泛的應用前景.
[1] 章天金,馬志軍,江娟,等.三維動畫技術在固體物理學教學中的應用[J].沈陽師范大學學報(自然科學版),2007,25(4):454-456.
[2] 孟艷,傅鋼善,常鑫.VRML中的交互機理與實現研究[J].電子科技,2009,22(6):40-44.
[3] 曹詠弘,范榮強,范錦彪,等.基于虛擬現實的彈丸時空位置再現技術研究[J].彈箭與制導學報,2010,30(1):91-94.
[4] 黃文麗,盧碧紅,楊志剛,等.VRML語言入門與應用[M].北京:中國鐵道出版社,2003.
[5] 吳北新.虛擬現實建模語言VRML[M].北京:高等教育出版社,2004.
[6] 陸昌輝.VRML入門與提高[M].北京:北京大學出版社,2003:201-202.
[7] Web3D Consortium.Virtual Reality Modeling Language [DB/OL]. (2003-12-16).http://www.web3d.org/x3d/specifications/vrml.
[8] Aereal Inc.VRML 2.0 [DB/OL].[2012-03-10].http://www.vrmlsite.com.
[9] 顧冬華,王俊杰,楊立.虛擬現實技術應用于電工實驗課教學的嘗試[J].中國現代教育裝備,2010(13):55-56,67.
[10] 余東先,杜紀霞.基于VRML-JAVA遠程虛擬教學系統的設計與開發[J].河南科學,2010,28(5):600-604.
[11] Duan X Y,Jiang P.Exploration to virtual reality 3D key techniques based on cosmo browser plug-in[J].International Journal of Digital Content Technology and its Applications,2011,5(6):391-402.
[12] 王昊鵬,趙凱.VRML基于高程格網節點的復雜造型研究[J].微計算機信息,2006,22(19):211-212,144.
[13] 王建中,李定國,張家昌,等.基于VRML的工程熱物理虛擬實驗教學系統[J].實驗室研究與探索,2006,25(12):1530-1532.
[14] Ligos Corporation.V·RealmTM.Builder User’s Guide and Reference[DB/OL].[2010-02-10].http://www.few.vu.nl/~eliens/documents/vrml/V-Realm.