劉建國, 趙林明, 王利英
(河北工程大學水電學院,河北 邯鄲 056021)
虛擬現實VR(Virtual Reality),是以計算機技術為平臺,利用虛擬現實技術的硬件、軟件資源,生成逼真的視覺、聽覺、觸覺一體化的虛擬空間,用戶借助必要的設備與虛擬環境中的對象進行交互,從而獲得身臨其境的感受和體會。目前,VR在娛樂、軍事、教育、醫學、建筑行業、制造業等行業有廣泛的應用[1]。虛擬現實建模語言(Virtual Reality Modeling Language,VRML)是虛擬現實的軟件實現方法之一,VRML為虛擬現實技術的發展做出了巨大貢獻。但隨著計算機網絡技術和軟硬件技術的發展,VRML也暴露出許多不足之處,如VRML不是基于XML編碼、不利于和其他網絡技術整合、存在兼容性問題、交互性不強等。為了彌補 VRML的不足,1998年底 VRML委員會更名為Web3D協會,并推出了X3D(Extensible 3D)標準。
在水電站建設過程中,由于水輪發電機組結構復雜,施工難度大,機組的安裝往往需要幾個月才能完成,這么長的時間如果要到施工現場學習和參觀幾乎是不可能的,這對學生的安裝檢修實習和技術人員的培訓都造成很大的難度,同時也很難讓其他人員對水輪發電機組安裝有很全面的了解和認識[2-3]。鑒于此,開發水電站水輪發電機組虛擬安裝系統是很有意義的。下面給出利用三維實體設計軟件Pro/E、虛擬建模語言X3D和Java3D高級編程語言制作水輪發電機組虛擬安裝過程仿真動畫,以及應用系統集成技術,來實現水輪發電機組虛擬安裝演示系統的具體過程。
水輪發電機組各個零部件的三維模型的建立,是水輪發電機組虛擬安裝實現的基礎。由于水輪發電機組一些零件使用X3D或VRML語言建立虛擬場景是相當煩瑣的,毫無直觀性可言。因此在實際開發過程中,可以選用三維實體設計軟件Pro/E構建水輪發電機組零部件的三維模型。將其Pro/E中設計好的三維模型可以通過File(文件)命令輸出為VRML文件,再將其轉換為X3D文件。例如,水輪機轉輪三維模型建立的過程為:新建一個prt文件,根據葉片工作面和背面數據文件,分別建立葉片工作面和背面的曲面造型,生成葉片的三維實體,再對葉片進口邊和出口邊倒圓角,生成葉片的三維實體模型。葉片三維實體模型完成后將葉片復制陣列,再用旋轉形成轉輪的上冠和下環,建立轉輪的三維實體模型[4],如圖1所示。由Pro/E建立的實體模型導出生成VRML文件,由于Pro/E建立的模型生成的VRML文件比較大,可以采用VRMLPad編輯器進行編輯壓縮,并且不影響模型顯示效果,最后再將其轉換為X3D文件[5]。

圖1 水輪機轉輪三維建模
Xj3D 是Web3D提供的一系列開放的源程序代碼,用來實現X3D規范的VRML/X3D瀏覽器。可以瀏覽*.x3d、*.x3dv、*.vrml等文件。
2.1.1 Xj3D的目標
最初Xj3D基本代碼的目的只是為了使瀏覽器可以顯示 VRML內容。除了這個目標,開發者要對代碼進行改進,以使其能適應新的規范和擴展。同時這些代碼也可以對未知規范進行開發實驗,所以代碼要有很強的適應性。Xj3D設計要達到如下3個目標:
1)驗證全部X3D規范的可實現性。
2)通過構建代碼促進X3D工作組進行更深入的研究和實驗。
3)按照規范將代碼設計成一些較小的、可重用的組件,以利于整合到其他應用程序中。
2.1.2 Xj3D的體系結構
Xj3D體系結構的 UML(Unified Modeling Language)組件圖,如圖2所示。Xj3D包括 6大主要組件,分別是 DOM(Document Object Model)組件、SAI(Scene Authoring Interface)組件、VRML Implementation組件、Java3D組件、Swing組件和X3D Utils組件。每個組件都可以作為一個獨立部分使用[6]。

