劉建國, 趙林明, 王利英
(河北工程大學水電學院,河北 邯鄲 056021)
虛擬現(xiàn)實VR(Virtual Reality),是以計算機技術(shù)為平臺,利用虛擬現(xiàn)實技術(shù)的硬件、軟件資源,生成逼真的視覺、聽覺、觸覺一體化的虛擬空間,用戶借助必要的設(shè)備與虛擬環(huán)境中的對象進行交互,從而獲得身臨其境的感受和體會。目前,VR在娛樂、軍事、教育、醫(yī)學、建筑行業(yè)、制造業(yè)等行業(yè)有廣泛的應(yīng)用[1]。虛擬現(xiàn)實建模語言(Virtual Reality Modeling Language,VRML)是虛擬現(xiàn)實的軟件實現(xiàn)方法之一,VRML為虛擬現(xiàn)實技術(shù)的發(fā)展做出了巨大貢獻。但隨著計算機網(wǎng)絡(luò)技術(shù)和軟硬件技術(shù)的發(fā)展,VRML也暴露出許多不足之處,如VRML不是基于XML編碼、不利于和其他網(wǎng)絡(luò)技術(shù)整合、存在兼容性問題、交互性不強等。為了彌補 VRML的不足,1998年底 VRML委員會更名為Web3D協(xié)會,并推出了X3D(Extensible 3D)標準。
在水電站建設(shè)過程中,由于水輪發(fā)電機組結(jié)構(gòu)復雜,施工難度大,機組的安裝往往需要幾個月才能完成,這么長的時間如果要到施工現(xiàn)場學習和參觀幾乎是不可能的,這對學生的安裝檢修實習和技術(shù)人員的培訓都造成很大的難度,同時也很難讓其他人員對水輪發(fā)電機組安裝有很全面的了解和認識[2-3]。鑒于此,開發(fā)水電站水輪發(fā)電機組虛擬安裝系統(tǒng)是很有意義的。下面給出利用三維實體設(shè)計軟件Pro/E、虛擬建模語言X3D和Java3D高級編程語言制作水輪發(fā)電機組虛擬安裝過程仿真動畫,以及應(yīng)用系統(tǒng)集成技術(shù),來實現(xiàn)水輪發(fā)電機組虛擬安裝演示系統(tǒng)的具體過程。
水輪發(fā)電機組各個零部件的三維模型的建立,是水輪發(fā)電機組虛擬安裝實現(xiàn)的基礎(chǔ)。由于水輪發(fā)電機組一些零件使用X3D或VRML語言建立虛擬場景是相當煩瑣的,毫無直觀性可言。因此在實際開發(fā)過程中,可以選用三維實體設(shè)計軟件Pro/E構(gòu)建水輪發(fā)電機組零部件的三維模型。將其Pro/E中設(shè)計好的三維模型可以通過File(文件)命令輸出為VRML文件,再將其轉(zhuǎn)換為X3D文件。例如,水輪機轉(zhuǎn)輪三維模型建立的過程為:新建一個prt文件,根據(jù)葉片工作面和背面數(shù)據(jù)文件,分別建立葉片工作面和背面的曲面造型,生成葉片的三維實體,再對葉片進口邊和出口邊倒圓角,生成葉片的三維實體模型。葉片三維實體模型完成后將葉片復制陣列,再用旋轉(zhuǎn)形成轉(zhuǎn)輪的上冠和下環(huán),建立轉(zhuǎn)輪的三維實體模型[4],如圖1所示。由Pro/E建立的實體模型導出生成VRML文件,由于Pro/E建立的模型生成的VRML文件比較大,可以采用VRMLPad編輯器進行編輯壓縮,并且不影響模型顯示效果,最后再將其轉(zhuǎn)換為X3D文件[5]。
圖1 水輪機轉(zhuǎn)輪三維建模
Xj3D 是Web3D提供的一系列開放的源程序代碼,用來實現(xiàn)X3D規(guī)范的VRML/X3D瀏覽器??梢詾g覽*.x3d、*.x3dv、*.vrml等文件。
2.1.1 Xj3D的目標
最初Xj3D基本代碼的目的只是為了使瀏覽器可以顯示 VRML內(nèi)容。除了這個目標,開發(fā)者要對代碼進行改進,以使其能適應(yīng)新的規(guī)范和擴展。同時這些代碼也可以對未知規(guī)范進行開發(fā)實驗,所以代碼要有很強的適應(yīng)性。Xj3D設(shè)計要達到如下3個目標:
1)驗證全部X3D規(guī)范的可實現(xiàn)性。
2)通過構(gòu)建代碼促進X3D工作組進行更深入的研究和實驗。
3)按照規(guī)范將代碼設(shè)計成一些較小的、可重用的組件,以利于整合到其他應(yīng)用程序中。
2.1.2 Xj3D的體系結(jié)構(gòu)
Xj3D體系結(jié)構(gòu)的 UML(Unified Modeling Language)組件圖,如圖2所示。Xj3D包括 6大主要組件,分別是 DOM(Document Object Model)組件、SAI(Scene Authoring Interface)組件、VRML Implementation組件、Java3D組件、Swing組件和X3D Utils組件。每個組件都可以作為一個獨立部分使用[6]。
圖2 Xj3D體系結(jié)構(gòu)的UML組件圖
通過Xj3D工具包中的組件,可以開發(fā)復雜的應(yīng)用程序,也可以開發(fā)自己的瀏覽器,自定義節(jié)點,添加不同的輸入輸出設(shè)備,甚至可以支持數(shù)據(jù)手套和跟蹤設(shè)備。利用Xj3D工具包的X3D應(yīng)用的開發(fā),能夠體現(xiàn)基于Java平臺和開放源代碼的應(yīng)用程序開發(fā)優(yōu)勢。
SAI是X3D標準虛擬場景交互的標準,應(yīng)用程序可以通過SAI訪問和控制X3D運行時對象,從而實現(xiàn)和虛擬場景的交互。SAI統(tǒng)一了VRML中內(nèi)部的和外部的(JSAI&EAI)訪問接口,在SAI組件中用戶程序和虛擬場景有兩種形式的交互:內(nèi)部交互和外部交互。
2.2.1 虛擬場景的內(nèi)部交互
虛擬場景內(nèi)部交互類似于VRML的JSAI,是在Script節(jié)點里利用Java或JavaScript語言編寫的腳本來擴展 X3D功能的一種方法,虛擬場景通過 Script節(jié)點和腳本程序進行交互,Script節(jié)點和腳本程序是虛擬場景的一部分,因此稱之為內(nèi)部交互。
腳本程序必須滿足一定的規(guī)范才能和場景通信,在SAI中制定了這個規(guī)范,規(guī)范的主要內(nèi)容是腳本如何準確無誤地獲得場景的狀態(tài)和信息,該規(guī)范同時也指定了腳本處理的過程。Xj3D實現(xiàn)了這個標準,為了和場景交互,腳本程序必須實現(xiàn)X3DScriptImplementation接口,該接口的方法就是場景提供的各種服務(wù)。
虛擬場景和Java程序通過Script節(jié)點通信,并把Java程序處理過的數(shù)據(jù)返回給X3D文件。在void setFields()方法中可獲取腳本節(jié)點的域,設(shè)置鼠標事件監(jiān)聽器,將值傳遞給Script節(jié)點的outputOnly域,再通過路由傳遞給X3D中的各類節(jié)點,完成整個通信過程[7]。
2.2.2 虛擬場景的外部交互
外部交互是指虛擬場景和外部程序的交互,SAI的外交互類似于 VRML的外部編程接口(EAI--External Authoring Interface),EAI 是VRML97規(guī)范的一部分,提供外部應(yīng)用程序存取VRML場景圖的能力。場景圖中的腳本運行就是通過EAI和外部瀏覽器完成,EAI還允許任何的應(yīng)用程序和VRML內(nèi)容進行交互[8]。
X3D的Xj3D任務(wù)組用Java語言實現(xiàn)了SAI規(guī)范,Xj3D實現(xiàn)的關(guān)于 SAI的類庫,放在org.web3D.x3D.sai包下,可利用Xj3D工具包實現(xiàn)虛擬場景的外部交互[9]。虛擬場景交互的一般步驟為:
1)建立連接,獲得瀏覽器對象,通過瀏覽器對象完成加載場景、置換場景等操作
瀏覽器對象是虛擬場景和Java交互的橋梁,因為瀏覽器對象擁有整個場景,獲取瀏覽器對象,就能創(chuàng)建場景對象,從而獲取節(jié)點對象和節(jié)點的域等,實現(xiàn)對場景的訪問和控制。瀏覽器對象主要提供了操縱場景的方法,包括創(chuàng)建場景的方法 createScene、createX3DFromStream、createX3DfromString,加載場景的方法createX3DfromURL,用另一個場景替代當前場景的方法replaceWorld等。
2)場景對象的訪問
用場景對象方法可以對場景節(jié)點和場景信息進行操縱,包括添加路由addRoute、刪除路由removeRoute、創(chuàng)建節(jié)點createNode、獲得一個已用DEF語句命名的節(jié)點getNamedNode等。
3)場景對象中節(jié)點的訪問
節(jié)點對象是虛擬場景交互的最小單位,可以通過編程的方法從場景圖中刪除節(jié)點(dispose)、獲取節(jié)點中域的引用(getField)、獲取節(jié)點類型(getNodeType)等。
4)節(jié)點域值、監(jiān)聽事件的設(shè)置
節(jié)點的域存在于節(jié)點內(nèi)部,用戶可以利用域?qū)ο蟮姆椒ǜ淖児?jié)點的域值,進而控制場景的變化。域?qū)ο蟮姆椒ㄖ饕ǎ韩@取當前域值(getValue)、設(shè)置域值(setValue)、添加事件監(jiān)聽器(addX3D-EventListener)、刪除事件監(jiān)聽器(removeX3DeventListener)等。
下面用一個實例來說明虛擬場景和外部程序交互的過程。實例中首先在Pro/E中創(chuàng)建一個水輪機的一個零部件裝配的三維實體模型,再將Pro/E建立的實體模型導出生成VRML文件,并用X3D-Edit3.1把VRML文件轉(zhuǎn)換X3D文件。
外部程序是一個基于 Java Swing的桌面程序。首先創(chuàng)建一個瀏覽器組件,在界面窗口上側(cè)加載和顯示X3D場景,界面窗口的下側(cè)創(chuàng)建了3個按鈕控件,分別是“開始”、“暫?!焙汀袄^續(xù)”,點擊“開始”按鈕將開始零部件裝配的動畫演示,點擊“暫?!卑粹o是暫停演示,點擊“繼續(xù)”按鈕是繼續(xù)演示。創(chuàng)建瀏覽器組件,加載顯示場景的關(guān)鍵代碼如下:
圖3 虛擬裝配演示界面
圖4 開始演示界面
水輪發(fā)電機組虛擬安裝系統(tǒng)是以 Java、Java3D、Eclipse為開發(fā)平臺,應(yīng)用Xj3D開放源碼工具包實現(xiàn)的,系統(tǒng)所使用的開發(fā)工具都是免費軟件,在網(wǎng)絡(luò)應(yīng)用開發(fā)領(lǐng)域具有得天獨厚的優(yōu)勢,有良好的跨平臺性能,目前得到廣泛應(yīng)用。
系統(tǒng)界面分為4部分,分別是菜單、樹狀目錄、虛擬場景演示窗口和演示控制按鈕。頁面左側(cè)采用樹狀的目錄結(jié)構(gòu),便于水輪發(fā)電機組各部分的演示及零件的瀏覽,頁面中間顯示水輪發(fā)電機組安裝的虛擬場景。用戶可以通過樹狀目錄選擇不同的部件進行演示。如果用戶查看導水機構(gòu)的安裝演示,可通過點擊樹狀目錄中的導水機構(gòu),即可實現(xiàn)導水機構(gòu)的安裝演示,在演示過程中可用右側(cè)的按鈕控制演示速度、暫停演示、繼續(xù)演示。如圖5所示。
圖5 水輪發(fā)電機組虛擬安裝
水輪發(fā)電機組虛擬安裝系統(tǒng)是以某水電站實際數(shù)據(jù)為背景,采用三維建模軟件Pro/E對水輪發(fā)電機組主要零部件進行了三維建模,用虛擬現(xiàn)實語言X3D構(gòu)造了虛擬場景,用X3D和Java語言通過SAI實現(xiàn)了各零部件的動態(tài)交互,具有一定的先進性。采用水輪發(fā)電機組虛擬安裝系統(tǒng)進行學習和培訓與傳統(tǒng)的現(xiàn)場培訓相比,具有可以減少經(jīng)費的投入,不受時間和場地的限制,操作簡單等優(yōu)點,因此所開發(fā)的水輪發(fā)電機組虛擬安裝系統(tǒng)具有較廣闊的應(yīng)用前景。另外,開發(fā)系統(tǒng)過程中所取得的一些研究成果,也可以用于水電站監(jiān)測系統(tǒng)的可視化界面設(shè)計等方面。
[1] 張 玨,陳金水. 基于VRML的水工學習系統(tǒng)設(shè)計[J].中國農(nóng)村水利水電,2007,(9): 77-79.
[2] 陳小橋,劉 超,等. 分布式水電工程施工過程虛擬現(xiàn)實仿真系統(tǒng)[J]. 武漢大學學報(工學版),2010,43(5): 593-598.
[3] 霍樹義,賁國雄,習華勇. 水電站油系統(tǒng)虛擬現(xiàn)實技術(shù)應(yīng)用研究[J]. 水電能源科學,2010,28(11):123-124.
[4] 鄧 杰,陳 銳. 水輪機葉片測繪數(shù)據(jù)的三維 CAD繪型[J]. 水利水電技術(shù),2009,40(11): 103-106.
[5] 陳 敏,郭烈恩. 基于X3D技術(shù)構(gòu)建虛擬液壓傳動實驗室[J]. 機械設(shè)計,2010,27(2): 20-24.
[6] 張金釗,張金銳,張金鏑. X3D 虛擬現(xiàn)實設(shè)計[M].北京: 電子工業(yè)出版社,2007: 15-18.
[7] 李貞培,李 平,吳 明. X3D虛擬場景與Java交互研究[J]. 計算機工程與應(yīng)用,2010,46(16): 67-70.
[8] 李海慶,殷國富,胡瑞飛. 基于 X3D 的虛擬場景交互架構(gòu)的實現(xiàn)方法研究[J]. 系統(tǒng)仿真學報,2006,18(S2): 383-385.
[9] Xj3D. Xj3D 2.0VRML/X3D code API (2006)[EB/OL].http://www.xj3d.org/javadoc2/index.html.