基于Java的VRML網(wǎng)絡(luò)通信功能的實(shí)現(xiàn)
本文關(guān)鍵詞:基于Java的VRML網(wǎng)絡(luò)通信功能的實(shí)現(xiàn),由筆耕文化傳播整理發(fā)布。
虛擬現(xiàn)實(shí)是采用以計(jì)算機(jī)技術(shù)為核心的現(xiàn)代高技術(shù)生成逼真的視、聽、觸覺一體化的特定范圍的虛擬環(huán)境,用戶借助必要的裝備,以自然的方式與虛擬環(huán)境中的對(duì)象進(jìn)行交互、相互影響,從而產(chǎn)生親臨等同真實(shí)環(huán)境的感受和體驗(yàn)。分布式虛擬現(xiàn)實(shí)帶來了人機(jī)界面、人機(jī)交互的新概念和新方法,使得人機(jī)交互的內(nèi)容更加豐富、形象,方式更加自然、和諧。分布式虛擬現(xiàn)實(shí)技術(shù)推動(dòng)了虛擬現(xiàn)實(shí)技術(shù)的變革。然而,若要對(duì)VRML場(chǎng)景進(jìn)行分布式控制,還需要Script節(jié)點(diǎn)具有網(wǎng)絡(luò)通信功能[3]。但這是一般腳本語言(如JavaScirpt、VRMLScript)所不具有的功能。
2 VRML和Java的結(jié)合
VRML通過事件通路使相應(yīng)的節(jié)點(diǎn)發(fā)生變化,,達(dá)到簡(jiǎn)單
的動(dòng)態(tài)和交互的效果,為了擴(kuò)展VRML的交互能力和處理能力,提高其分布式控制能力需要程序語言的介入。在網(wǎng)絡(luò)環(huán)境下,Java是最具魅力的語言,與VRML結(jié)合得相當(dāng)自然,當(dāng)前的主流VRML瀏覽器也都對(duì)Java編程提供了支持。在VRML中使用Java有2種方式,即通過內(nèi)部Script節(jié)點(diǎn)(Script
Authoring Interface,
SAI)和外部編程接口(External Authoring Interface,EAI)。
(1)內(nèi)部Script節(jié)點(diǎn)。在VRML中有一個(gè)Script節(jié)點(diǎn),它擁有域、eventIn事件、eventOut事件。其本身沒有任何動(dòng)作,但可以通過程序腳本賦予腳本節(jié)點(diǎn)的動(dòng)作。Script節(jié)點(diǎn)和利用Java或JavaScript語言寫成的程序腳本,提供了對(duì)VRML的交互性的強(qiáng)有力的擴(kuò)充。通過Script節(jié)點(diǎn)的URL域可以包含一段JavaScript程序或者是鏈接的一個(gè)外部Java的類文件。 在Script節(jié)點(diǎn)中引用外部的Java的類文件,通常只是實(shí)現(xiàn)一些特殊的、描述性語言不能實(shí)現(xiàn)的功能,如通信功能,或者是為了源程序保密。
(2)外部編程接口EAI。Script節(jié)點(diǎn)從VRML場(chǎng)景內(nèi)部提供了與Java的連接,而EAI定義了與外部HTML頁(yè)面中的Applet通信的接口。它的基本思想是將JavaApplet與VRML置于同一Web頁(yè)面,在JavaApplet中建立Browser對(duì)象以標(biāo)識(shí)一個(gè)唯一的VRML場(chǎng)景,并由此獲得對(duì)VRML場(chǎng)景中已定義節(jié)點(diǎn)的引用,它通過直接指定引用節(jié)點(diǎn)的域值達(dá)到動(dòng)態(tài)效果。
這2種方式各有所長(zhǎng)[4]。使用EAI可以一目了然地在JavaApplet中輸入各種參數(shù)以改變場(chǎng)景的內(nèi)容,控制靈活;SAI方式不需要有JavaApplet的存在,只要為場(chǎng)景中的物體寫相應(yīng)的腳本代碼即可,可以實(shí)現(xiàn)許多VRML規(guī)范不能提供的復(fù)雜邏輯顯示。由于EAI方式不是真正意義上的分布式控制,因此本文主要介紹第1種方式。
3 VRML與外界網(wǎng)絡(luò)通信的Java實(shí)現(xiàn)
利用Script節(jié)點(diǎn)的特點(diǎn),用Java編寫成腳本語言,并將Java的網(wǎng)絡(luò)功能和文件訪問功能引入到腳本語言中,從而能夠?qū)崿F(xiàn)VRML的分布式交互仿真。圖1給出了一個(gè)有網(wǎng)絡(luò)功能的VRML的實(shí)現(xiàn)模型。后面將介紹如何利用Java實(shí)現(xiàn)VRML的通信功能。
圖2 具有通信功能的VRML實(shí)現(xiàn)模型
—48 —
3.1 Java程序的定義
VRML中使用的Java文件,必須滿足3個(gè)條件[5,6]:(1)包含一個(gè)名字和主文件名完全相同的類定義;(2)屬于Script類(vrml.node包)的子類;(3)將其說明為“public”類。其定義如下:
public class className extends Script {
...
initialize(); processEvents(); processEvent(); eventsProcessed(); shutdown();
... }
初始化函數(shù)initialize()在VRML 文件加載時(shí)運(yùn)行,將Script節(jié)點(diǎn)中的事件入口(eventIn)和事件出口(eventOut)轉(zhuǎn)變成Java語言中相應(yīng)的變量類型。事件入口或事件出口的處理由此變成了對(duì)這些變量的處理。
用戶收到一系列事件時(shí),調(diào)用processEvents()函數(shù)進(jìn)行處理。processEvent()用于處理某一事件,事件處理完畢調(diào)用eventsProcessed()。在函數(shù)processEvent()中處理事件入口socketPort(須在VRML文件中定義),該事件入口表示Socket通信的端口號(hào)。獲得這個(gè)事件后,函數(shù)便生成一個(gè)新線程,新線程提供了端口號(hào)為socketPort的Socket服務(wù)。
shutdown()函數(shù)在刪除Script節(jié)點(diǎn)時(shí)調(diào)用,用以關(guān)閉Socket連接。
3.2 Script節(jié)點(diǎn)的域和事件的獲取
在Java程序中,通過調(diào)用getField()函數(shù)獲得Script節(jié)點(diǎn)中的域?qū)ο螅徽{(diào)用 getEventOut()函數(shù)獲得事件出口(出事件);調(diào)用 getEventIn()函數(shù)獲得事件入口(入事件)。 3.3 讀域和事件
在Java程序中通過調(diào)用getValue()函數(shù)將VRML的域類型轉(zhuǎn)化成相應(yīng)的Java平臺(tái)的數(shù)據(jù)類型并返回其值。 3.4 寫域和事件
在Java程序中,通過setValue()函數(shù)將Java平臺(tái)的變量value轉(zhuǎn)化成VRML類型的數(shù)據(jù)并拷貝到目標(biāo)對(duì)象,可用來設(shè)置事件出口;通過addValue()函數(shù)將Java平臺(tái)的變量value轉(zhuǎn)化成VRML類型的數(shù)據(jù)并添加到目標(biāo)對(duì)象中;通過insertValue()函數(shù)將Java平臺(tái)的變量value轉(zhuǎn)化成VRML類型的數(shù)據(jù)并在指定位置插入;通過clear()函數(shù)刪除目標(biāo)對(duì)象中的所有元素;通過delete()函數(shù)刪除目標(biāo)對(duì)象中索引值為index的元素。
3.5 VRML網(wǎng)絡(luò)通信的Java實(shí)現(xiàn)
(1)在Script的事件入口處理函數(shù)processEvent()中,增加了起動(dòng)一條新線程的語句:
processEvent (Event event) { ... Thread thread; ... thread = new Thread(this); thread.start(); ... }
(2)在線程執(zhí)行函數(shù)run()中,加入了提供socket服務(wù)器服務(wù)的語句:
public void run(){
Socket socket;
本文關(guān)鍵詞:基于Java的VRML網(wǎng)絡(luò)通信功能的實(shí)現(xiàn),由筆耕文化傳播整理發(fā)布。
本文編號(hào):114649
本文鏈接:http://sikaile.net/kejilunwen/wltx/114649.html