国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

VRML與JAVA在網絡課件交互運用

2019-11-17 04:58:49
字體:
來源:轉載
供稿:網友
    虛擬現實建模語言(Virtual Reality Modeling Language 即VRML)和java語言都是 可執行的代碼“技術,通過網絡傳輸的只是一個很小的描述文件(指令性數據集),客戶端通過本地的VRML瀏覽器、JAVA虛擬機交互地訪問這些文件并解釋執行。將Java與VRML結合,能夠很好地實現網絡多媒體課件技術:使用VRML進行場景構造,內嵌用Java編寫的程序設計實現對象的編程行為。這使VRML在網上創建布滿真實感的三維虛擬世界,為用戶提供一種自然的、身臨其境的體驗方式,包括交互性、動態效果、連續性及參與感,而這將是未來網絡教學的主要形式之一。    1、 VRML簡單交互    VRML簡單交互,即VRML空間中各節點間數據交互。VRML有統一的數據傳輸接口和完善的屬性集合和事件集合,可接收傳感器節點發送過來的數值,并根據所對應的接口屬性域設置提取數據、改變自身的屬性值、觸發事件進而改變自己在空間中的位置、外型和顯示效果,還可以將處理后的數據送到輸出域,傳遞給其他模型節點。各節點通過接口域的相互路由(route to)實現數據傳輸,路由的映射關系自由,但接口域的數據規格必須嚴格一致。    2、VRML擴展交互    VRML本身交互機制是無法構建一個大型多媒體課件的,因為VRML本身不能完成普通程序設計中的轉折、分支、循環等基本特征。因此實際系統設計中,可利用Java語言提供的強大網絡編程能力,編寫與遠程系統通信和共享能力處理等功能的應用程序。Java對VRML的所有支持都通過附加的封裝類實現。通過這些類,Java程序就能夠訪問VRML場景、接受和發送事件、從頁面上得到VRML對象等,實現對VRML場景的完全控制。[2]根據訪問方式的不同,又可分為:腳本編程接口SAI(Script Authoring Interface) 交互與外部編程接口EAI(EAI External Authoring Interface) 交互。    2.1腳本編程接口SAI交互    SAI交互即使用事件機制和路由利用Script節點實現VRML與 Java(或Javascript)的交互。首先,通過eventIn將事件傳至Script節點中的腳本;其次,在Script節點中的腳本中調用相應的Java類(或JavaScript)進行處理;最后,通過eventOut將結果送回到VRML場景以實現動畫或交互。    VRML的Script節點是一種控制傳感器和內插器的節點,通過它可以定義和改變場景中對象的外觀和行為。Script節點的URL域可以包含一段JavaScript程序或者是鏈接的一個JavaClass.SCRIPT節點可放置在場景的任何地方,用DEF命名它,從而完成事件的刪除成傳遞。SCRIPT節點的字段是由用戶延伸的,到達這些字段的字段會自動移到和SCRIPT節點相關程序中。另外,SCRIPT節點也能夠通過編寫合適程序腳本,動態生成(改變)三維造型并綁定合適的感應器和內插器。    2.1. 1Java通過Script類(vrml.node包)與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); 作為參數的fieldName、eventInName、eventOutName要與Script節點中定義的名稱相符合,對應的Field類的子類(vrml.filed包)與Script節點中定義的各種Type類型一致。它提供getValue()和setValue()方法。    再則,通過Script類提供的PRocessEvent(Event p0)或processEvents(int p0, Event[] p1)方法來捕捉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中的各類節點,完成整個通信過程。    2.1.2 Java通過Script節點和Node類(vrml.node包)直接修改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 p0)、getEventIn(String p0)方法,分別得到節點的field和eventIn域,并把結果作為Field類;再通過各Field類的子類提供的方法讀取和設置值,將設置結果直接返回節點,不用再設置路由,從而達到了直接修改節點的目的。    Node類還提供了getEventOut(String p0)方法,用它可以得到節點的eventOut域,與前兩個方法不同,它得到的結果是一個不能修改的Field類,即Field類的子類ConstField類。 使用改進后的方法,可以有效的縮減代碼長度,節省VRML文件的計算時間,提高VRML場景的生成速度。    2.1.3 Java通過Script節點和Browser類(vrml包)直接創建VRML場景    設置Group節點的addChindren和removeChindren的值來可添加和刪除具體節點,但還無法操作路由。當有大量不同的并相互關聯的節點要通過java在VRML中創建時,工作量是難以想象的。為了滿足這一要求,Script類繼續BaseNode(vrml包)類,BaseNode類中定義了兩個方法:getBrowser()和getType()。getBrowser()方法將會返回BaseNode類所處的瀏覽器。Browser類存在于vrml包中,它提供了一系列方法來對整個VRML文件進行控制。 如:    (1)、添加和刪除路由:addRoute(SFNode fromNode,SFString fromEventOut,SFNode toNode,SFString toEventIn),deleteRoute(SFNode fromNode,SFString fromEventOut,SFNode toNode,SFString toEventIn)    (2)、直接創建VRML:createVrmlFromString(SFString vrmlSyntax)(把要創建的節點語法以字符串的方式作為參數寫入)    (3)、在VRML中建立相應節點:createVrmlFromURL(MFString url,SFNode node,SFString event)(該方法的提供節點語法的參數是放在url地址所指出的VRML文件中,瀏覽器通過url找到要加入的節點,把它加入到node參數指定的節點中event參數指定的eventIn域中)    (4)、用指定的節點來替換整個VRML文件:replaceWorld(MFNode nodes)    用url指定的另一個VRML文件來替換當前的文件:loadURL(MFString url,MFString parameter)。    Script類執行initialize()方法時,得到瀏覽器實例,然后processEvent(Event e)方法執行時使用上述方法建立、修改VRML場景。 通過改進,不僅VRML文件代碼長度縮減,java程序代碼也大大減少,進一步提高了VRML場景的生成速度。    2.2外部編程接口(EAI)交互    SAI交互VRML離不開Script節點和Script類(vrml.node包)。為了實現通信功能編寫的java類都必須繼續自Script類。但java不支持多繼續,假如用Applet操控VRML場景, java程序要繼續Script類的方法相當復雜。非凡是要把VRML文件與Applet集成在同一個Html頁面時,用Script類來實現頗為困難,而且程序代碼冗長、可擴展性差。    VRML97標準提供的EAI定義了外部環境怎樣通過VRML現存的事件驅動模式來訪問VRML內部的節點的一系列方法,實現了Applet與VRML場景的通信。EAI包含瀏覽器腳本接口的全部功能,例如查詢瀏覽器的狀態,增加或刪除路由,生成新的節點等功能。
    Java主要使用Browser和Node兩個類(vrml.external包),以及其它一些如處理eventIn域和eventOut域的各個屬性類(EventIn*、EventOut*)和處理例外的各種*Exception類完成對EAI的描述。    Browser類提供了三個方法:getBrowser(Applet pApplet)、getBrowser(Applet pApplet,String frameName,int 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 value,double timeStamp,Object data)方法響應事件。    通過Browser和Node類,可以拋棄Script節點和Script類甚至路由而現實對VRML文件的各種節點即Node類的各個實例直接操控。但getBrowser()方法的參數必須是Applet的實例,因而該方法只能通過Applet來控制VRML.    3.總結    VRML與其它實現三維場景的技術手段(如OpenGL,Cult3D,3DSMAX,Viewpoint)相比,具有語法簡單、三維建模功能強大、便于網上發布等優點。但由于VRML本身僅僅是一種標準,不可能滿足各行各業的所有需要。所以,高級交互功能的實現必須借助于Java等功能強大的高級語言。這樣,可以有效地彌補VRML本身的一些不足(例如邏輯判定、文件操作、鍵盤輸入、精確控制場景等),進而完善與HTML等其它媒體的交互,也可實現復雜的虛擬環境系統網絡課件。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莎车县| 平凉市| 谢通门县| 广州市| 红河县| 湖口县| 施甸县| 阿鲁科尔沁旗| 衢州市| 任丘市| 邯郸市| 绥滨县| 额济纳旗| 岗巴县| 奉节县| 清新县| 宣城市| 阜城县| 盐边县| 侯马市| 秭归县| 沧源| 奉新县| 玛曲县| 长治县| 壶关县| 高尔夫| 顺昌县| 内乡县| 杂多县| 商南县| 西安市| 松潘县| 渝北区| 新密市| 齐齐哈尔市| 松原市| 竹溪县| 金寨县| 巴彦县| 应城市|