圖2 Xj3D體系結構的UML組件圖
通過Xj3D工具包中的組件,可以開發復雜的應用程序,也可以開發自己的瀏覽器,自定義節點,添加不同的輸入輸出設備,甚至可以支持數據手套和跟蹤設備。利用Xj3D工具包的X3D應用的開發,能夠體現基于Java平臺和開放源代碼的應用程序開發優勢。
SAI是X3D標準虛擬場景交互的標準,應用程序可以通過SAI訪問和控制X3D運行時對象,從而實現和虛擬場景的交互。SAI統一了VRML中內部的和外部的(JSAI&EAI)訪問接口,在SAI組件中用戶程序和虛擬場景有兩種形式的交互:內部交互和外部交互。
2.2.1 虛擬場景的內部交互
虛擬場景內部交互類似于VRML的JSAI,是在Script節點里利用Java或JavaScript語言編寫的腳本來擴展 X3D功能的一種方法,虛擬場景通過 Script節點和腳本程序進行交互,Script節點和腳本程序是虛擬場景的一部分,因此稱之為內部交互。
腳本程序必須滿足一定的規范才能和場景通信,在SAI中制定了這個規范,規范的主要內容是腳本如何準確無誤地獲得場景的狀態和信息,該規范同時也指定了腳本處理的過程。Xj3D實現了這個標準,為了和場景交互,腳本程序必須實現X3DScriptImplementation接口,該接口的方法就是場景提供的各種服務。
虛擬場景和Java程序通過Script節點通信,并把Java程序處理過的數據返回給X3D文件。在void setFields()方法中可獲取腳本節點的域,設置鼠標事件監聽器,將值傳遞給Script節點的outputOnly域,再通過路由傳遞給X3D中的各類節點,完成整個通信過程[7]。
2.2.2 虛擬場景的外部交互
外部交互是指虛擬場景和外部程序的交互,SAI的外交互類似于 VRML的外部編程接口(EAI--External Authoring Interface),EAI 是VRML97規范的一部分,提供外部應用程序存取VRML場景圖的能力。場景圖中的腳本運行就是通過EAI和外部瀏覽器完成,EAI還允許任何的應用程序和VRML內容進行交互[8]。
X3D的Xj3D任務組用Java語言實現了SAI規范,Xj3D實現的關于 SAI的類庫,放在org.web3D.x3D.sai包下,可利用Xj3D工具包實現虛擬場景的外部交互[9]。虛擬場景交互的一般步驟為:
1)建立連接,獲得瀏覽器對象,通過瀏覽器對象完成加載場景、置換場景等操作
瀏覽器對象是虛擬場景和Java交互的橋梁,因為瀏覽器對象擁有整個場景,獲取瀏覽器對象,就能創建場景對象,從而獲取節點對象和節點的域等,實現對場景的訪問和控制。瀏覽器對象主要提供了操縱場景的方法,包括創建場景的方法 createScene、createX3DFromStream、createX3DfromString,加載場景的方法createX3DfromURL,用另一個場景替代當前場景的方法replaceWorld等。
2)場景對象的訪問
用場景對象方法可以對場景節點和場景信息進行操縱,包括添加路由addRoute、刪除路由removeRoute、創建節點createNode、獲得一個已用DEF語句命名的節點getNamedNode等。
3)場景對象中節點的訪問
節點對象是虛擬場景交互的最小單位,可以通過編程的方法從場景圖中刪除節點(dispose)、獲取節點中域的引用(getField)、獲取節點類型(getNodeType)等。
4)節點域值、監聽事件的設置
節點的域存在于節點內部,用戶可以利用域對象的方法改變節點的域值,進而控制場景的變化。域對象的方法主要包括:獲取當前域值(getValue)、設置域值(setValue)、添加事件監聽器(addX3D-EventListener)、刪除事件監聽器(removeX3DeventListener)等。
下面用一個實例來說明虛擬場景和外部程序交互的過程。實例中首先在Pro/E中創建一個水輪機的一個零部件裝配的三維實體模型,再將Pro/E建立的實體模型導出生成VRML文件,并用X3D-Edit3.1把VRML文件轉換X3D文件。
外部程序是一個基于 Java Swing的桌面程序。首先創建一個瀏覽器組件,在界面窗口上側加載和顯示X3D場景,界面窗口的下側創建了3個按鈕控件,分別是“開始”、“暫停”和“繼續”,點擊“開始”按鈕將開始零部件裝配的動畫演示,點擊“暫停”按鈕是暫停演示,點擊“繼續”按鈕是繼續演示。創建瀏覽器組件,加載顯示場景的關鍵代碼如下:


