姚 琦 郭立暉
摘 要:虛擬現(xiàn)實(shí)的發(fā)展前景誘人,在某種意義上說(shuō)它將改變?nèi)藗兊乃季S方式,會(huì)改變?nèi)藗儗?duì)世界、自己、空間和時(shí)間的看法。它是一項(xiàng)發(fā)展中的、具有深遠(yuǎn)的潛在應(yīng)用方向的新技術(shù)。
關(guān)鍵詞:VRMl技術(shù);數(shù)據(jù)庫(kù);JAVA
1 VRML概述
Internet和3D技術(shù)的發(fā)展,使得第一代的二維網(wǎng)絡(luò)世界不再滿足人們對(duì)互聯(lián)網(wǎng)的需求,取而代之是逼真的基于Internet的三維實(shí)體世界,為此,以VRML為基礎(chǔ)的第二代萬(wàn)維網(wǎng)(第二代萬(wàn)維網(wǎng)=多媒體+虛擬現(xiàn)實(shí)+因特網(wǎng))進(jìn)入了我們的視角,虛擬現(xiàn)實(shí)技術(shù)也成為一個(gè)在當(dāng)今國(guó)際上倍受關(guān)注的科研課題,也愈發(fā)表現(xiàn)出巨大的潛力和光明的前景。
目前它的應(yīng)用領(lǐng)域十分廣泛,主要在軍事領(lǐng)域、醫(yī)療、教育培訓(xùn)領(lǐng)域、博物館與文物保護(hù)、城市規(guī)劃領(lǐng)域、在石油工業(yè)中的應(yīng)用、數(shù)據(jù)可視化、飛行模擬、多媒體遠(yuǎn)程教育、臨床外科、藝術(shù)創(chuàng)作、游戲、娛樂(lè)等方面。
2 VRML工作原理
VRML文件是以擴(kuò)展名為wrl結(jié)尾的一種用來(lái)描述幾何形體的ASCII文本文件,它不需要任何編譯,直接由瀏覽器解釋執(zhí)行。當(dāng)用戶打開VRML文件時(shí),系統(tǒng)首先裝入一個(gè)內(nèi)嵌的VRML瀏覽器,該瀏覽器將VRML語(yǔ)言中的信息解釋成空間中目標(biāo)的幾何形體描述,如長(zhǎng)方體,球體,不規(guī)則的其他三維物等等,同時(shí)它將提供實(shí)時(shí)顯示,一秒顯示多次,這樣在用戶的計(jì)算機(jī)上就會(huì)有一個(gè)活動(dòng)場(chǎng)景的感覺。
3 VRML執(zhí)行模式
執(zhí)行模式如圖1:
4 VRML的JAVA支持
盡管VRML是一個(gè)有力的3D語(yǔ)言,但其更大的功能來(lái)自于它能夠用Java程序設(shè)計(jì)語(yǔ)言去建立復(fù)雜、交互的界面。Java主要討論對(duì)象行為,但很少涉及外部特征,而VRML則著重于外表,不太考慮對(duì)象行為,可以說(shuō),Java和VRML相互補(bǔ)充。隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,Java和VRML的關(guān)系將更加緊密。
VRML為我們提供了一個(gè)與場(chǎng)景外的程序想結(jié)合的節(jié)點(diǎn)—Script節(jié)點(diǎn)。我們可以通過(guò)Script節(jié)點(diǎn)來(lái)控制在VRML中的行為,我們也可以使用Java編程語(yǔ)言編寫,然后通過(guò)執(zhí)行模式連接到場(chǎng)景中去。事實(shí)上,Script節(jié)點(diǎn)就是利用Java語(yǔ)言編寫的腳本來(lái)擴(kuò)展VRML的功能的。
5 VRML對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)
任何一項(xiàng)有規(guī)模的計(jì)算機(jī)應(yīng)用都使用大量的信息,因而不能脫離對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。VRML文件訪問(wèn)數(shù)據(jù)庫(kù)可以通過(guò)錨點(diǎn)和腳本兩種方式,一種是通過(guò)錨(Anchor)節(jié)點(diǎn)訪問(wèn),第二種是通過(guò)腳本(Script)訪問(wèn)。這里我們主要介紹第二種方法。
VRML提供了一個(gè)與場(chǎng)景外的程序相結(jié)合的Script節(jié)點(diǎn)。從其語(yǔ)法中我們可以發(fā)現(xiàn)它有個(gè)url域值,這個(gè)域值指定了一個(gè)按優(yōu)先級(jí)排列的URL列表,存放程序腳本的URL地址或其本身就為程序腳本。程序腳本是由任何VRML瀏覽器支持的語(yǔ)言編寫的,可以為JavaScript、VrmlScript、JAVA語(yǔ)言所編寫的程序。為此,可以在Script節(jié)點(diǎn)中用JavaScript編寫連接數(shù)據(jù)庫(kù)的程序,也可以用JAVA來(lái)編寫,不過(guò)這種語(yǔ)言要經(jīng)過(guò)編譯形成*.class文件后,再在url域值中指定JAVA程序的地址。
整個(gè)設(shè)計(jì)工作采用B/S結(jié)構(gòu),分為客戶端和服務(wù)器端兩個(gè)模塊。兩者都與操作系統(tǒng)無(wú)關(guān),可以跨平臺(tái)運(yùn)行。系統(tǒng)結(jié)構(gòu)如下:
服務(wù)器端包括Web服務(wù)器和研究設(shè)計(jì)編寫的程序。它的功能主要是響應(yīng)客戶端訪問(wèn)的各種請(qǐng)求,如查詢的屬性數(shù)據(jù)信息??蛻舳诵枰С諮ava(JDK1.2以下)的瀏覽器(要求安裝微軟件的Java虛擬機(jī)),并且安裝了支持VRML瀏覽的插件。
在設(shè)計(jì)實(shí)驗(yàn)中,采用JDBC作為數(shù)據(jù)引擎,使用戶所關(guān)注的場(chǎng)景數(shù)據(jù)信息得到數(shù)據(jù)庫(kù)的支持。其實(shí)現(xiàn)模型如圖3:
其中,嵌入在Web頁(yè)中的VRML虛擬場(chǎng)景是整個(gè)設(shè)計(jì)的終端,即用戶界面層,用戶最終在這個(gè)三維的虛擬境界中漫游;真正意義上的中間業(yè)務(wù)邏輯層是Java Applet小程序,它實(shí)現(xiàn)了兩個(gè)接口:與VRML通信的EAI接口,以及與后臺(tái)數(shù)據(jù)庫(kù)通信的JDBC數(shù)據(jù)引擎。在該模型中,在同一HTML頁(yè)面中同時(shí)嵌入一個(gè)VRMl虛擬境界和兩個(gè)Java Applet,在Applet中含有與VRML有關(guān)的EAI代碼和與數(shù)據(jù)庫(kù)關(guān)聯(lián)的JDBC代碼。這樣來(lái)自于VRML或Applet上的事件就可以通過(guò)EAI和JDBC與VRML場(chǎng)景或數(shù)據(jù)庫(kù)中相應(yīng)的信息進(jìn)行數(shù)據(jù)通信,并將相應(yīng)的信息格式化后在Applet上和VRML場(chǎng)景中顯示出來(lái)。
Java對(duì)VRML的所有支持都通過(guò)附加的封裝類實(shí)現(xiàn)。通過(guò)這些類,Java程序就能夠訪問(wèn)VRML場(chǎng)景、接受和發(fā)送事件、從頁(yè)面上得到VRML對(duì)象等,實(shí)現(xiàn)對(duì)VRML場(chǎng)景的完全控制??偟恼f(shuō)來(lái),VRML與JAVA程序之間交互的執(zhí)行有三種解決方法:
第一類是API的方法,執(zhí)行模式是基于過(guò)程的。這種方法便于程序的編寫,同時(shí)又可以簡(jiǎn)化場(chǎng)景,但對(duì)于瀏覽器來(lái)說(shuō),它有可能無(wú)法得到足夠的場(chǎng)景信息。
第二類是通過(guò)語(yǔ)言的方法,就是將VRML的3D數(shù)據(jù)完全轉(zhuǎn)化為程序語(yǔ)言,這種方法與API的方法完全相反,它可以使瀏覽器得到場(chǎng)景的完整信息,也具有基本語(yǔ)言的控制結(jié)構(gòu),但它卻引起文件過(guò)大,不適合用于網(wǎng)絡(luò)的傳輸。
第三類是基于事件的方法,它是使用事件機(jī)制和路由,即利用上文中提到的Script節(jié)點(diǎn)。它是通過(guò)eventIn將事件傳至Script節(jié)點(diǎn)中的腳本;在Script節(jié)點(diǎn)中的腳本中調(diào)用相應(yīng)的Java類進(jìn)行處理;通過(guò)eventOut將結(jié)果送回到VRML場(chǎng)景以實(shí)物動(dòng)畫或交互。其過(guò)程大致如圖
4所示:
上面的三類解決方法中,第三類方法是目前采用的最多的一種實(shí)現(xiàn)VRML和JAVA結(jié)合交互的方法。下面對(duì)這種方法做詳盡的介紹。根據(jù)訪問(wèn)方式的不同,又可分為:腳本編程接口SAI(Script Authoring Interface) 交互和外部編程接口EAI(External Authoring Interface) 交互。這里我們主要介紹外部編程接口EAI交互。
VRML97標(biāo)準(zhǔn)提供的EAI定義了外部環(huán)境怎樣通過(guò)VRML現(xiàn)存的事件驅(qū)動(dòng)模式來(lái)訪問(wèn)VRML內(nèi)部的節(jié)點(diǎn)的一系列方法,實(shí)現(xiàn)了Applet與VRML場(chǎng)景的通信。EAI包含瀏覽器腳本接口的全部功能,例如查詢?yōu)g覽器的狀態(tài),增加或刪除路由,生成新的節(jié)點(diǎn)等功能。其事件傳遞機(jī)制為:
Java主要使用Browser和Node兩個(gè)類(vrml.external包),以及其它一些如處理eventIn域和eventOut域的各個(gè)屬性類(EventIn、EventOut)和處理例外的各種Exception類完成對(duì)EAI的描述。
Browser類提供了三個(gè)方法:getBrowser(AppletpApplet)、getBrowser(Applet pApplet,String frameName,int index)和getNode(String name)方法。
正是因?yàn)橛辛藇rml.external包提供的Browser和Node類,于是我們完全可以通過(guò)Browser和Node類,拋棄Script節(jié)點(diǎn)和Script類甚至路由而現(xiàn)實(shí)對(duì)VRML文件的各種節(jié)點(diǎn)即Node類的各個(gè)實(shí)例直接操控。但getBrowser()方法的參數(shù)必須是Applet的實(shí)例,因而該方法只能通過(guò)Applet來(lái)控制VRML。
EAI主要用來(lái)提供與外部環(huán)境相互通信的能力,從VRML瀏覽器外部獲取場(chǎng)景節(jié)點(diǎn)和事件結(jié)構(gòu)。而SAI則偏重于虛擬場(chǎng)景內(nèi)部情況的處理,在瀏覽器內(nèi)部對(duì)場(chǎng)景的節(jié)點(diǎn)進(jìn)行訪問(wèn)??傊芏喙δ芗瓤梢酝ㄟ^(guò)SAI接口也可以通過(guò)EAI接口實(shí)現(xiàn),一般來(lái)說(shuō),對(duì)于單一的VRML事件進(jìn)行交互及運(yùn)算功能可選擇內(nèi)部的Script節(jié)點(diǎn),即SAI接口來(lái)實(shí)現(xiàn),若需集成多種媒體,并進(jìn)行復(fù)雜的網(wǎng)絡(luò)控制,則更適合通過(guò)EAI接口與Java語(yǔ)言相結(jié)合實(shí)現(xiàn)更復(fù)雜的功能。
在虛擬現(xiàn)實(shí)的很多系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)中都需要進(jìn)行與數(shù)據(jù)庫(kù)服務(wù)器的通信,同時(shí)也要做比較復(fù)雜的用戶界面控制,因此,采用EAI接口做為VRML場(chǎng)景與Java程序進(jìn)行數(shù)據(jù)通信的接口更為合理。