基于VRML_JAVA的虛擬場(chǎng)景交互的實(shí)現(xiàn)_馬萬(wàn)全
基于VRML/JAVA的虛擬場(chǎng)景交互的實(shí)現(xiàn)馬萬(wàn)全1, 單美賢2(1.東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院, 江蘇南京210096;2. 南京郵電大學(xué)傳媒技術(shù)學(xué)院, 江蘇南京210003)摘 要:Javra是一
基于VRML/JAVA的虛擬場(chǎng)景交互的實(shí)現(xiàn)
馬萬(wàn)全1, 單美賢2
(1.東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院, 江蘇南京210096;2. 南京
郵電大學(xué)傳媒技術(shù)學(xué)院, 江蘇南京210003)
摘 要:Javra是一個(gè)以EAI 為基礎(chǔ)的處理VRML 場(chǎng)景圖的Java 包, 克服了VRML 與Java 通過(guò)內(nèi)
部Script 節(jié)點(diǎn)和EAI 方式進(jìn)行交互的不足:用戶操作實(shí)時(shí)生成的VRML 事件可以在Javra 中捕捉
到并加以處理。Javra 和VRML 瀏覽器的結(jié)合, 使得生成3D 交互應(yīng)用程序更有效。 關(guān)鍵詞:Java;VRML;EAI;Javra;場(chǎng)景圖
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
VRML(Virtual Reality Modeling Language) 虛擬現(xiàn)實(shí)建模語(yǔ)言, 是一種三維造型和渲染的圖形描述性語(yǔ)
言。通過(guò)VRML, 人們可以建立豐富的三維場(chǎng)景, 但是VRML 本身并沒(méi)有直接和用戶進(jìn)行交互的能力, 它
需要與其他評(píng)議結(jié)合才能實(shí)現(xiàn)三維場(chǎng)景和用戶交互的要求,Java 語(yǔ)言提供了這種可能性。本文主要論述
VRML 與Java 的交互方式和Javra 的使用。
1 VRML 與Java 之間的交互方式
VRML 產(chǎn)生事件的方式可以歸結(jié)為基于TimeSensor 的靜態(tài)行為和基于程序的動(dòng)態(tài)行為兩種, 前者僅能
執(zhí)行預(yù)定的決策邏輯, 對(duì)于一些復(fù)雜的動(dòng)畫動(dòng)作、實(shí)時(shí)控制事件、智能推理能力等, 就需要其他編程語(yǔ)言(如
Java) 的支持, 當(dāng)前主流VRML 瀏覽器也都對(duì)Java 編程提供了支持。在VRML 中使用Java 語(yǔ)言有兩種方
式, 即通過(guò)內(nèi)部Script 節(jié)點(diǎn)和外部編程接口(EAI)進(jìn)行。
1.1 內(nèi)部Script 節(jié)點(diǎn)
圖1 利用Script 節(jié)點(diǎn)進(jìn)行動(dòng)畫設(shè)計(jì)的框圖
Script 節(jié)點(diǎn)支持VRMLScript 和
JavaScript(兩者通過(guò)內(nèi)置接口通信),
支持SUN 公司的Java, 其通過(guò)內(nèi)置接
口或者專用API 與VRML 通信。
Script 節(jié)點(diǎn)的URL 域可以包含一段
,JavaScript 程序或者是鏈接的一個(gè)JA-
V A class。利用Script 節(jié)點(diǎn)進(jìn)行動(dòng)畫
設(shè)計(jì)的過(guò)程可以用圖1表示:①通過(guò)
eventIn 將事件傳至Script 節(jié)點(diǎn)中的腳
本(Java或JavaScript); ②在腳本中進(jìn)
行處理; ③通過(guò)eventOut 將結(jié)果送回
Script 節(jié)點(diǎn)。
通過(guò)Script 實(shí)現(xiàn)的動(dòng)態(tài)場(chǎng)景中的事件(輸入和輸出) 均在VRML 內(nèi)部節(jié)點(diǎn)之間進(jìn)行傳遞, 雖然可以實(shí)現(xiàn)
相應(yīng)瀏覽者的交互功能, 但對(duì)于與外界的信息交流包括信息的輸入和輸出卻顯得力不從心。
1.2 外部編程接口(External Authoring Interface)EAI
Script 節(jié)點(diǎn)從VRML 場(chǎng)景內(nèi)部提供了與Java 的連接, 而EAI 定義了與外部HTML 頁(yè)面中的Applet 通
信的接口。EAI 技術(shù)是利用定義的一套針對(duì)VRML 瀏覽器的Java 類實(shí)現(xiàn)對(duì)VRML 場(chǎng)景的控制, 它的基本
思想是將Java applet與VRML 置于同一web 頁(yè)面, 在Java applet中建立browser 對(duì)象以標(biāo)識(shí)一個(gè)唯一的
VRML 場(chǎng)景, 并由此獲得對(duì)VRML 場(chǎng)景中已定義節(jié)點(diǎn)的引用, 它通過(guò)直接指定引用節(jié)點(diǎn)的域值而達(dá)到動(dòng)態(tài)
效果。這樣Java applet即可控制VRML 場(chǎng)景, 也能進(jìn)行與HTML 等其他媒體的交互以及網(wǎng)絡(luò)控制, 從而可
以實(shí)現(xiàn)復(fù)雜的虛擬環(huán)境系統(tǒng)。
圖2 EAI 的交互原理圖
圖2是EAI 的交互原理。A 、Brows-
er 類是對(duì)VRML 場(chǎng)景的一個(gè)Java 封裝,
通過(guò)getBrowser()方法獲得當(dāng)前瀏覽環(huán)
境信息;B 、訪問(wèn)某個(gè)節(jié)點(diǎn)產(chǎn)生要用
Browser 類的getNode()方法來(lái)獲得一個(gè)
Node 類實(shí)例;C 、在獲得Node 類實(shí)例后,
可以通過(guò)Node 類所提供的getEventIn()
和getEventOut()方法對(duì)節(jié)點(diǎn)進(jìn)行訪問(wèn);
D 、如果需要在Applet 中實(shí)現(xiàn)VRML 節(jié)
點(diǎn)的動(dòng)態(tài)增加和刪除, 就得利用到Brows-
er 類的一個(gè)方法:createVrmlFromString
()。此方法的參數(shù)是一個(gè)內(nèi)容符合
VRML 規(guī)范的字符串, 它返回一個(gè)Node
類的實(shí)例數(shù)組, 這些Node 實(shí)例是在VRML 場(chǎng)景的外部環(huán)境中生成的。E 、讀取VRML 場(chǎng)景中節(jié)點(diǎn)事件出
口所發(fā)出的最新值;F 、當(dāng)VRML 場(chǎng)景中節(jié)點(diǎn)的事件出口發(fā)出一個(gè)事件時(shí), 能得到一個(gè)通知, 激活callback 方
法。
VRML 瀏覽器通過(guò)EAI 與Java 程序進(jìn)行通信,EAI 使得程序員可以控制VRML 世界, 然而EAI 不是
一個(gè)很方便的編程方式, 因?yàn)橛蒍ava 設(shè)計(jì)的節(jié)點(diǎn)不再能訪問(wèn), 或者說(shuō)這些節(jié)點(diǎn)必須在VRML
,中被激活, 這
就使得用戶接口變得不友善, 我們可以通過(guò)Javra 加以改善。
2 Javra
圖3 Javra 和EAI 簡(jiǎn)單的關(guān)系圖
Javra 是一個(gè)以EAI 為基礎(chǔ)的處理
VRML 場(chǎng)景圖的Java 包,VRML 瀏覽器
處理基本的3D 場(chǎng)景交互(如平移、旋轉(zhuǎn)
等),Javra 處理Java 程序和VRML 之間
的通信。Javra 和VRML 瀏覽器的結(jié)合,
使得生成3D 交互應(yīng)用程序更有效:具有
Javra 的VRML 場(chǎng)景圖支持VRML 節(jié)點(diǎn)
類和設(shè)置這些節(jié)點(diǎn)的方法, 因?yàn)檫@些節(jié)點(diǎn)
可以完全自動(dòng)生成; 另外, 當(dāng)用戶操作時(shí)
生成的VRML 事件可以在Javra 中捕捉
到并加以處理。
2.1 EAI 與Javra 的關(guān)系
圖3是Javra 和EAI 簡(jiǎn)單的關(guān)系圖。
EAI 通過(guò)Node 類和Browser 類訪問(wèn)
VRML 瀏覽器中的場(chǎng)景圖。在Javra 程序中生成本地的場(chǎng)景圖, 稱之為JavraNodes, 可以被其他文件或
VRML 瀏覽器訪問(wèn)。在Javra 程序中, 場(chǎng)景圖中的每一個(gè)JavraNode 都對(duì)應(yīng)著瀏覽器中的一個(gè)節(jié)點(diǎn), 當(dāng)
JavraNode 發(fā)生改變時(shí), 通過(guò)設(shè)置域值產(chǎn)生一個(gè)VRMLEvent 并發(fā)送到瀏覽器, 從而引起瀏覽器中相應(yīng)節(jié)點(diǎn)
的改變。與此相似, 瀏覽器能將VRML 事件(如用戶點(diǎn)擊了場(chǎng)景中的物體) 發(fā)送到應(yīng)用程序。
2.2 JavraNode
圖4 JavraNode 的層次關(guān)系示意圖
從Javra 包中可以獲得以下信息:節(jié)點(diǎn)
名; 域(域的屬性 eventIn...>、類型 MFNode...>、域名、默認(rèn)值); 類的層次關(guān) 系。在Java 的類文件中為每一個(gè)exposed- Field 域的節(jié)點(diǎn)生成set_和get_方法。部分類 的層次關(guān)系如圖4所示(圖中加黑的節(jié)點(diǎn)是 新引入的節(jié)點(diǎn)), 所有的類都是JavraNode 的 子類。例如圖4中的Box 節(jié)點(diǎn), 只有一個(gè)域 和一個(gè)set_和get_方法,Box 節(jié)點(diǎn)繼承于Ge- ometry, 因而可以作為Shape 節(jié)點(diǎn)的一個(gè)Ge- ometry 域值。 class Box extends Geometry{ float[]get_size(); void set_size(float[]a); } GroupingNode 節(jié)點(diǎn)是新節(jié)點(diǎn), 其部分程序如下: class GroupingNode extends ChildrenNode{ void addChildren(ChildrenNode[]a); void set_Children(ChildrenNode[]a); ...... } 3 Javra 的使用 Javra 節(jié)點(diǎn)的使用和VRML 節(jié)點(diǎn)的使用一樣, 下面我們通過(guò)舉例來(lái)說(shuō)明如何建立、輸出Javra 場(chǎng)景圖, 如 何與Javra 場(chǎng)景圖進(jìn)行交互。 3.1 Javra 場(chǎng)景圖的生成 在VRML 中, 場(chǎng)景圖是由相關(guān)聯(lián)的節(jié)點(diǎn)形成的, 如Box 基本造型的形成如下: Shape{ geometry Box{size 1 2 1} appearance Appearance{ material Material{diffuseColor 1 0 0} } } 下面一段程序是相應(yīng)的Javra 代碼, 節(jié)點(diǎn)之間的連接是調(diào)用相應(yīng)的set_函數(shù)實(shí)現(xiàn)的。建立Javra 場(chǎng)景圖 需要有一定的VRML 知識(shí), 一般而言,Javra 場(chǎng)景圖的生成如實(shí)地反映了VRML 場(chǎng)景圖的生成, 只是VRML 中的域名XXX(如appearance) 在Javra 中是通過(guò)調(diào)用set_XXX(set_appearance)方法實(shí)現(xiàn)的。 Material m=new Material(); m.set_diffuseColor(new float[]{1,0,0}); Appearance a=new Appearance(); a.set_material(m); Box b=new Box(); b.set_size(new float[]{1,2,1}); Shape s=new Shape(); s.set_geometry(b); s.set_appearance(a); 3.2 Javra 場(chǎng)景圖的輸出 Javra 場(chǎng)景圖可以輸出到支持EAI 接口的VRML 瀏覽器中或一個(gè)文件中(通過(guò)調(diào)用場(chǎng)景圖中上層節(jié)點(diǎn) 的print 方法實(shí)現(xiàn)) 。如果將Javra 場(chǎng)景圖輸出到瀏覽器中, 需要獲得相應(yīng)的瀏覽器句柄, 可以通過(guò)調(diào)用相應(yīng) 的EAI 方法實(shí)現(xiàn), 如browser.replaceWorld(new Node[]{s.getNode(browser)});語(yǔ)句。ReplaceWorld 方法是 再次調(diào)用browser nodes(Node[])的EAI 方法, 為了獲得相應(yīng)的節(jié)點(diǎn),JavraNode 通過(guò)調(diào)用getNode(browser) 方法來(lái)建立一個(gè)Node 。 Javra 除了可以用場(chǎng)景圖取代虛擬世界外,Javra 中的節(jié)點(diǎn)也可以加到已經(jīng)存在的虛擬世界中, 代碼如下: Node n=browser.getNode(“TOP ”); JavraNode j=JavraNodeFactory.createJavraNode(browser,n); Group g=(Group)j; 借助EAI 獲得一個(gè)在VRML 世界中定義的瀏覽器節(jié)點(diǎn), 如“TOP ”。節(jié)點(diǎn)n 可以通過(guò)JavraNodeFactory 類的createJavraNode 方法嵌入到JavraNode 的j 中。 3.3 與Javra 場(chǎng)景圖的交互 當(dāng)場(chǎng)景圖輸出到瀏覽器后, 場(chǎng)景的動(dòng)態(tài)部分既可以通過(guò)Javra 節(jié)點(diǎn)也可以通過(guò)瀏覽器節(jié)點(diǎn)使之改變。 用戶與場(chǎng)景的交互通過(guò)瀏覽器實(shí)現(xiàn), 應(yīng)用程序可以跟蹤在VrmlEvents 中的交互結(jié)果。Java 通過(guò)EAI 的 VrmlEventListener 接口類來(lái)監(jiān)聽(tīng)瀏覽器的接收事件。例如, 對(duì)于TouchSensor 傳感器的touchTime 事件, Javra 代碼可以表示如下: TouchSensor ts=new TouchSensor(); ts.advise(“touchTime ”,listener,data); 其中參數(shù)listener 是一個(gè)VrmlEventListener 接口類的對(duì)象實(shí)例,data 是用戶指定的與該事件相關(guān)聯(lián)的 對(duì)象, 當(dāng)該事件發(fā)生的時(shí)候,userData 就會(huì)一同被返回。 4 結(jié)束語(yǔ) Java 的加入為VRML 提供了強(qiáng)大的編程能力以及網(wǎng)絡(luò)訪問(wèn)能力, 使VRML 這種描述性語(yǔ)言對(duì)各種需 求功能的擴(kuò)充成為可能。VRML 完成場(chǎng)景的描述和接口的定義, 真正的交互和高級(jí)應(yīng)用由Java 來(lái)完成。 Javra 和VRML 瀏覽器的結(jié)合, 使得生成3D 交互應(yīng)用程序更有效。正是由于Java 和VRML 的結(jié)合, 使它們 成為創(chuàng)建基于網(wǎng)絡(luò)的大規(guī)模虛擬環(huán)境的理想綜合平臺(tái)。 參考文獻(xiàn) [1] 王汝傳, 等. 基于Java 和VRML 虛擬場(chǎng)景通信方式的研究[J].系統(tǒng)仿真學(xué)報(bào),2003,(7). [2] 舍 曼, 等. 虛擬現(xiàn)實(shí)系統(tǒng)———接口、應(yīng)用與設(shè)計(jì)[M].北京:電子工業(yè)出版社,2004. [3] (美)Burdea, 等. 虛擬現(xiàn)實(shí)技術(shù)(第二版)[M].北京:電子工業(yè)出版社,2005. [4] 韋有雙, 等. 虛擬現(xiàn)實(shí)與系統(tǒng)仿真[M].北京:國(guó)防工業(yè)出版社,2004. Realization the Communication of Virtual Scenes Based on VRML/Java Ma Wan-Quan1,Shan Mei-Xian2 (1.Department ofComputer Science,South East University,Nanjing210096,China; 2.Nanjing UniversityofPosts and Telecommunications,Nanjing210003,China) Abstract:Javra is a Java package for handling VRMLscene graph.Javra isbased upon the external authoring in- terface(EAI).As programming tool between Java and VRML,Script node and EAI have some weaknesses, which can be overcome by Javra,for example,.after a user acted,VRML events generated real-time can be caught and handled in Javra.The combination of Javra and a VRMLbrowser forms an effective start for generat- ing 3D interactive applications. Key words:Java;VRML;EAI;Javra;scene graph 81第26卷 馬萬(wàn)全, 單美賢:基于VRML/JAV A 的虛擬場(chǎng)景交互的實(shí)現(xiàn)