圖3 虛擬裝配演示界面

圖4 開始演示界面
水輪發電機組虛擬安裝系統是以 Java、Java3D、Eclipse為開發平臺,應用Xj3D開放源碼工具包實現的,系統所使用的開發工具都是免費軟件,在網絡應用開發領域具有得天獨厚的優勢,有良好的跨平臺性能,目前得到廣泛應用。
系統界面分為4部分,分別是菜單、樹狀目錄、虛擬場景演示窗口和演示控制按鈕。頁面左側采用樹狀的目錄結構,便于水輪發電機組各部分的演示及零件的瀏覽,頁面中間顯示水輪發電機組安裝的虛擬場景。用戶可以通過樹狀目錄選擇不同的部件進行演示。如果用戶查看導水機構的安裝演示,可通過點擊樹狀目錄中的導水機構,即可實現導水機構的安裝演示,在演示過程中可用右側的按鈕控制演示速度、暫停演示、繼續演示。如圖5所示。

圖5 水輪發電機組虛擬安裝
水輪發電機組虛擬安裝系統是以某水電站實際數據為背景,采用三維建模軟件Pro/E對水輪發電機組主要零部件進行了三維建模,用虛擬現實語言X3D構造了虛擬場景,用X3D和Java語言通過SAI實現了各零部件的動態交互,具有一定的先進性。采用水輪發電機組虛擬安裝系統進行學習和培訓與傳統的現場培訓相比,具有可以減少經費的投入,不受時間和場地的限制,操作簡單等優點,因此所開發的水輪發電機組虛擬安裝系統具有較廣闊的應用前景。另外,開發系統過程中所取得的一些研究成果,也可以用于水電站監測系統的可視化界面設計等方面。
[1] 張 玨,陳金水. 基于VRML的水工學習系統設計[J].中國農村水利水電,2007,(9): 77-79.
[2] 陳小橋,劉 超,等. 分布式水電工程施工過程虛擬現實仿真系統[J]. 武漢大學學報(工學版),2010,43(5): 593-598.
[3] 霍樹義,賁國雄,習華勇. 水電站油系統虛擬現實技術應用研究[J]. 水電能源科學,2010,28(11):123-124.
[4] 鄧 杰,陳 銳. 水輪機葉片測繪數據的三維 CAD繪型[J]. 水利水電技術,2009,40(11): 103-106.
[5] 陳 敏,郭烈恩. 基于X3D技術構建虛擬液壓傳動實驗室[J]. 機械設計,2010,27(2): 20-24.
[6] 張金釗,張金銳,張金鏑. X3D 虛擬現實設計[M].北京: 電子工業出版社,2007: 15-18.
[7] 李貞培,李 平,吳 明. X3D虛擬場景與Java交互研究[J]. 計算機工程與應用,2010,46(16): 67-70.
[8] 李海慶,殷國富,胡瑞飛. 基于 X3D 的虛擬場景交互架構的實現方法研究[J]. 系統仿真學報,2006,18(S2): 383-385.
[9] Xj3D. Xj3D 2.0VRML/X3D code API (2006)[EB/OL].http://www.xj3d.org/javadoc2/index.html.