邱龍輝, 葉 琳
(青島科技大學(xué)機電工程學(xué)院,山東 青島 266061)
工程圖學(xué)虛擬實驗采用Web+Java+VRML平臺,在網(wǎng)絡(luò)中構(gòu)建圖學(xué)學(xué)習(xí)實踐的空間,優(yōu)化學(xué)生的課內(nèi)和課后實驗和實踐訓(xùn)練環(huán)境。實驗系統(tǒng)要求能夠?qū)崿F(xiàn):① 三維立體的實時變形處理,如截交線實驗中的立體切割;② 立體之間的位置變化處理,如立體相貫實驗和組合體實驗中立體的定位;③ 實驗參數(shù)調(diào)整靈活:可以直接控制模型調(diào)整和通過 Web頁面的界面調(diào)整[1]。但VRML的基本節(jié)點本身并不具備實現(xiàn)這些目標的能力,要實現(xiàn)上述目標,必須能夠通過程序方便的控制虛擬實驗系統(tǒng)中虛擬模型,如獲得模型的狀態(tài)數(shù)據(jù)、讀取模型的幾何結(jié)構(gòu)數(shù)據(jù)、程序動態(tài)生成模型等,本文研究了使用Java平臺實現(xiàn)實驗系統(tǒng)的幾個關(guān)鍵技術(shù)。
Java程序控制VRML可以通過兩種方式,即通過 SAI (Script Authoring Interface)或 EAI(External Authoring Interface)[2]。SAI方式是通過VRML中的Script接口節(jié)點控制場景,充分利用了VRML原有的事件機制,但其Java程序類必須是Script類的子類[2-3],也就是說所編寫的Java類都必須繼承自Script類。EAI方式是使用一套針對VRML瀏覽器的Java類,實現(xiàn)了Java Applet與 VRML場景的通信。通過 EAI,Java Applet可以訪問當(dāng)前運行的 VRML場景,在外部直接操作、控制和修改 VRML內(nèi)部的場景。SAI和EAI相當(dāng)于Java對VRML場景的內(nèi)部控制和外部控制方法,可以滿足不同實驗的需要。
在系統(tǒng)中欲實現(xiàn)對 VRML場景的控制,應(yīng)首先在 VRML程序?qū)ζ溟_放的被控制節(jié)點使用DEF命名,建立該節(jié)點被檢索的標識,然后在Java程序中通過該名稱獲得對應(yīng)節(jié)點的Node類實例。在SAI和EAI中獲得節(jié)點實例的方法不同,SAI必須在Script節(jié)點中定義域,并使用USE關(guān)鍵詞引用對應(yīng)的節(jié)點,在 Java程序中使用getField()方法通過讀取Script節(jié)點中的域值獲得該實例。而EAI則相對靈活,只需使用getNode()方法即可直接獲得。
在虛擬實驗操作過程中,諸如截交線實驗的截平面、組合體實驗中構(gòu)件都需要獲得其空間位置,測繪實驗中需要獲得坐標點數(shù)據(jù),此時獲得場景中模型當(dāng)前的狀態(tài)數(shù)據(jù)和幾何結(jié)構(gòu)數(shù)據(jù)成為關(guān)鍵環(huán)節(jié)之一,正確讀取相關(guān)數(shù)據(jù)才能進行其他的相關(guān)操作。場景中模型的結(jié)構(gòu)數(shù)據(jù)和當(dāng)前的狀態(tài)是由節(jié)點的出事件和外露域的參數(shù)表現(xiàn)的,所以獲得模型的結(jié)構(gòu)數(shù)據(jù)和當(dāng)前的狀態(tài)就是獲得相應(yīng)節(jié)點的出事件和外露域參數(shù)。
使用VRML API時,獲得節(jié)點的出事件和外露域參數(shù)有兩個途徑:① 使用VRML的ROUTE語句,通過Script節(jié)點的eventIn獲得相關(guān)節(jié)點的狀態(tài)數(shù)據(jù),需要在 VRML文件中添加許多ROUTE語句,但只適用于SAI模式開發(fā);② 直接讀取 VRML節(jié)點的出事件和外露域,SAI和EAI均可以實現(xiàn)。
如圖1所示,直接讀取VRML節(jié)點出事件和外露域需要如下幾個步驟:
圖1 讀取出事件
(1)獲得Browser實例
本步驟需要定義一個 VRML API特有的Browser類,然后使用該類的 getBrowser()方法建立當(dāng)前的Browser類實例。Browser類實際上是對VRML場景的一個Java封裝,其中包含了獲取當(dāng)前瀏覽環(huán)境信息的各種方法。
(2)獲得節(jié)點(Node)實例
使用 SAI或 EAI開發(fā)時,獲得節(jié)點實例的方法不同:SAI必須在關(guān)聯(lián)的Script節(jié)點中定義域,并使用 USE關(guān)鍵詞引用對應(yīng)的節(jié)點,然后在 Java程序中使用 getField()方法通過讀取Script節(jié)點中的域值獲得該實例;而EAI則相對靈活,只需使用getNode()方法即可直接獲得。
(3)獲得節(jié)點出事件(eventOut)或外露域(exposedField)實例
模型的結(jié)構(gòu)數(shù)據(jù)和當(dāng)前的狀態(tài)數(shù)據(jù)是通過該節(jié)點的eventOut或exposedField反映的。所以應(yīng)先獲得該事件的實例。該實例的獲得通過Node類的getEventOut()方法實現(xiàn)。這一步驟需要將getEventOut得到的實例強制類型轉(zhuǎn)化為EventOut的相應(yīng)子類(如 EventOutMFVec3f),以實現(xiàn)讀取eventOut事件目的。
(4)讀取模型的狀態(tài)數(shù)據(jù)
通過eventOut實例的getValue()方法實現(xiàn)模型的狀態(tài)數(shù)據(jù)的讀取。
按照前述步驟,在虛擬截交線實驗中,采用了 EAI的方式實時獲得了切割平面位置。其中須定義變量如下:
在實驗過程中,經(jīng)常需要根據(jù)實驗需求動態(tài)的建立模型;當(dāng)針對實驗?zāi)P瓦M行諸如切割、拉伸等操作后,也需要重新生成虛擬模型。因此,使用 Java程序動態(tài)地生成虛擬模型成為了虛擬實驗的關(guān)鍵過程。
向VRML場景添加節(jié)點,需要以下5個步驟。
(1)獲得瀏覽器的管理。
(2)獲得父節(jié)點的控制
場景中一般使用Transform節(jié)點作為容納模型形體的父節(jié)點,在 VRML文件需要對相應(yīng)的Transform節(jié)點使用DEF定義名稱,同時在Java中使用Browser類的getNode()方法獲得該節(jié)點的Node類實例。
(3)獲得父節(jié)點的eventIn實例
向Transform節(jié)點中添加模型節(jié)點是通過該節(jié)點的eventIn事件addChildren實現(xiàn)的。所以必須先獲得該事件的實例。該實例的獲得通過Node類的 getEventIn()方法實現(xiàn)。此處同樣需要注意的是將getEventIn得到的addChildren實例強制轉(zhuǎn)化為EventIn的子類EventInMFNode。
(4)建立新模型節(jié)點數(shù)據(jù)
模型節(jié)點數(shù)據(jù)生成步驟如下:
1)計算獲得模型立體的點表和面表數(shù)據(jù);
2)按VRML格式建立坐標(coordString)和坐標索引(coordindexString)字符串,1)中計算獲得的點表數(shù)據(jù)是雙精度型,而 VRML模型中數(shù)據(jù)精度不必太高,這里使用Java中Math類的 round()方法保留兩位小數(shù),然后將坐標值轉(zhuǎn)換為字符串向坐標字符串賦值。同時注意各坐標之間需要加入空格,每組坐標后要加入逗號分隔,以符合VRML格式要求。
3)建立Node類數(shù)組
創(chuàng)建 Node類型的實例數(shù)組使用 API中Browser類的createVrmlFromString()方法,該方法的參數(shù)是符合 VRML格式的字符串。這里將坐標、坐標索引字符串與Transform的其他相關(guān)字符串組合。此處的字符串應(yīng)按照 VRML編程時的格式,分行列出,這樣可以極大地減少程序在運行過程中的出錯率。
下面以棱柱截交線實驗為例,說明各種方法的應(yīng)用。截交線實驗進行中,截平面位置的獲得使用了VRML模型數(shù)據(jù)的獲取技術(shù),如圖2所示;而截切后截斷體的生成使用了 Java程序生成虛擬模型技術(shù),如圖3所示。
圖2 截平面位置的獲得
圖3 Java程序生成截斷體
本文針對工程圖學(xué)虛擬實驗系統(tǒng)在控制虛擬模型方面的需求,研究實現(xiàn)了 Java程序控制VRML,獲取VRML模型數(shù)據(jù),生成虛擬模型等幾個實現(xiàn)模型控制中的關(guān)鍵技術(shù)。解決了虛擬實驗系統(tǒng)開發(fā)中的幾個難點問題,也為其他VRML虛擬系統(tǒng)提供了開發(fā)基礎(chǔ)。
[1]邱龍輝, 葉 琳. 基于VRML-Java平臺的工程圖學(xué)網(wǎng)絡(luò)實驗系統(tǒng)研究與實現(xiàn)[J]. 工程圖學(xué)學(xué)報, 2005,26(5): 155-159.
[2]Rikk Carey, Gavin Bell, Chris Marrin. ISO/IEC 14772-1:1997, Virtual Reality Modeling Language [S].
[3]The Java Tutorial [EB/OL]. http://java.sun.com/docs/books/tutorial