李蘭
(山西師范大學現代文理學院,臨汾041004)
VRML 是跨平臺的虛擬現實建模語言,在網絡環境中構建三維虛擬場景[1]。VRML 文件規模較小,可以直接嵌入到HTML 文件中去,在一般的瀏覽器中安裝適當的插件就可以超空間的瀏覽行為仿真,因而在網絡制造、虛擬漫游以及計算機動畫中得到廣泛的應用[2]。
Java 是跨平臺的網絡分布式計算環境中廣泛使用的編程語言,具有強大的編程能力。Java Applet(Java小應用程序)是一種可以加載到Web 頁面,由瀏覽器調用執行的Java 程序,可使Web 頁面更加動態、更具交互性[3]。VRML 與Java Applet 的結合能夠真正意義上實現動態交互的虛擬場景[4]。
交互功能是VRML 的一個重要特點,通過交互能使用戶在虛擬場景中有身臨其境的感覺。交互可通過三種方式實現:傳感器節點的交互,Script 節點的交互及EAI 接口的交互。
VRML 中使用傳感器節點(時間傳感器除外)完成感知瀏覽者的操作或者在場景中的觀察位置,然后對此做出反應的交互功能。常用的有觸摸傳感器Touch-Sensor 節點感知用戶鼠標觸發動作;平面傳感器Plane-Sensor 節點感知用戶鼠標拖曳動作;圓柱體傳感器CylinderSensor 節點感知用戶繞中心軸拖拽旋轉的動作;接近傳感器ProximitySensor 節點感知用戶所在方位;碰撞傳感器Collision 節點感知造型與用戶發生碰撞動作,傳感器一旦感應到事件的發生,將不斷輸出該事件到目標節點,從而觸發目標的動態效果,使虛擬現實效果更加逼真,但傳感器能感應的事件有限,因而交互行為也有限[5]。
VRML 腳本節點Script 用以描述一個由用戶自定義的傳感器或插補器,通過URL 域包含一組瀏覽器支持的任何一種語言編寫的程序或叫腳本,在產生出事件之前執行計算或處理,并將結果發送到VRML 場景,可以使交互更加靈活[6]。
Script 節點只能綁定程序按照預定規則改變場景,實現靜態虛擬效果及簡單交互等功能。對虛擬場景與用戶的交互、多用戶間的交互及網絡通訊能力等更具一般性的行為,則需利用EAI 接口的交互實現。EAI的基本思想是外部程序能夠通過VRML 事件模型訪問VRML 場景節點,從而控制VRML 場景,外部程序即Java Applet,它與VRML 同在HTML 頁面中,建立了與VRML 的通信接口,并可與外部數據庫建立連接,從而使用戶與虛擬場景實現動態交互,真正成為VRML 中的一個角色,一個參與者[7]。
基于VRML 和Java Applet 相結合的動態交互場景的整體架構如圖1 所示。整個系統分為3 層:應用層、實現層和資源層。其中應用層是HTML 界面,VRML 和Java Applet 置于同Web 頁面,運行時則在同一個瀏覽器環境中。VRML 提供虛擬現實的三維場景,Java Applet 則提供實現用戶交互的控件,用以控制場景和實時顯示動態參數;實現層用Java Applet 編制的程序作為仿真控制的引擎,一方面連接數據庫,把數據庫的數據傳送到場景中,另一方面建立與VRML 場景的接口,用來驅動場景的動態生成與用戶的交互等;資源層是用數據庫管理系統搭建的數據庫,可以存儲并更新場景的全部數據參數。其中Java Applet 與數據庫的連接接口用JDBC 來完成,Applet 與VRML 的接口用EAI 技術來實現。

圖1 動態交互場景的整體架構
系統采用的是瀏覽器/服務器模式,系統運行用到的程序代碼和數據均在服務器上存放,客戶端只需要安裝瀏覽器和必要的VRML 插件。HTML 界面包括兩部分:VRML 場景和Java Applet 控件,其中Java Applet控件包括按鈕、文本框等。HTML 文檔中Java Applet程序.class 使用

