Java3D理解初級(jí)教程

          Java3D理解初級(jí)教程

          引 言

            Java3DAPI是用來(lái)開(kāi)發(fā)三維圖形和開(kāi)發(fā)基于Web的3D應(yīng)用程序(applet)的編程接口.目前用于開(kāi)發(fā)三維圖形軟件的3DAPI(OpenGL、Direct3D)都是基于攝像機(jī)模型的思想,即通過(guò)調(diào)整攝像機(jī)的參數(shù)來(lái)控制場(chǎng)景中的顯示對(duì)象,而Java3D則提出了一種新的基于視平臺(tái)的視模型和輸入設(shè)備模型的技術(shù)實(shí)現(xiàn)方案,即通過(guò)改變視平臺(tái)的位置、方向來(lái)瀏覽整個(gè)虛擬場(chǎng)景.它不僅提供了建造和操作三維幾何物體的高層構(gòu)造函數(shù),而且利用這些構(gòu)造函數(shù)還可以建造復(fù)雜程度各異的虛擬場(chǎng)景,這些虛擬場(chǎng)景大到宇宙天體,小到微觀粒子.

            Java3D是JavaMediaAPIs中的一部分,可廣泛地應(yīng)用于各種平臺(tái),而且用Java3DAPI開(kāi)發(fā)的應(yīng)用程序和基于Web的3D小應(yīng)用程序(applet),還可以訪問(wèn)整個(gè)Java類,且可以與Internet很好地集成,即如果在瀏覽器中安裝了Java3D的瀏覽插件,在網(wǎng)上也可瀏覽Java3D所創(chuàng)建的虛擬場(chǎng)景.Java3DAPI還汲取了已有圖形APIs的優(yōu)點(diǎn),即Java3D的底層圖形構(gòu)造函數(shù)不僅綜合了底層APIs(Direcrt3D、OpenGL)最好的繪制思想,而且它的高層圖形繪制還綜合了基于場(chǎng)景圖的思想,同時(shí),它又引入了一些通用的圖形環(huán)境所未考慮的新概念(如3D立體聲),這樣將有助于提高用戶在虛擬場(chǎng)景的沉浸感.本文將著重介紹Java3D針對(duì)VR應(yīng)用所提出的基于視模型和輸入設(shè)備模型的新思想,在此基礎(chǔ)上又討論了如何利用Java3D來(lái)開(kāi)發(fā)VR應(yīng)用程序及其實(shí)現(xiàn)方法,并設(shè)計(jì)實(shí)現(xiàn)了一個(gè)應(yīng)用實(shí)例.


            1.適于VR應(yīng)用開(kāi)發(fā)的Java3DAPI眾所周知,開(kāi)發(fā)VR應(yīng)用程序是一件很繁瑣的工作,其開(kāi)發(fā)人員必須編寫(xiě)應(yīng)用程序可能遇到的各種輸入和顯示設(shè)備的接口程序,或者依賴專為VR應(yīng)用開(kāi)發(fā)而設(shè)計(jì)的應(yīng)用程序編程接口(API),且典型的VR應(yīng)用必須跟蹤用戶的頭部位置和方向,以生成與頭部位置方向相一致的虛擬場(chǎng)景圖.

            另外,還需要先跟蹤身體的其它部位(手、臂或腿部),然后通過(guò)身體各部位在虛擬場(chǎng)景中的虛擬視點(diǎn)與場(chǎng)景中的對(duì)象進(jìn)行交互,而應(yīng)用程序也必須具有能夠利用跟蹤輸入設(shè)備在視點(diǎn)內(nèi)放置物體,并標(biāo)明其在生成的三維圖象中的位置和方向的功能.同時(shí),面向VR的應(yīng)用程序開(kāi)發(fā)接口(API)必須能支持3D圖形生成、處理跟蹤器的輸入,并能將跟蹤信息反饋到圖形繪制中.

            Java3DAPI可自動(dòng)將頭部跟蹤器的輸入集成到圖形生成中,并具有通過(guò)訪問(wèn)其它跟蹤器信息來(lái)控制其它特征的功能,但它是通過(guò)一種新的視模型(viewmodel)技術(shù)來(lái)實(shí)現(xiàn)的.該視模型是將用戶真實(shí)的物質(zhì)環(huán)境與計(jì)算機(jī)生成的虛擬環(huán)境相互獨(dú)立,并建立它們之間的通信橋梁.該API也明確定義了用來(lái)探測(cè)Java3D物體六自由度(6DOF)傳感器的返回值,并將其應(yīng)用于顯示場(chǎng)景圖中.總之,這種新的視模型和輸入設(shè)備模型可以很方便地將交互式的3D圖形應(yīng)用程序轉(zhuǎn)化為VR應(yīng)用程序.

          Java3D視模型

            2.1 新的視模型概念(viewmodel)基于攝像機(jī)的視模型是模仿虛擬環(huán)境中的攝像機(jī),而不是虛擬環(huán)境中人的“替身”,而且它是通過(guò)控制攝像機(jī)與視點(diǎn)的相關(guān)參數(shù)來(lái)控制所顯示的場(chǎng)景,但這種方法,在用戶物質(zhì)環(huán)境確定某些視參數(shù)的系統(tǒng)中是不合理的,例如在頭盔顯示器(HMD)系統(tǒng)中,HMD的光學(xué)性能就直接確定了應(yīng)用程序所顯示的視域.由于不同的HMD有不同的光學(xué)特性,因此如果允許終端用戶隨意改變光學(xué)參數(shù)顯然是不合理的.這里視參數(shù)的值將隨終端用戶物質(zhì)環(huán)境的不同而不同,而影響視參數(shù)的主要因素有顯示器大小、顯示器的位置(戴在頭上,還是放在桌子上)、三維空間中用戶的頭部位置、頭盔顯示器的實(shí)際顯示視域、每英寸的顯示象素等.由于Java3D的視模型直接提供了頭部跟蹤的功能,因而使用戶產(chǎn)生了真實(shí)存在于虛擬環(huán)境中的錯(cuò)覺(jué).

            Java3D不僅提出了新的基于視平臺(tái)的視模型概念,同時(shí)將其推廣到包括顯示設(shè)備和6DOF外圍輸入設(shè)備(如頭部跟蹤器等)的接口支持中,而且新的視模型繼承了Java的“writeonce,vieweverywhere”本質(zhì).這意味著由Java3D視模型開(kāi)發(fā)的應(yīng)用程序或applet可廣泛地應(yīng)用于各種顯示環(huán)境.這種顯示環(huán)境可以是標(biāo)準(zhǔn)的計(jì)算機(jī)顯示屏、多元顯示空間,也可以是頭盔顯示器.Java3D視模型是通過(guò)將虛擬環(huán)境和物質(zhì)環(huán)境完全獨(dú)立的方式來(lái)實(shí)現(xiàn)上述功能的,且該視模型可將虛擬環(huán)境中視平臺(tái)的位置、方向和大小,與Java3D繪制的與視平臺(tái)位置、方向相一致的虛擬場(chǎng)景相區(qū)分.一般應(yīng)用程序控制視平臺(tái)的位置和方向,而繪制著色系統(tǒng)則依據(jù)終端用戶的物質(zhì)環(huán)境以及用戶在物質(zhì)環(huán)境中的位置和方向來(lái)確定顯示場(chǎng)景.

          2.2 視模型的組成

            Java3D視模型由虛擬環(huán)境和物質(zhì)環(huán)境兩部分組成,其中,虛擬環(huán)境由ViewPlatform對(duì)象來(lái)表示,它是虛擬對(duì)象存在的空間;而物質(zhì)環(huán)境則由View對(duì)象以及和它相關(guān)的對(duì)象來(lái)表示.這里,View對(duì)象和它的相關(guān)對(duì)象就描述了用戶所處的顯示和操縱輸入設(shè)備環(huán)境.雖然視模型將虛擬環(huán)境和物質(zhì)環(huán)境相互獨(dú)立,但可通過(guò)一一對(duì)應(yīng)關(guān)系來(lái)建立兩種世界之間相互通信的橋梁,這樣將使得終端用戶的行為會(huì)影響虛擬環(huán)境中的對(duì)象,同時(shí)虛擬環(huán)境中的對(duì)象行為也會(huì)影響終端用戶的視點(diǎn).

            Java3D可通過(guò)幾個(gè)對(duì)象來(lái)定義視模型參數(shù).這些對(duì)象包括View對(duì)象及其相關(guān)對(duì)象、PhysicalBody對(duì)象、Canvas3D對(duì)象、PhysicalEnvironment對(duì)象、Screen3D對(duì)象.視模型相關(guān)的對(duì)象(如圖1所示)其作用如下:ViewPlatform用來(lái)標(biāo)志場(chǎng)景圖中視點(diǎn)位置的節(jié)點(diǎn).其父節(jié)點(diǎn)則指明了視平臺(tái)在虛擬環(huán)境中的位置、方向和大小.View用于指定需要處理場(chǎng)景圖的信息.Canvas3D定義了Java3D繪制圖象的窗口,它提供了Canvas3D在Screen3D對(duì)象中的大小、形狀和位置信息.Screen3D用于描述顯示屏幕的物理屬性.PhysicalBody用于封裝那些與物質(zhì)體相關(guān)的參視模型的組成及其相互關(guān)系數(shù)(如左、右眼的位置等).PhysicalEnvironment用于封裝那些與物質(zhì)體環(huán)境相關(guān)的參數(shù)(如,用于頭狀物體或頭盔式跟蹤器的校驗(yàn)信息).

            2.3 虛擬環(huán)境中的視平臺(tái)(ViewPlatform)鑒于視平臺(tái)定義了一坐標(biāo)系統(tǒng),于是虛擬環(huán)境中的原始點(diǎn)和參考點(diǎn)就有了一參考坐標(biāo)系.這里視平臺(tái)代表與視對(duì)象相關(guān)的一個(gè)點(diǎn),并充當(dāng)確定繪制圖象的基礎(chǔ).圖2顯示了包括視平臺(tái)節(jié)點(diǎn)場(chǎng)景圖的一部分.由圖2可見(jiàn),視平臺(tái)的父節(jié)點(diǎn)確定了視平臺(tái)在虛擬環(huán)境中的位置和方向.若通過(guò)修改與TransformGroup節(jié)點(diǎn)相關(guān)的Transform3D對(duì)象,就可以在虛擬場(chǎng)景中隨意移動(dòng)視平臺(tái).雖然虛擬環(huán)境中可以有許多不同的視平臺(tái),但特定的視對(duì)象只能與一個(gè)視平臺(tái)相關(guān)聯(lián),于是在Canvas3D對(duì)象中所繪制的場(chǎng)景均來(lái)自于一個(gè)視平臺(tái)的視點(diǎn).這樣應(yīng)用程序就可通過(guò)修改視平臺(tái)的TransformGroup節(jié)點(diǎn),在虛擬環(huán)境中漫游.圖2 包括視平臺(tái)的局部場(chǎng)景圖3 Java3D的輸入設(shè)備模型Java3D除了支持通用的鍵盤(pán)、鼠標(biāo)輸入外,還能給各種不間斷的輸入設(shè)備,如6DOF跟蹤設(shè)備和操縱桿提供支持.由于不同的跟蹤輸入設(shè)備其工作原理不同,因而計(jì)算機(jī)與其交互的方式也不同.為了給不同的6DOF輸入設(shè)備提供支持,Java3D還提供了一個(gè)輸入設(shè)備接口,而且該輸入設(shè)備接口還定義了一個(gè)抽象的輸入設(shè)備,雖然用其可以實(shí)現(xiàn)對(duì)一特定設(shè)備的驅(qū)動(dòng),但輸入設(shè)備接口的實(shí)現(xiàn)必須實(shí)現(xiàn)接口所定義的所有方法(如設(shè)備開(kāi)、關(guān)、讀取操作、狀態(tài)設(shè)置及查詢等).Java3D的輸入設(shè)備列表就用這些方法同特定的設(shè)備進(jìn)行交互.

            一般Java3D環(huán)境中,可能包括許多輸入設(shè)備,而且這些輸入設(shè)備不一定是實(shí)際的物理設(shè)備,也可能是虛擬設(shè)備,例如通過(guò)軟件的方法將鼠標(biāo)的運(yùn)動(dòng)參數(shù)轉(zhuǎn)化為6DOF虛擬跟蹤球的參數(shù),來(lái)模擬虛擬跟蹤球的輸入.由于所有的輸入設(shè)備都由許多傳感器對(duì)象組成,因此每一種輸入設(shè)備都與一定數(shù)量的傳感器對(duì)象相關(guān),且每一種傳感器都與其傳感器設(shè)備6DOF數(shù)據(jù)的一個(gè)數(shù)據(jù)源相關(guān).當(dāng)輸入設(shè)備驅(qū)動(dòng)的數(shù)據(jù)改變時(shí),傳感器對(duì)象的數(shù)據(jù)也會(huì)相應(yīng)改變,而且傳感器對(duì)象由讀取傳感器對(duì)象組成.由于緩沖區(qū)中記錄了各傳感器最近N個(gè)讀取傳感器對(duì)象的值,因此可以對(duì)傳感器數(shù)據(jù)進(jìn)行平均,以及對(duì)傳感器輸入值的趨勢(shì)進(jìn)行預(yù)測(cè)等處理,但應(yīng)用程序的開(kāi)發(fā)并不直接使用輸入設(shè)備.Java3D是通過(guò)一個(gè)傳感器數(shù)組將輸入設(shè)備抽象化,傳感器對(duì)象數(shù)組是物質(zhì)環(huán)境對(duì)象的一個(gè)子類,該數(shù)組是由與輸入設(shè)備相關(guān)的對(duì)象指針組成.Java程序可以直接從傳感器數(shù)組中獲取傳感器的值,并將其用到場(chǎng)景圖中,或按任意方式對(duì)其進(jìn)行處理。

            2.4 用Java3D開(kāi)發(fā)VR應(yīng)用程序利用Java3D開(kāi)發(fā)的VR應(yīng)用程序或者applets程序,可建造一個(gè)虛擬場(chǎng)景,并能將一個(gè)或多個(gè)場(chǎng)景圖插入到虛擬場(chǎng)景中,虛擬場(chǎng)景由超結(jié)構(gòu)對(duì)象集組成,對(duì)象集則包括一個(gè)世界對(duì)象(Universeobject)、一個(gè)或多個(gè)場(chǎng)所對(duì)象(Localeobjects)和按樹(shù)狀結(jié)構(gòu)排列的由節(jié)點(diǎn)物體組成的一個(gè)或多個(gè)場(chǎng)景圖(Scenegraphs).該場(chǎng)景圖又稱為分枝圖(Branchgraph),它包括繪制對(duì)象節(jié)點(diǎn)、光照節(jié)點(diǎn)、行為節(jié)點(diǎn)和聲音節(jié)點(diǎn)等,其中,包含內(nèi)容節(jié)點(diǎn)的分枝圖稱為內(nèi)容分枝,包含視平臺(tái)對(duì)象的分枝圖稱為視分枝,視平臺(tái)對(duì)象用來(lái)確定用戶的位置和方向.圖3表示了具有多分枝圖的Java3D場(chǎng)景.圖3 應(yīng)用程序場(chǎng)景圖由于這種分枝圖只描述了場(chǎng)景所要繪制的對(duì)象,并不確定對(duì)象的繪制次序,因此圖中節(jié)點(diǎn)的次序和位置與對(duì)象的繪制次序無(wú)關(guān),而圖中的父節(jié)點(diǎn)和子節(jié)點(diǎn)的直線路徑就唯一確定了子節(jié)點(diǎn)的圖形范圍.由于繪制次序的不確定性,因而使得Java3D能橫越場(chǎng)景圖的任何次序,且它能從左到右,從頂部到底部穿過(guò)場(chǎng)景圖;或者從右到左,甚至并行遍歷整個(gè)場(chǎng)景圖.Java3D的分支圖為樹(shù)狀結(jié)構(gòu),且圖中的每一個(gè)節(jié)點(diǎn)只有一個(gè)父節(jié)點(diǎn).這樣通過(guò)輔助的場(chǎng)景圖機(jī)制就可以實(shí)現(xiàn)通用場(chǎng)景圖的共享,而且具有連接屬性的葉節(jié)點(diǎn)可以連接到共享子圖.分枝圖中的節(jié)點(diǎn)分為群節(jié)點(diǎn)(groupnode)和葉節(jié)點(diǎn)(leafnode)兩類,其中,群節(jié)點(diǎn)按照粘貼的原理來(lái)組織場(chǎng)景圖單元。

             群節(jié)點(diǎn)的層次結(jié)構(gòu)圖一般群節(jié)點(diǎn)包括:BranchGroup、TransformGroup、Switch、OrderGroup、DecalGroup和ShareGroup節(jié)點(diǎn),其中,BranchGroup是分枝圖的根節(jié)點(diǎn);而TransformGroup用來(lái)指明所有子節(jié)點(diǎn)的位置和方向;Switch則用于實(shí)現(xiàn)一個(gè)或多個(gè)子圖的轉(zhuǎn)換;OrderGroup用于使它的子節(jié)點(diǎn)按照特定的次序繪制;DecalGroup是OrderGroup的一個(gè)子集;ShareGroup跟BranchGroup一樣,是一個(gè)場(chǎng)景圖的根節(jié)點(diǎn).雖然共享圖作為Java3D場(chǎng)景圖的一部分從不直接出現(xiàn),但是連接節(jié)點(diǎn)可以引用.另外群節(jié)點(diǎn)還可以包含各種子節(jié)點(diǎn)以及所包含對(duì)象的群節(jié)點(diǎn)或葉節(jié)點(diǎn).這些子節(jié)點(diǎn)用一個(gè)關(guān)聯(lián)索引屬性來(lái)允許對(duì)特定的子節(jié)點(diǎn)進(jìn)行操作.如果沒(méi)有指明特定的順序群節(jié)點(diǎn),Java3D還可以按照任意指定的順序來(lái)繪制群節(jié)點(diǎn)的子節(jié)點(diǎn).雖然葉節(jié)點(diǎn)是場(chǎng)景圖的抽象類,它沒(méi)有子節(jié)點(diǎn),但葉節(jié)點(diǎn)包括了Java3D的各種信息.葉節(jié)點(diǎn)由Shape3D、ViewPlatform、Sound、Light以及用戶定義的行為節(jié)點(diǎn)等組成,Shape3D和ViewPlatform節(jié)點(diǎn)在Java3D的視模型和輸入模型中扮演著重要的角色,因?yàn)樗枋隽藞D形系統(tǒng)的兩個(gè)重要方面,其中,Shape3D描述了場(chǎng)景中對(duì)象的幾何形狀,而ViewPlatform則標(biāo)定了用戶或其視點(diǎn)在虛擬環(huán)境中的方向或位置.

            另外,應(yīng)用程序還可像操縱分枝圖中的任意對(duì)象一樣,來(lái)操縱ViewPlatform,而且應(yīng)用程序還可平移、旋轉(zhuǎn)和縮放ViewPlatform,即通過(guò)改變ViewPlatform的位置和方向,ViewPlatform將隨同用戶的視點(diǎn)一起移動(dòng),來(lái)瀏覽整個(gè)虛擬環(huán)境.雖然ViewPlatform是按照事先規(guī)定的路線瀏覽場(chǎng)景,但不會(huì)限制用戶視點(diǎn)的移動(dòng)和向不同方向?yàn)g覽場(chǎng)景.圖5顯示了葉節(jié)點(diǎn)的層次結(jié)構(gòu)圖.       應(yīng)用實(shí)例本文利用Java3D建造了包含一立方體的簡(jiǎn)單虛擬場(chǎng)景,并利用Java3D提供的輸入設(shè)備模型接口,設(shè)計(jì)了一虛擬輸入設(shè)備控制臺(tái),來(lái)對(duì)虛擬場(chǎng)景中的立方體進(jìn)行考察和操作.該虛擬控制臺(tái)可通過(guò)Java3D的傳感器對(duì)象,來(lái)模擬各種VR輸入跟蹤設(shè)備,其中在Java平臺(tái)下瀏覽的虛擬場(chǎng)景及虛擬輸入設(shè)備控制臺(tái)如圖6、圖7所示.圖6 虛擬場(chǎng)景圖7 虛擬輸入設(shè)備控制臺(tái)6 結(jié)語(yǔ)與展望Java3DAPI的出現(xiàn)為Java在VR和Internet的應(yīng)用和開(kāi)發(fā)注入了新的活力,因?yàn)镴ava3D所提出的全新的基于視平臺(tái)的視模型和輸入設(shè)備模型技術(shù),不僅可實(shí)現(xiàn)對(duì)頭盔顯示和多輸入6DOF跟蹤設(shè)備的支持,而且可針對(duì)不同的應(yīng)用方便靈活地開(kāi)發(fā)自己的VR應(yīng)用系統(tǒng),由于Java3D是基于Internet的軟件開(kāi)發(fā)平臺(tái),同時(shí)它能將圖形功能與Internet很好地集成在一起,因此,利用它來(lái)開(kāi)發(fā)基于網(wǎng)絡(luò)的VR系統(tǒng)將會(huì)有巨大的潛力.可以預(yù)見(jiàn),不久的將來(lái),各種面向網(wǎng)絡(luò)的VR應(yīng)用(如電子商場(chǎng)、遠(yuǎn)程教學(xué)和遠(yuǎn)程醫(yī)療等)將會(huì)把人們帶入復(fù)雜逼真的虛擬場(chǎng)景中.

          posted on 2006-07-10 21:25 XiaoLi 閱讀(724) 評(píng)論(0)  編輯  收藏 所屬分類: Java

          公告


          文章發(fā)布許可

          本站作品均采用知識(shí)共享署名-非
          商業(yè)性使用-禁止演繹 2.5 中國(guó)大
          陸許可協(xié)議
          進(jìn)行許可。

          Books I've Translated

          《精通Nginx(第二版)》

          精通Nginx(第二版)
          《云計(jì)算:原理與范式》

           云計(jì)算:原理與范式

          《SQL技術(shù)手冊(cè)(第三版)》
          SQL技術(shù)手冊(cè)(第三版)
          《MySQL核心技術(shù)手冊(cè)(第二版)》
          MySQL核心技術(shù)手冊(cè)(第2版)
          《RESTful Web Services中文版》
          RESTful Web Services中文版

          導(dǎo)航

          留言簿(2)

          隨筆分類

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 安宁市| 离岛区| 凤山市| 九寨沟县| 县级市| 微山县| 和静县| 云霄县| 普格县| 海晏县| 三门县| 吉安县| 兴文县| 青海省| 龙山县| 临夏市| 收藏| 广灵县| 额敏县| 兴隆县| 兴安盟| 合阳县| 孝昌县| 蒙城县| 出国| 武胜县| 柘荣县| 青龙| 荥阳市| 沧州市| 乐安县| 吐鲁番市| 通城县| 车险| 郓城县| 浦北县| 右玉县| 砀山县| 石首市| 郁南县| 恭城|