虛擬現實建模語言(Virtual Reality Modeling Language 即VRML)和Java語言都是 可執行的代碼技術通過網絡傳輸的只是一個很小的描述文件(指令性數據集)客戶端通過本地的VRML浏覽器JAVA虛擬機交互地訪問這些文件並解釋執行將Java與VRML結合能夠很好地實現網絡多媒體課件技術使用VRML進行場景構造內嵌用Java編寫的程序設計實現對象的編程行為這使VRML在網上創建充滿真實感的三維虛擬世界為用戶提供一種自然的身臨其境的體驗方式包括交互性動態效果連續性及參與感而這將是未來網絡教學的主要形式之一
VRML簡單交互
VRML簡單交互即VRML空間中各節點間數據交互VRML有統一的數據傳輸接口和完善的屬性集合和事件集合可接收傳感器節點發送過來的數值並根據所對應的接口屬性域設置提取數據改變自身的屬性值觸發事件進而改變自己在空間中的位置外型和顯示效果還可以將處理後的數據送到輸出域傳遞給其他模型節點各節點通過接口域的相互路由(route to)實現數據傳輸路由的映射關系自由但接口域的數據規格必須嚴格一致
VRML擴展交互
VRML本身交互機制是無法構建一個大型多媒體課件的因為VRML本身不能完成普通程序設計中的轉折分支循環等基本特征因此實際系統設計中可利用Java語言提供的強大網絡編程能力編寫與遠程系統通信和共享能力處理等功能的應用程序Java對VRML的所有支持都通過附加的封裝類實現通過這些類Java程序就能夠訪問VRML場景接受和發送事件從頁面上得到VRML對象等實現對VRML場景的完全控制[]根據訪問方式的不同又可分為腳本編程接口SAI(Script Authoring Interface) 交互與外部編程接口EAI(EAI External Authoring Interface) 交互
腳本編程接口SAI交互
SAI交互即使用事件機制和路由利用Script節點實現VRML與 Java(或JavaScript)的交互首先通過eventIn將事件傳至Script節點中的腳本其次在Script節點中的腳本中調用相應的Java類(或JavaScript)進行處理最後通過eventOut將結果送回到VRML場景以實現動畫或交互
VRML的Script節點是一種控制傳感器和內插器的節點通過它可以定義和改變場景中對象的外觀和行為Script節點的URL域可以包含一段JavaScript程序或者是鏈接的一個JavaClassSCRIPT節點可放置在場景的任何地方用DEF命名它從而完成事件的刪除成傳遞SCRIPT節點的字段是由用戶延伸的到達這些字段的字段會自動移到和SCRIPT節點相關程序中另外SCRIPT節點也能夠通過編寫合適程序腳本動態生成(改變)三維造型並綁定合適的感應器和內插器
Java通過Script類(vrmlnode包)與Script結點建立聯系控制VRML結點
首先定義Script節點中的各域域值設置路由(Route)使VRML中的其它節點與Script節點聯系起來當與Script節點有聯系的節點發生事件時事件通過路由傳給Script節點的eventIn域Script節點則通過url域中指定的地址找到java類
然後Java類開始工作最先執行的是initialize()方法在initialize()方法中必須獲得Script節點中eventIn或field域的值或者把java中的值返回給Script中的eventOut域Script類提供的方法有 getField(fieldName) getEventIn(eventInName) getEventOut(eventOutName) 作為參數的fieldNameeventInNameeventOutName要與Script節點中定義的名稱相符合對應的Field類的子類(vrmlfiled包)與Script節點中定義的各種Type類型一致它提供getValue()和setValue()方法
再則通過Script類提供的processEvent(Event p)或processEvents(int p Event[] p)方法來捕獲Script節點傳遞的事件processEvent和processEvents方法是所有外部事件公共的輸入點Java程序通過替代這兩個方法對事件做出相應的處理Vrml包中Event類的getName()方法返回事件名稱(該名稱與Script節點中發生該事件的eventInName相同)確定發生的事件從而做出相應的處理Event類的getValue()方法則返回一個ConstField類的實例 (它是Script節點中發生該事件的eventIn域)ConstField類是Field類的子類它沒有setValue()方法因而只能取出Script節點中eventIn域的值而不能修改
最後所有事件處理完後程序就調用Script類中的eventsProcessed()方法在這兒可以加入用戶想要實現的動畫交互等各種效果Script類中的shutdown()方法實現離開VRML文件的方式
通過Script節點能java程序處理過的數據返回給VRML文件通過初始化時getEventOut()得到的變量的setValue()方法將值傳遞給Script節點的eventOut域再通過路由傳遞給VRML中的各類節點完成整個通信過程
Java通過Script節點和Node類(vrmlnode包)直接修改VRML節點
通過Script節點和路由同時又必須在Script節點的eventOut域設置控制點java程序才能改變VRML文件中節點值當有大量數據需要傳送時這種給每個數據設置一個eventOut域加一個路由的方法顯然是相當麻煩的因此java提出直接修改節點的方法
Java直接修改場景中的節點仍然要用到Script節點首先在定義Script節點時將eventOut域改為field域fieldType定義為SFNode具體格式如下
field SFNode fieldname USE nodeName nodeName為要修改的節點名稱(在VRML中由DEF語句命名)產生一個指向名為nodeName節點的指針執行初始化時通過getField()方法得到相應的SFNode類的一個實例通過getValue()方法得到該類的值這裡它的值恰好是名稱為nodeName的Node類的實例然後通過Node類提供的方法直接修改節點getExposedField(String p)getEventIn(String p)方法分別得到節點的field和eventIn域並把結果作為Field類再通過各Field類的子類提供的方法讀取和設置值將設置結果直接返回節點不用再設置路由從而達到了直接修改節點的目的
Node類還提供了getEventOut(String p)方法用它可以得到節點的eventOut域與前兩個方法不同它得到的結果是一個不能修改的Field類即Field類的子類ConstField類 使用改進後的方法可以有效的縮減代碼長度節省VRML文件的計算時間提高VRML場景的生成速度
Java通過Script節點和Browser類(vrml包)直接創建VRML場景
設置Group節點的addChindren和removeChindren的值來可添加和刪除具體節點但還無法操作路由當有大量不同的並相互關聯的節點要通過java在VRML中創建時工作量是難以想象的為了滿足這一要求Script類繼承BaseNode(vrml包)類BaseNode類中定義了兩個方法getBrowser()和getType()getBrowser()方法將會返回BaseNode類所處的浏覽器Browser類存在於vrml包中它提供了一系列方法來對整個VRML文件進行控制 如
()添加和刪除路由addRoute(SFNode fromNodeSFString fromEventOutSFNode toNodeSFString toEventIn)deleteRoute(SFNode fromNodeSFString fromEventOutSFNode toNodeSFString toEventIn)
()直接創建VRMLcreateVrmlFromString(SFString vrmlSyntax)(把要創建的節點語法以字符串的方式作為參數寫入)
()在VRML中建立相應節點createVrmlFromURL(MFString urlSFNode nodeSFString event)(該方法的提供節點語法的參數是放在url地址所指出的VRML文件中浏覽器通過url找到要加入的節點把它加入到node參數指定的節點中event參數指定的eventIn域中)
()用指定的節點來替換整個VRML文件replaceWorld(MFNode nodes)
用url指定的另一個VRML文件來替換當前的文件loadURL(MFString urlMFString parameter)
Script類執行initialize()方法時得到浏覽器實例然後processEvent(Event e)方法執行時使用上述方法建立修改VRML場景 通過改進不僅VRML文件代碼長度縮減java程序代碼也大大減少進一步提高了VRML場景的生成速度
外部編程接口(EAI)交互
SAI交互VRML離不開Script節點和Script類(vrmlnode包)為了實現通信功能編寫的java類都必須繼承自Script類但java不支持多繼承如果用Applet操控VRML場景 java程序要繼承Script類的方法相當復雜特別是要把VRML文件與Applet集成在同一個HTML頁面時用Script類來實現頗為困難而且程序代碼冗長可擴展性差
VRML標准提供的EAI定義了外部環境怎樣通過VRML現存的事件驅動模式來訪問VRML內部的節點的一系列方法實現了Applet與VRML場景的通信EAI包含浏覽器腳本接口的全部功能例如查詢浏覽器的狀態增加或刪除路由生成新的節點等功能
Java主要使用Browser和Node兩個類(vrmlexternal包)以及其它一些如處理eventIn域和eventOut域的各個屬性類(EventIn*EventOut*)和處理例外的各種*Exception類完成對EAI的描述
Browser類提供了三個方法getBrowser(Applet pApplet)getBrowser(Applet pAppletString frameNameint index)和getNode(String name)方法前兩個方法是靜態方法直接在Applet類中使用這兩個方法得到Applet類和VRML所在的浏覽器類的實例getNode()方法可以直接得到VRML文件的具體節點(Node類)的實例用InLine語句嵌入在VRML文件中的各個節點是用getNode()方法是無法得到的這裡的Node類與方法一的Node類是完全不同的它用自己的getEventIn()和getEventOut()方法來得到VRML節點的各個域然後使用返回的Event*的實例的getValue()和setValue()方法來控制具體的值EventIn*類僅提供了設置值的setValue()方法EventOut*類相對復雜不僅提供了getValue()方法來獲得當前值還提供了監聽EventOut域的接口??EventOutObserver隨時監聽VRML節點中是否有新的EventOut事件發生一旦有新事件發生通過替代該接口提供的callback(EventOut valuedouble timeStampObject data)方法響應事件
通過Browser和Node類可以拋棄Script節點和Script類甚至路由而現實對VRML文件的各種節點即Node類的各個實例直接操控但getBrowser()方法的參數必須是Applet的實例因而該方法只能通過Applet來控制VRML
總結
VRML與其它實現三維場景的技術手段(如OpenGLCultDDSMAXViewpoint)相比具有語法簡單三維建模功能強大便於網上發布等優點但由於VRML本身僅僅是一種標准不可能滿足各行各業的所有需要所以高級交互功能的實現必須借助於Java等功能強大的高級語言這樣可以有效地彌補VRML本身的一些不足(例如邏輯判斷文件操作鍵盤輸入精確控制場景等)進而完善與HTML等其它媒體的交互也可實現復雜的虛擬環境系統網絡課件
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27349.html