圖2 工作流程
在用戶界面上,首先點擊“連接數據庫”按鈕進行初始化,完成數據庫的連接操作,系統返回可供Java Applet 程序使用的靜態場景數據和動態運動空間位置等參數,并動態生成靜態場景。用戶點擊“開始”按鈕,Applet 讀取并傳輸數據至VRML 場景,進行動態交互;同時把相關的數據信息顯示在用戶界面。點擊“停止”按鈕,中止此次仿真。
EAI 接口定義了一套針對VRML 瀏覽器的Java類,其中類vrml external Browser 至關重要,是實現EAI訪問的基礎[9]。瀏覽器類(Browser)實際上是VRML 場景的一個Java 封裝,包括全部的腳本語言接口,重要的是包含有getNode()方法。通過該方法可獲得一個Node 類的實例,即為VRML 場景中造型節點在Java Applet 中的對應節點。因此通信之初要先創建一個瀏覽器類的實例,方法如下所示:
Browser browser=Browser.getBrowser();
Browser 類實例化后,EAI 即可訪問VRML 場景的節點、往eventIn 域發送事件、eventOut 域發出事件及監聽eventOut 域,下面分別闡述。
(1)訪問節點
VRML 場景中的節點通過瀏覽器類的getNode()方法實例化,其eventIn 和eventOut 則通過Node 類的getEventIn()和getEventOut()方法實例化為Applet 中的對應體,將域名以字符串參數傳入,實例化為EventIn 或者是EventOut。ExposedField 域也允許訪問,事件入口需在域名前加set_作為前綴,事件出口需在域名后加_changed 作為后綴。三維場景中已經定義moxing 節點,其實例的獲得方法如下所示:
Node moxing=browser.getNode(“moxing”);
(2)往eventIn 域發送事件
將被訪問節點的eventIn 類實例化,即可向場景中該節點發送事件,由于eventIn 是抽象類,必須先強制轉換成合適的如EventInSFVec3f 等eventIn 類的子類,才可以提供發送事件的方法。例設置moxing 節點的EventInSFVec3f 類的scale 輸入值,如下所示:
EventInSFVec3f scale=(EventInSFVec3f)moxing.getEventIn(“set_scale”);
(3)eventOut 域發出事件
將被訪問節點的EventOut 類實例化,即可獲取場景中目標節點eventOut 域的當前值,也可在eventOut域發出事件時設置callback()方法。eventOut 類同eventIn 一樣也是抽象類,必須先強制轉換成合適的eventOut 類的子類,才可獲取eventOut 當前值的方法。例取得moxing 節點的EventInSFVec3f 類的scale輸出值,如下所示:
scale=((EventOutSFVec3f)moxing.getEventOut(“scale_changed”))).getValue();
(4)監聽eventOut 域
當場景目標節點的eventOut 域有新值產生時,EAI提供的監聽機制可使Applet 實時反應并進行相應的后續處理。具體實現是先將接口類EventOutObserver 類的子類實例化,調用其advise()方法監聽場景節點的eventOut,發現eventOut 有輸出,EventOutObserver 子類的callback()方法會自動執行。例監聽moxing 節點的scale 域發生變化,如下所示:
moxing.getEventOut(“set_scale”).advise(observer,null);
Java Applet 與數據庫通過JDBC(Java Database Connectivity)連接,JDBC 是Java 語言編寫的類和接口,允許Applet 對遠程數據庫進行訪問、獲取及更新數據等操作。利用JDBC 接口將Java Applet 與數據庫連接的一般步驟有:建立數據源;加載由數據庫類型決定的驅動程序;建立與某個數據源的連接;發送SQL 語句;處理返回的ResultSet 類的對象,將查詢結果最后顯示給用戶;關閉連接;捕獲異常,尤其是當新建連接、驅動程序加載、語句執行、類型轉換等操作發生時的異常。
圖3 為貼裝機貼裝場景實例。用EAI 實現在同一HTML 頁面中三維虛擬世界的瀏覽(用VRML 創建)和場景的交互(Java Applet 實現),用戶界面包括三個按鈕(“連接數據庫”、“開始”、“停止”)和幾個文本顯示框,其中按鈕用來控制程序的執行,文本框用于動態顯示貼裝過程參數。

圖3 貼裝機貼裝場景實例
VRML 作為虛擬現實標準建模語言,側重對三維空間場景模型的搭建,復雜交互功能的實現必須借助于Java 等功能強大的高級語言,這樣才能讓用戶真正成為場景的直接參與者與控制者。本文詳細論述以Java Applet 作為控制的核心、VRML 場景為三維展示的平臺,借助EAI 構建一個三維交互式虛擬場景的方法,以期為VRML 的研究與應用做進一步探索。