摘要:單純的虛擬現實建模語言(VRML)只能實現靜態的三維場景或簡單的交互,通過VRML語言與Java程序的結合,可以充分利用Java所具有的復雜處理能力和VRML建立三維場景的能力,從而實現動態的、交互的復雜VRML場景。首先就VRML與Java結合的方法進行了研究,然后討論了Java和VRML的通信原理,最后通過具體實例來闡述了如何通過EAI接口來實現VRML場景與外部世界的交互技術和實現方法,以體現兩者的高效結合對三維虛擬場景建模的積極意義。
關鍵詞:虛擬現實建模語言;Java;外部授權接口;動態交互;三維場景
中圖分類號:TP317文獻標識碼:A文章編號:1009-3044(2008)25-1560-03
Studies and Realization the Communication of Virtual Scenes Based on VRML and Java
CHEN Li-juan, ZHAN Lin
(College of Computer Science and Engineering, Anhui University of Science and Technology, Huainan 232001, China)
Abstract: Using virtual reality modeling language can only realize static three-dimensional scenes or simple interaction, Dynamic and complex VRML scenes interaction can be realized through the combination of VRML and Java, which makes good use of the computing ability of Java and the modeling three-dimensinal scenes ability of VRML. This thesis researches the way that VRML and Java combine at first, and then analyses their communication protocal, expounds the interaction between VRML and the outside through the EAI external interface and the how to realize it at last, which in order to reflect the realistic significance brought about by the perfect combination of Java and VRML.
Key words: VRML; java; EAI; dynamic interaction; three-dimensional scenes
1 引言
VRML[1]是一種虛擬現實建模語言,它的基本目標是建立因特網上的交互式三維多媒體,它以因特網作為應用平臺,作為構筑虛擬現實應用的基本構架。但是VRML本身與用戶進行交互的能力有限,它需要與其它語言結合才能實現三維場景和用戶交互的要求,Java提供了這種可能性。Java是一種跨平臺的編程語言,通過Java編寫的Applet在網上可以直接運行,非常適合于因特網上虛擬現實環境。VRML著重于虛擬場景中對象的特征,不太考慮對象行為,而Java主要討論對象行為,很少涉及外部特征,二者相互作了很好的補充,因此VRML與Java的結合,是實現較復雜動態場景控制等高級交互功能的有效方法[2-4]。
2 Java程序與VRML場景間的交互
VRML有支持它自己的API(Applicatio Programming Interface),這樣就提供給Java程序一個可以訪問VRML瀏覽器的界面和可執行的環境。Java對VRML的所有支持都是通過附加的封裝類實現。根據訪問方式的不同,可以分為外部授權接口EAI[5]訪問和腳本授權接口SAI訪問[6]。
2.1 EAI(External Authoring Interface)外部授權接口訪問
EAI是一種介于VRML世界與外部環境的授權接口,通過EAI為VRML與外部環境Java Applet建立一個通信接口[7],使用戶通過這個接口真正成為VRML中的一個角色、一個參與者。EAI流程如圖1所示。
EAI類被包含在vrml.external包中,在這個包中包含了所有用于進入VRML場景的類和方法。在進入VRML場景之前,必須首先得到它的Browser類的一個實例。通過調用Browser類的靜態方法getBrowser()來實現,在Java Applet中建立Browser對象后即標識了一個VRML場景。Browser類是對VRML場景的一個Java封裝。它不僅包含了獲取當前瀏覽器環境信息的各種方法,還有getNode()方法用來直接獲得VRML場景中使用DEF關鍵字定義的Node類實例。在獲得Node類實例后調用Node類所提供的getEventIn()、getEventOut()獲得事件輸入、輸出的實例,改變事件輸入值相當于改變場景達到動態效果。
通過Browser和Node類,可以拋棄Script節點和Script類甚至路由而實現對VRML文件的各節點即Node類的各個實例直接控制。
2.2 SAI(Script Authoring Interface)腳本授權接口訪問
SAI使用事件機制和路由,利用Script節點實現VRML與Java或Javascipt的交互。首先,通過EventIn將事件傳至Script節點中的腳本;其次,在Script節點中的腳本中調用相應的Java類或Javascript進行處理;最后,通過EventOut將結果送回到VRML場景以實現動畫或交互[8-9]。Script節點定義如下:
Script{
url [] exposedField MFString#指定要執行腳本的url或腳本文本本身
field fieldTypeName fieldName initialValue#定義私有域
eventIn eventType eventName #定義輸入事件
eventOut eventType eventName#定義輸出事件 }
url域可以鏈接一個Java字節碼文件(*.class)或直接包含一段Javascript程序;field域是標識VRML場景里被Java所訪問控制的節點。eventIn、eventOut用來接收、發送事件的響應值。Script節點可放置在場景的任何地方,用DEF命名它,從而完成事件的刪除或傳遞。
3 EAI實例分析
實例演示的是用戶在外部直接操作VRML世界內部的場景。用戶可以在VRML場景中添加幾何造型,并可以任意改變造型的尺度、位置、旋轉角度和顏色,達到了很好的交互效果。
1) VRML靜態場景,其代碼如下:
#VRML V2.0 utf8
DEF Camera Viewpoint {position 0 0 7}
DEF ROOT Group {}
在VRML場景中定義了一個名為ROOT的節點,作為外部EAI程序的入口地址。這里給出了一個VRML場景,場景的變化由用戶在外部進行操作。
2) 訪問VRML場景中的節點
實例中在VRML場景中定義一個名為ROOT的節點,然后在Java程序中通過browser.getNode(“ROOT”)語句進行訪問,返回一個Node類的實例Root。取得這個Node類實例也就意味著取得了該節點的索引,可以對其進行訪問。只有在VRML場景中使用了DEF命名的節點才能被Java applet訪問。在這里,browser是Browser類的一個實例。
3) 發送eventIn事件給場景的某一節點
在獲取一個被訪問節點的EventIn類實例后,便可向該節點發送時間。注意EventIn是Java抽象類,它沒有提供任何發送事件的方法,因此必須先將它強制轉化成合適的EventIn類的子類,如EventInSFVec3f,EventInSFColor,EventInMFNode等。這些子類均含有發送相應類型事件的方法。例如,實例中在VRML場景中添加造型的部分Java語句:
public boolean action(Event event, Object what) {
……
EventInMFNode addChildren = (EventInMFNode) root.getEventIn(\"addChildren\");
addChildren.setValue(curClump.transArray);
……}
4) 讀取場景中某一節點的EventOut事件
和類EventIn相似,類EventOut也是一個Java抽象類。EAI提供了它的一系列子類,如EventOutSFVec3f,EventOutSFFloat,EventOutSFColor等。通過這些子類,Applet可以方便地讀取每個命名節點的eventOut。實例中的相應的部分Java語句:
rotation_changed = (EventOutSFRotation) transform.getEventOut(\"rotation\");
scale_changed = (EventOutSFVec3f) transform.getEventOut(\"scale\");
translation_changed = (EventOutSFVec3f) transform.getEventOut(\"translation\");
diffuseColor_changed = (EventOutSFColor) material.getEventOut(\"diffuseColor\");
touchTime_changed = (EventOutSFTime) sensArray[0].getEventOut(\"touchTime\");
5) 監聽場景事件
實例中實現了每當一個新的EventOut產生時,Applet便能自動調用一個例程來處理,不像SAI通過在VRML場景中建立路由實現。針對這個問題,EAI提供了一種監聽eventOut的機制,這種機制主要表現在接口類EventOutObserver和EventOut的advise()方法上。首先將EventOutObserver子類化,在子類中實現callback(),然后調用advise()方法使子類與要監聽節點的EventOut掛接。這樣,無論何時只要被監聽的節點EventOut有輸出時,掛接EventOutObserver子類的callback()方法便會自動執行。
6) 添加與刪除節點
為實現VRML場景的靈活與完美,需要在Applet中實現了VRML節點的動態增加和刪除。這里要用到類Browser的createVrmlFromString()方法。此方法的參數是一個內容符合VRML規范的字符串,它返回一個類Node的實例數組。這些Node實例是在VRML場景的外部環境中生成的。
實例中實現了節點的動態增加,要添加一個新節點,注意首先要獲得父節點,也就是對于欲添加的節點必須使用DEF命名;其次,addChildren的值類型定義為MFNode,因此在調用方法addChildren.setValue()時,傳遞的參數就是一個Node數組。刪除節點與添加節點極為類似,只是添加節點調用的是addChildren入事件,而刪除節點調用的則是removeChildren入事件。
7) 嵌入網頁
VRML場景中任何使用DEF定義的節點都可以被Java Applet程序所訪問,獲得一個節點的句柄后,該節點的EventIn和eventOut就能被引用。Java Applet可以監視VRML場景中節點的改變并能夠在節點間傳遞事件來直接改變節點的屬性。這種方法實現將VRML和Java都作為網頁的嵌入,以Java Applet作為控制的核心,VRML場景作為三維展示的平臺。因此在HTML文檔中使用標記來放置VRML源文件,而Java Applet通過標記同樣包含在HTML文檔中。這樣Java Applet和VRML都被包含在一個HTML文件中,它們可以互相訪問,從而實現復雜的交互功能。圖2為添加造型后的界面。圖中下方有三個按鈕:Cube、Sphere、Cone;有控制Translation、Rotation、Scale和Color的滾動條。當點擊不同的按鈕時,VRML場景中相應添加造型,同時可對造型的坐標、旋轉角度、尺度和顏色進行控制,其結果如圖3所示。
■ ■
圖2 添加原始造型 圖3 交互后的造型
4 結束語
VRML是網絡三維描述性語言,具有網絡應用的優勢。Java語言具有跨平臺、易于移植的特點,利用VRML與Java編程技術可以彌補VRML功能上的不足,實現對虛擬世界更靈活的控制權,從而得到更強的交互性和實時性。通過研究VRML與Java利用外部授權接口EAI的交互技術并利用VRML建立一個虛擬場景,利用Java進行控制,對VRML場景添加造型并對造型做出相應改變,體現出VRML與Java很好的交互效果,使用戶真正成為VRML中的一個角色,一個參與者。VRML憑借強大的三維虛擬場景功能,再結合Java交互性,真正將其變成為一個廣闊的三維空間。
參考文獻:
[1] ISO/IEC 14772-1:1997,The Virtual Reality Modeling Language International Standard Part1[S].
[2] 賽博科技工作室. VRML與JAVA編程技術[M]. 北京:人民郵電出版社,2004:78-93.
[3] 汪興謙. VRML與Java編程實例講解[M]. 北京:中國水利水電出版社,2001:193-213.
[4] Bemhard Jung,Jan-Torsten Midde. Educational use of VRML and Java in agent-based AI and computer graphics[J].Future Generation Computer System,2000,(17):79-87.
[5] ISO/IEC 14772-2:2002,The Virtual Reality Modeling Language International Standard Part2:EAI[S].
[6] 吳波, 周之平, 張颯兵, 等. 基于VRML-JAVA的虛擬現實及其協同環境的開發[J].計算機工程與應用,2004,(7):136-138.
[7] 戴開宇, 戚可濤, 張申生. 基于Java和VRML的共享虛擬環境架構的研究[J].計算機工程與應用,2002,(19):180-183.
[8] 王汝傳, 姚旭敏, 王海艷, 等. 基于Java和VRML虛擬場景通信方式的研究[J].系統仿真學報,2003,15(7):986-990.
[9] 許松, 李文娟. Java在控制VRML場景中的應用[J].中國電力教育,2007,(3):207-208.