摘要:以Java3D的API接口為基礎(chǔ),導(dǎo)入VRML三維圖形,使用Java3D中不同的類方法對(duì)導(dǎo)入的三維圖形不同節(jié)點(diǎn)進(jìn)行變換。
關(guān)鍵詞:Java3D VRML 幾何變換 視圖 光照 交互
由于Java語(yǔ)言的平臺(tái)無(wú)關(guān)性、安全機(jī)制、高可靠性和內(nèi)嵌網(wǎng)絡(luò)支持已經(jīng)使之成為當(dāng)前編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序的首選工具之一。若用Java語(yǔ)言開(kāi)發(fā)三維網(wǎng)絡(luò)應(yīng)用程序,基于它自身的面向?qū)ο蟮奶卣?,相比于C++易學(xué)易用的特點(diǎn),那對(duì)于程序員來(lái)說(shuō)就獲得了一個(gè)可編寫(xiě)三維應(yīng)用程序的優(yōu)良工具。
▲▲ 一、 Java3D API
Java3D是SUN公司在研究OpenGL三維圖形庫(kù)及VRML虛擬現(xiàn)實(shí)建模語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)出來(lái)的一個(gè)API,包含了幾乎所有編寫(xiě)JAVA交互三維應(yīng)用程序所需要的最基本的類、接口[5]。是適用于Internet環(huán)境的跨平臺(tái)三維圖形開(kāi)發(fā)工具包。Java本身所具有的網(wǎng)絡(luò)功能與OpenGL、DirectX的圖形圖像處理功能相結(jié)合,使得Java語(yǔ)言的三維圖像可以通過(guò)瀏覽器在Internet上顯示。而且用Java3D生成的代碼具有可傳輸性,即從服務(wù)器端到客戶端傳輸?shù)氖巧扇S圖形的程序與數(shù)據(jù)(Applet),而不是圖形本身,這樣可以大大減少網(wǎng)絡(luò)傳輸數(shù)據(jù)量。
目前流行的幾種三維圖形格式中,VRML被看著為一個(gè)通用的三維圖形格式,其他主要的三維圖形格式均可以轉(zhuǎn)換成VRML格式。
▲▲ 二、導(dǎo)入VRML圖形
為了在Java3D中調(diào)用VRML圖形,需要一個(gè)vrml97.jar包,它是SUN公司提供的一個(gè)VRML的Loader。有了Loader這個(gè)jar包后,就可以方面的調(diào)用VRML圖形了。具體步驟為:
先定義一個(gè)VrmlLoader對(duì)象:
VrmlLoader vrmlLoader = new VrmlLoader();
根據(jù)URL地址,和三維圖形文件名,得到被調(diào)用圖形的場(chǎng)景圖
VrmlScenevrmlScene=(VrmlScene)vrmlLoader.load(dirString + “*.wrl”);
VrmlScene類常用的方法有
* Background[] getBackgroundNodes(); 返回一個(gè)場(chǎng)景中包含的所有背景節(jié)點(diǎn)的數(shù)組
* Behavior[] getBehaviorNodes();返回一個(gè)場(chǎng)景中包含的所有行為節(jié)點(diǎn)的數(shù)組
* Light[] getLightNodes();返回一個(gè)場(chǎng)景中包含的所定義的燈光節(jié)點(diǎn)的數(shù)組
* java.util.Hashtable getNamedObjects();返回一個(gè)Objects哈希表,這個(gè)哈希表包含所有已經(jīng)命名的Objects以及和這些Objects相關(guān)的場(chǎng)景
* BranchGroup getSceneGroup();返回場(chǎng)景圖中BranchGroup根節(jié)點(diǎn)。因?yàn)橹挥蠦ranchGroup節(jié)點(diǎn)才能直接附屬到一個(gè)Local類對(duì)象上,所以用這個(gè)方法返回的BranchGroup節(jié)點(diǎn)可以直接添加到j(luò)ava創(chuàng)建的場(chǎng)景節(jié)點(diǎn)下,也可以用detach()方法從Local類對(duì)象上剝離出來(lái)。
* Sound[] getSoundNodes(); 返回導(dǎo)入文件中所定義的聲音節(jié)點(diǎn)數(shù)組
* TransformGroup[] getViewGroups(); 返回導(dǎo)入文件中所定義的幾何變換節(jié)點(diǎn)數(shù)組
通常情況下,我們?cè)贘ava3d中調(diào)入VRML三維圖形,不僅僅是原有圖形的顯示,而是想根據(jù)需要,用Java語(yǔ)言對(duì)原
有圖形作出一定的修改,如做一些幾何變換,視圖改變,調(diào)整光照和紋理,以及加入一些鼠標(biāo)、鍵盤(pán)行為,以達(dá)到一定的交互目的。
▲▲ 三、行為和交互
互聯(lián)網(wǎng)中的三維圖形顯示有兩種常見(jiàn)的動(dòng)態(tài)變化:交互和動(dòng)畫(huà)。交互(Interaction)是根據(jù)用戶輸入信息改變圖形場(chǎng)景。動(dòng)畫(huà)(Animation)生成隨著時(shí)間變化的繪制序列,產(chǎn)生動(dòng)態(tài)效果。在Java3D中,可以用三種方式實(shí)現(xiàn)用戶與圖形場(chǎng)景間的交互。一是利用java的面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn),通過(guò)適用Behavior類以及其他相關(guān)類,向場(chǎng)景中引入了動(dòng)畫(huà)和交互邏輯。
MouseRotate mouserotate = new MouseRotate();
MouseZoom mousezoom = new MouseZoom();
MouseTranslate mousetranslate = new MouseTranslate();
二是利用java中的事件處理模型,有事件源生成各種事件,一個(gè)或多個(gè)監(jiān)聽(tīng)器監(jiān)聽(tīng)事件。具體應(yīng)用時(shí),先要在類定義時(shí),要實(shí)現(xiàn)一個(gè)或多個(gè)監(jiān)聽(tīng)器
public class Applet3D extends Applet implements ItemListener,WindowListener, ActionListener, CheckboxMenuListener{}
在方法定義中,添加各監(jiān)聽(tīng)器向組件登記以獲得事件發(fā)生信息
checkBox = new Checkbox(suitFile, true);
menu.add(checkBox);
checkBox.addItemListener(this);
在處理事件類中,實(shí)現(xiàn)監(jiān)聽(tīng)器接口的方法。
▲▲ 四、 結(jié)束語(yǔ)
Java3D API大大提高了3D圖形的開(kāi)發(fā)能力和顯示效果,擴(kuò)大了3D圖形在互聯(lián)網(wǎng)中的應(yīng)用,它的三維圖形導(dǎo)入功能使得網(wǎng)絡(luò)程序開(kāi)發(fā)人員不再被困于復(fù)雜的三維虛擬圖形的開(kāi)發(fā)上,而把重點(diǎn)放在整個(gè)場(chǎng)景的布局,組合上和動(dòng)態(tài)交互上,這樣就可以大大降低三維網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)難度,使得三維網(wǎng)絡(luò)技術(shù)可以得到更廣泛的實(shí)際應(yīng)用。
參考文獻(xiàn):
[1]李志均,傅秀芬 Java3D API 與Java3D編程技術(shù)[J]. 現(xiàn)代計(jì)算機(jī)1999(4):28-33
[2]孫莉,廖文和,劉長(zhǎng)毅,周煒 基于VRML-Java3D的交互式裝配可視化環(huán)境構(gòu)建[J] 電氣技術(shù)與自動(dòng)化. 2006.35 (2 ):106 ~109
[3]賽博科技工作室.VRML與Java編程技術(shù)[M]. 北京:人民郵電出版社, 2002 -1.
(責(zé)任編輯:張曉輝)