李 蕊
(新華職工大學(xué),天津市 300040)
Java3D 虛擬室內(nèi)裝飾效果展示研究
李 蕊
(新華職工大學(xué),天津市 300040)
目前虛擬現(xiàn)實(shí)的建模方法主要采用OpenGL,VRM L等語言進(jìn)行編程,這存在著難以掌握、不易廣泛推廣等缺點(diǎn)。而Java3D作為一種新興的三維開發(fā)應(yīng)用程序接口,則提供了高效的開發(fā)性能。結(jié)合實(shí)際應(yīng)用中的實(shí)現(xiàn)方法和步驟,對使用Java3D構(gòu)建虛擬環(huán)境,豐富三維表現(xiàn)效果,實(shí)現(xiàn)環(huán)境與用戶的交互等進(jìn)行了研究,并給出在Java3D場景中實(shí)現(xiàn)虛擬場景漫游的方法。
Java3D;虛擬現(xiàn)實(shí);虛擬場景
1.Java3D場景結(jié)構(gòu)圖
Java 3D實(shí)際上是Java語言在三維圖形領(lǐng)域的擴(kuò)展,Java 3D的編程和Java一樣,是面向?qū)ο蟮木幊?。Java 3D的數(shù)據(jù)結(jié)構(gòu)采用的是Scene Graphs Structure(場景圖),這一靈活的樹狀結(jié)構(gòu)與顯示列表多少有些相似之處,但運(yùn)用起來更耐用。Java3D的場景圖是DAG(Directed-acyclic Graph),即具有方向性的不對稱圖形。
在一個Java 3D應(yīng)用程序看到的逼真三維場景從程序的角度看來,實(shí)際就是由Java 3D定義的一系列的對象,這些對象不是雜亂無序的,對象之間也不是毫無關(guān)系的。如果想讓三維圖像正常顯示,必須在這兩點(diǎn)上遵循Java 3D場景圖的規(guī)定。圖1就是Java 3D場景圖的樹結(jié)構(gòu),它由許多對象組成:
在圖中出現(xiàn)的這些對象都實(shí)現(xiàn)了Java 3D中有重要的意義的類,從邏輯上我們將它們分為三類:
根節(jié)點(diǎn)(Root):V irtual U niverse Object
節(jié)點(diǎn)(N ode):Local Object、B ranch Group N odes、Behavior N ode、Shape3D N ode...
葉子節(jié)點(diǎn)(Leaf):Appearance、Geometry...
場景圖中有許多線和線的交匯點(diǎn),交匯點(diǎn)稱為節(jié)點(diǎn)(N ode),不管什么節(jié)點(diǎn),它都是Java 3D類的實(shí)例(Instance of Class),節(jié)點(diǎn)之間的線表示實(shí)例之間的關(guān)系。
在場景圖中,最底層(根部)的節(jié)點(diǎn)是V irtual Universe,每一個場景圖只能有一個V irtual U ni2 verse。
在V irtual Universe上面,就是Locale節(jié)點(diǎn),每個程序可以有一個或多個Locale,但同時只能有一個Locale處于顯示狀態(tài),就好象一個三維世界非常大,有很多個景點(diǎn),但我們同時只能在一個景點(diǎn)進(jìn)行觀察。
每一個Locale上面擁有一個到多個B ranchGroup節(jié)點(diǎn)。所有三維形體的其位置信息(Trans2 form Group節(jié)點(diǎn))都建立在B ranchGroup節(jié)點(diǎn)之上。
Transform Group節(jié)點(diǎn)用來設(shè)定Shape3D在V irtual U niverse中的位置。
Spape3D節(jié)點(diǎn)是三維圖形節(jié)點(diǎn),這個節(jié)點(diǎn)的實(shí)體放映在最后的顯示畫面中,就是三維世界中的每個形體。包括正方體、球體以及任何形狀和外觀的三維形體。
位于場景圖最下層的是兩個葉子節(jié)點(diǎn):三維體的外觀(Appearance)和幾何信息(Geometry),這兩個節(jié)點(diǎn)定義了一個三維體的顯示效果。
V iew Platform位于圖1的另一個分枝上,與前面所有描述三維體性質(zhì)的概念不同,V iew Plat2 form和V iew都是用來定義觀察者的信息。
上面所列的概念很多,但是對于建立一個簡單的Java 3D程序,我們至少需要了解三個概念:虛擬宇宙(V irtual Universe)、場景(Locale)、坐標(biāo)系統(tǒng)。
圖1 Java3D場景圖
2.構(gòu)建虛擬室內(nèi)裝飾場景
創(chuàng)建一個Java3D程序大致有如下幾步:
(1)創(chuàng)建一個Canvas3D對象。
(2)創(chuàng)建一個V irtualU niverse對象。
(3)創(chuàng)建一個Locale對象,將Locale對象關(guān)聯(lián)到V irtualU niverse對象。
(4)創(chuàng)建V iew子圖。
·創(chuàng)建一個V iew Platform對象
·創(chuàng)建一個PhysicalBody對象
·創(chuàng)建一個PhysicalEnvironment對象
·創(chuàng)建一個V iew對象,將V iew Platform,PhysicalBody,PhysicalEnvironm ent和 Canvas3D對象關(guān)聯(lián)到V iew對象上
(5)構(gòu)造內(nèi)容子圖。
(6)編譯子圖。
(7)將子圖插入到Locale節(jié)點(diǎn)。
Java3D提供了一個Simp leUniverse類,該類實(shí)現(xiàn)了(2)-(4)步,可以大大的簡化代碼有利于使開發(fā)者將工作集中在創(chuàng)建場景內(nèi)容上。場景的內(nèi)容一般包括幾何形體、外觀、光照、聲音、行為等對象,它們按Java3D場景圖的規(guī)則組成內(nèi)容子圖。
當(dāng)然,在實(shí)際的編程中還要對背景、材質(zhì)、燈光、行為等進(jìn)行設(shè)置。所有內(nèi)容都放在一個B ranch2 Group對象里面。Transform Group對象用來定義可以移動、旋轉(zhuǎn)、放大縮小的局部坐標(biāo)系。而且可以將多個形體放置在同一個Transform Group里面。文中實(shí)現(xiàn)的虛擬場景的重要部分程序代碼為:
//建立環(huán)境光
Am bientLight aLgt=new Am bientLight(alColor);
aLgt.setInfluencingBounds(bounds);
B rachGroup Root.addChild(aLgt);
//建立基本模型
Transform 3D t=new Transform3D();
t.setTranslation(new Vector3f(0.0f,-5f,0.0f));
Transform Group tg2=new Transform Group(t);
tg2.addChild(new Box(10f,0.2f,10f,Box.GEN ERA TE_TEXTURE_COORDS|
Box.GEN ERA TE_NORM ALS,app1));//地
//顯示物體
transform group.addChild(tg2);
3.虛擬場景中交互功能的實(shí)現(xiàn)
上面我們構(gòu)造出的形體大都是靜止的,是一幅幅靜態(tài)的3D場景。要想使程序更吸引人、更有趣,這就需要引入交互。在Java 3D中,交互是指程序的輸出根據(jù)用戶行為而產(chǎn)生預(yù)期的變化。Java 3D中,交互是通過Behavior類來實(shí)現(xiàn)的。
Behavior的中文意思就是“行為”。而它在Java 3D中所描述的就是3D場景在程序運(yùn)行時的行為。Behavior類是一個抽象類,它定義了所有Behavior對象的公共同性。Java 3D中有一些預(yù)定義的Behavior類的子類,這些子類為實(shí)現(xiàn)交互編程提供了極大的方便。
Behavior類是基于這樣的機(jī)制運(yùn)行的:程序剛運(yùn)行的時候,向場景中安裝特定的Behavior對象,該對象只接收特定的激勵(比如:鍵盤按鍵、鼠標(biāo)移動、一個定時器消息等等),然后對這一激勵作出響應(yīng)(比如改變觀察者的視角及物體的位置、顏色等等)。
(1)鍵盤交互的方法。
在Java 3D附帶的工具類中提供了支持該項功能的類——KeyNavigatorBehavior。該類通過響應(yīng)用戶的鍵盤輸入來控制觀察者的移動。用戶可以用左右鍵控制旋轉(zhuǎn),用上下鍵控制前進(jìn)和后退,用翻頁鍵控制視角的俯仰變化。
(2)鼠標(biāo)交互的方法。
在Java 3D的工具類中還提供了通過對鼠標(biāo)的輸入進(jìn)行交互的類,這些類可以根據(jù)不同的鼠標(biāo)輸入來平移、旋轉(zhuǎn)和縮放物體。其中M ouseRotate是用來原地旋轉(zhuǎn)物體的,用戶可以使用鼠標(biāo)左鍵來實(shí)現(xiàn),M ouseTranslate是用來在與屏幕平行的平面中移動物體,用戶可以使用鼠標(biāo)右鍵來實(shí)現(xiàn),M ouseW heelZoom是用來在與屏幕垂直的平面中移動物體,用戶可以使用鼠標(biāo)滾軸來實(shí)現(xiàn)。
(3)利用鼠標(biāo)實(shí)現(xiàn)點(diǎn)取物體。
以上所實(shí)現(xiàn)的交互都是對整體場景進(jìn)行的,在Java 3D中還有一種類是用來實(shí)現(xiàn)單個物體交互的,這就是利用鼠標(biāo)實(shí)現(xiàn)點(diǎn)取物體的功能。這個類就在com.sun.j3d.utils.behaviors.picking包中,導(dǎo)入了這個包就可以實(shí)現(xiàn)鼠標(biāo)點(diǎn)取對象的功能了。PickRotateBehavior允許用戶點(diǎn)取并且旋轉(zhuǎn)可視對象,用戶使用鼠標(biāo)左鍵點(diǎn)取,Pick ZoomBehavior允許用戶點(diǎn)取并縮放可視對象,用戶使用鼠標(biāo)中鍵來點(diǎn)取并縮放,Pick TranslateBehavior允許用戶點(diǎn)取并且平移可視對象,用戶使用鼠標(biāo)右鍵點(diǎn)取。然后將鼠標(biāo)點(diǎn)取功能添加到相應(yīng)物體上。
本實(shí)例中運(yùn)用了鍵盤控制的方法實(shí)現(xiàn)了交互。具體代碼如下:
//建立鍵盤控制
KeyNavigatorBehavior keyNavBeh=new KeyNavigatorBehavior(transform group);
keyNavBeh.setSchedulingBounds(new BoundingSphere(new Point3d(1.0,1.0,1.0),100.0));
B rachGroup Root.addChild(keyNavBeh);
通過以上代碼,構(gòu)建了一個虛擬的室內(nèi)裝飾場景。場景及場景中的物體通過材質(zhì)貼圖的設(shè)置,表現(xiàn)力更強(qiáng),觀賞性更強(qiáng),同時可以用鼠標(biāo)隨意點(diǎn)取物體,實(shí)現(xiàn)放大、縮小、旋轉(zhuǎn)、移動的功能,場景也可以由鍵盤控制,實(shí)現(xiàn)漫游效果。如圖2、圖3所示:
圖2 場景中漫游效果
圖3 鼠標(biāo)點(diǎn)取物體效果
以上的虛擬場景中的物體,都是通過Java3D中的最基本的形體,如:柱體、球體、長方體等規(guī)則體實(shí)現(xiàn)的,因而在構(gòu)建復(fù)雜物體時有一定的缺陷,也就是物體的逼真度稍差。我們?yōu)榱私鉀Q這一問題,利用了Java3D的Loader功能來導(dǎo)入其他三維軟件中生成的復(fù)雜三維圖形文件,Java3D支持的三維圖形的格式有:.obj、.3ds、.vrm l、.WRL等,通過Loader功能可以使虛擬場景更加逼真。
下面就以導(dǎo)入.WRL文件為例,展示這一效果。我們在3ds max中制作了一個室內(nèi)效果,然后將它存為.WRL文件,然后我們進(jìn)行代碼的編寫,在實(shí)現(xiàn)導(dǎo)入效果圖的同時,實(shí)現(xiàn)用鼠標(biāo)控制,進(jìn)行漫游的功能。代碼基本與用Ja2 va3D創(chuàng)建場景相同,這里只介紹關(guān)鍵代碼部分。
B ranchGroup b1=new v rm lLoad(“/Ford_M ustang/7.WRL”);
objTrans.addChild(b1);//導(dǎo)入.WRL文件
在編寫以上代碼的同時還要編寫一個Load.java的文件,才能實(shí)現(xiàn).WRL文件的成功導(dǎo)入。最終效果如圖4所示:
通過這樣的方法,我們可以利用專業(yè)的建模軟件制作場景模型,然后再導(dǎo)入Java3D中進(jìn)行漫游、交互的設(shè)置,使場景效果更逼真,達(dá)到使參觀者身臨其境的目的。
[1]張杰.Java3D交互式三維圖形編程[M].北京:人民郵電出版社,1999.
[2]都志輝.Java3D編程實(shí)踐—網(wǎng)絡(luò)上的三維動畫[M].北京:清華大學(xué)出版社,2002.
[3]何江龍,方源敏,羅志清.Java3D技術(shù)與虛擬現(xiàn)實(shí)[J].地礦測繪,2006,22(02).
[4]黃瑩瑩,彭敏俊,許岷.基于虛擬現(xiàn)實(shí)的數(shù)字校園漫游系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].應(yīng)用科技,2005,32(05).
[5]高新瑞.Java、Java3D與計算機(jī)幾何設(shè)計[M].北京:電子工業(yè)出版社,2007.
A bs tra c t:The current modeling method is mainly p rogrammed by using Open GL and VRML languages,w hich is,however,hard to handle and not easy to p romote.By comparison,Java3D,as a new app lication p rogramm ing interface,p rovides efficient development p roperty.This paper introduces the author’s research on how to use Java3D to build virtual environment,to enrich 3D performance re2 sults and to realize the environment-user interaction.It also shows themeans of realizing roam ing in Ja2 va3D virtual scene.
Ke y w o rd s:Java3D;virtual reality;virtual scene
Research on Java 3D Virtual Interio r Deco rative Effect D isp lay
L I Rui
(Xinhua Staf f and Workers University,Tianjin 300040 China)
TP319
A
1673-582X(2011)02-0082-05
2010-10-15
李蕊(1981-),女,天津市人,天津市和平區(qū)新華職工大學(xué),講師,工學(xué)碩士,主要研究虛擬現(xiàn)實(shí)技術(shù)、多媒體技術(shù)應(yīng)用、數(shù)字視頻編輯等。