基于Java3D的網(wǎng)絡(luò)三維技術(shù)的設(shè)計與實現(xiàn)
?文章來源地址http://www.zghlxwxcb.cn/news/detail-758869.html
摘要
????????互聯(lián)網(wǎng)的出現(xiàn)及飛速發(fā)展使IT業(yè)的各個領(lǐng)域發(fā)生了深刻的變化,它必然引發(fā)一些新技術(shù)的出現(xiàn)。3D圖形技術(shù)并不是一個新話題,在圖形工作站以至于PC機上早已日臻成熟,并已應(yīng)用到各個領(lǐng)域。然而互聯(lián)網(wǎng)的出現(xiàn),卻使3D圖形技術(shù)發(fā)生了和正在發(fā)生著微妙而深刻的變化。Web3D協(xié)會(前身是VRML協(xié)會)最先使用Web3D術(shù)語,這一術(shù)語的出現(xiàn)反映了這種變化的全貌,沒有人能嚴(yán)格定義Web3D,在這里我們把Web3D理解為:互聯(lián)網(wǎng)上的3D圖形技術(shù),互聯(lián)網(wǎng)代表了未來的新技術(shù),很明顯,3D圖形和動畫將在互聯(lián)網(wǎng)上占有重要的地位。
????????Java3D API是Sun定義的用于實現(xiàn)3D顯示的接口。使用Java 的重要理由之一是它的平臺無關(guān)性。Java3D提供了基于Java的上層接口。Java3D把OpenGL和DirectX這些底層技術(shù)包裝在Java接口中。這種全新的設(shè)計使3D技術(shù)變得不再繁瑣并且可以加入到J2SE、J2EE的整套架構(gòu),這些特性保證了Java3D技術(shù)強大的擴展性
????????本文以Java3D為開發(fā)平臺,利用Java語言強大的網(wǎng)絡(luò)功能,實現(xiàn)了在網(wǎng)頁上對3D動畫進行顯示和操作。
關(guān)鍵字:Java3D、Web3D、三維
Abstract
????????The Internet appearance and the rapid development caused each domain to IT industry?have the deep transformation, it initiated some new?technical inevitably the appearance. The 3D graph technology is not a?new topic, in the graph workstation down to on PC machine already?more or day matured, and has applied to each domain. However the Internet appearance, caused the 3D graph technology to occur actually and is?occurring is being subtle but the deep transformation. The Web3D?association (predecessor is the VRML association) uses the Web3D?terminology first, this terminology appearance had reflected this kind?of change complete picture, nobody can strictly define Web3D, in here?we do the Web3D understanding is: On the Internet 3D graph technology,?the Internet has represented the future new technology, is very?obvious, the 3D graph and the animation will hold the important status?on the Internet.
Java3D API is the Sun definition uses in realizing the 3D?demonstration connection. Uses one of Java important reasons is its?platform irrelevant. Java3D has provided based on the Java upper?formation connection. Java3D OpenGL and DirectX these first floor?technology packing in Java connection. This kind of brand-new design?causes the 3D technology to change no longer tediously and may join to?J2SE, the J2EE entire wrap overhead construction, these?characteristics have guaranteed the Java3D technology formidable?extension.
This article develops the platform take Java3D, uses the Java?language formidable network function nf, realized has carried on the?demonstration and the operation on the homepage to the 3D animation.
Key word: Java3D, Web3D,3D
目錄
基于Java3D的網(wǎng)絡(luò)三維技術(shù)的設(shè)計與實現(xiàn)
摘要
Abstract
第一章 ?緒論
§1.1?引言
§1.2 互聯(lián)網(wǎng)3D圖形技術(shù)的應(yīng)用
§1.3 JAVA3D在Web中的成功
第二章 ?Java3D技術(shù)的簡介
§2.1?Java3D概述
2.1.1 ?Java3D簡介
2.1.2 ?Java3D與其他三維技術(shù)的比較
§2.2?Java3D的場景圖結(jié)構(gòu)
2.2.1 ?虛擬宇宙(Virtual Universe)
2.2.2 ?Java3D的坐標(biāo)系統(tǒng)
2.2.3 ?場景(Locale)
§2.3?實現(xiàn)三維世界
2.3.1 ?Java3D的觀察模式
2.3.2??Java3D中用來定義觀察的對象
2.3.3 ?在三維世界中建立、移動觀察點
2.3.4 ?Java3D的網(wǎng)絡(luò)基礎(chǔ)
第三章 實現(xiàn)JAVA3D結(jié)構(gòu)體系的方法
§3.1 總體設(shè)計
§3.2 基本形體的生成
3.2.1平板的生成
3.2.2 立方體的生成
3.2.3 圓錐的生成
3.2.4?球體的生成
3.2.5.圓柱體的生成
§3.3 點、線、面的生成
3.3.1點的生成
3.3.2直線的生成
3.3.3面的生成
§3.4 外部復(fù)雜形體的調(diào)用
§3.5背景變換的實現(xiàn)方法
3.5.1 燈光
3.5.2 紋理貼圖
3.5.3 霧
§3.6 動畫的生成
第四章JAVA3D場景的實現(xiàn)
§4.1Java3D的實現(xiàn)流程
§4.2 JAVA3D的建模
4.2.1 生成場景:(SimpleUniverse在哪生成的并沒說清楚)
4.2.2 Temple的圓柱體的構(gòu)建
4.2.3 Tower的構(gòu)建
§4.3 動畫的實現(xiàn)
4.3.1 調(diào)用galleon.obj文件
4.3.2 物體轉(zhuǎn)動
4.3.3場景的移動
§4.4 背景變換
4.4.1 創(chuàng)建燈光
4.4.2 創(chuàng)建背景圖片
4.4.3 指數(shù)霧
4.4.4 背景音樂
§4.5 在網(wǎng)頁上顯示3D圖形
第五章 實踐和展望
§5.1 ?Web3D技術(shù)發(fā)展前景????????
§5.2 論文總結(jié)
參考文獻
第一章 ?緒論
§1.1?引言
????????互聯(lián)網(wǎng)的出現(xiàn)及飛速發(fā)展使IT業(yè)的各個領(lǐng)域發(fā)生了深刻的變化,它必然引發(fā)一些新技術(shù)的出現(xiàn)。3D圖形技術(shù)并不是一個新話題,在圖形工作站以至于PC機上早已日臻成熟,并已應(yīng)用到各個領(lǐng)域。然而互聯(lián)網(wǎng)的出現(xiàn),卻使3D圖形技術(shù)發(fā)生了和正在發(fā)生著微妙而深刻的變化。Web3D協(xié)會(前身是VRML協(xié)會)最先使用Web3D術(shù)語,這一術(shù)語的出現(xiàn)反映了這種變化的全貌,沒有人能嚴(yán)格定義Web3D,在這里我們把Web3D理解為:互聯(lián)網(wǎng)上的3D圖形技術(shù),互聯(lián)網(wǎng)代表了未來的新技術(shù),很明顯,3D圖形和動畫將在互聯(lián)網(wǎng)上占有重要的地位。
§1.2 互聯(lián)網(wǎng)3D圖形技術(shù)的應(yīng)用
????????當(dāng)前,互聯(lián)網(wǎng)上的圖形仍以2D圖像為主流。但是,3D圖形必將在互聯(lián)網(wǎng)上占有重要地位?;ヂ?lián)網(wǎng)上的交互式3D圖形技術(shù)--- Web3D正在取得新的進展,正在脫離本地主機的3D圖形,而形成自己獨立的框架。互聯(lián)網(wǎng)的需求是它發(fā)展的動力。互聯(lián)網(wǎng)的內(nèi)容提供商和商業(yè)網(wǎng)站不斷使用新的工具與技術(shù)使網(wǎng)站更具吸引力,Web3D圖形是最新的和最具魅力的技術(shù)。Web3D圖形將在互聯(lián)網(wǎng)上有廣泛應(yīng)用,從目前的趨勢來看主要有:
1.電子商務(wù):
用3D圖形展示商品,更能吸引客戶。虛擬商場是人們熱中的話題??蛻艨梢栽谔摂M商場中漫游,挑選商品。許多Web3D圖形技術(shù)的軟件廠商是瞄準(zhǔn)了電子商務(wù)的,如cult3D和viewpoint,其圖形技術(shù)主要是用于商品的3D展示,您甚至于可以在網(wǎng)上操作或使用要購買的商品。然而,Web3D圖形的商業(yè)利益究竟有多大,網(wǎng)上的商品銷售商只有在能增加銷售額的情況下,才肯出資制作Web3D圖形。
2. 聯(lián)機娛樂休閑與游戲:
多用戶聯(lián)機3D游戲?qū)嵘匣ヂ?lián)網(wǎng),現(xiàn)在您已經(jīng)可以在網(wǎng)上經(jīng)歷簡單的賽車或空中射擊游戲,下載文件不超過2M。當(dāng)然,如果您想運行大的聯(lián)機游戲仍然需要CD-ROM的支持。娛樂休閑網(wǎng)站對Web3D圖形有更多的需求,如:城市景觀或風(fēng)景點的虛擬旅游,虛擬博物館,展覽會,藝術(shù)畫廊等等。
3. 醫(yī)學(xué):
醫(yī)療培訓(xùn),醫(yī)療商業(yè)的B2B和B2,許多醫(yī)學(xué)圖像的處理將使用Web3D圖形技術(shù)。
4. 地理信息系統(tǒng)的數(shù)據(jù)可視化:
將GIS與Web3D結(jié)合起來,可以在互聯(lián)網(wǎng)上建立許多應(yīng)用系統(tǒng),如地圖,導(dǎo)游,城市建設(shè),交通運輸?shù)鹊取?/p>
5. 多用戶虛擬社區(qū)(virtual-community):
????????虛擬社區(qū)是建立一個大型的虛擬場景,每個虛擬場景的訪問者都可以指定一個"替身", "替身"在場景中可以漫游。當(dāng)幾個遠(yuǎn)程訪問者同時訪問虛擬社區(qū)時,它們可以用語音或文字通訊。虛擬社區(qū)可以是一個會場,教室,俱樂部,展覽會,畫廊等。它真正實現(xiàn)了虛擬現(xiàn)實,在互聯(lián)網(wǎng)上仿真虛擬社會的各種活動,分布在世界各地的人可以借助互聯(lián)網(wǎng)開展各種文化科技,娛樂活動。而此時虛擬場景就是他們的三維環(huán)境。虛擬社區(qū)很可能是Web3D圖形在互聯(lián)網(wǎng)上的一種主要應(yīng)用形式。
????????現(xiàn)在,已有幾家公司推出了自己虛擬社區(qū)及全套的解決方案,如Blaxxun, Adobe Atmosphere. Geometrek ,Cybertown, OuterWorlds, berkom ,ActiveWorlds,iCity,pointworlds等。它們除了提供虛擬場景制作以外,還提供:服務(wù)器管理,通訊管理,用戶管理等功能。Blaxxun公司Virtual Worlds Platform 5.1服務(wù)器已經(jīng)有許多網(wǎng)站用它建立虛擬社區(qū)。
§1.3 JAVA3D在Web中的成功
????????Java在互聯(lián)網(wǎng)上幾乎隨處可見,而它在3D圖形上正在顯示出更大的威力。使用Java 的重要理由之一是它的平臺無關(guān)性。它的平臺無關(guān)性來自于Java只需部分編譯,負(fù)責(zé)編譯Java程序的叫做Java Virtual Machine (JVM),不同的平臺有它自己JVM,處理與平臺相關(guān)的功能。因此,只要支持JVM,就能運行JAVA小程序。兩種最有名的瀏覽器Netscape 和 IE 3都支持JVM(Java 1.0.2)。因此用Java制作的3D圖形幾乎都可以在互聯(lián)網(wǎng)的瀏覽器上顯示。令人遺憾的是:微軟在它的未來極具發(fā)展前景的Window XP中不再預(yù)裝JVM,由此引起的麻煩是巨大的:要運行基于JAVA的應(yīng)用,就必須安裝JVM,這顯然比安裝一個插件更麻煩。
????????由于全世界有90%的人上網(wǎng)使用微軟不要錢的瀏覽器IE,而Web3D的渲染引擎插件又必須安裝在IE上。面對Web3D技術(shù)未來的發(fā)展?jié)摿?,軟件巨人微軟作何打算我們不得而知。Shout Interactive and Blaxxun兩個公司使用純Java技術(shù)開發(fā)了實時渲染引擎(大小只有50K),這個小小的JAVA小程序,不僅在網(wǎng)上自動下載,而且可以在客戶端實時渲染3D場景,逐幀顯示動態(tài)的3D圖像。Shout Interactive and Blaxxun為用戶擴充自己的3D圖形功能預(yù)留了極大的空間。兩個公司并沒有拋棄VRML,Shout Interactive公司可以接受VRML文件,并把它變成自己的文件格式,Blaxxun公司的軟件可以直接運行VRML。當(dāng)然,Shout3D的小巧靈活并不是沒有代價的:它簡化了VRML的功能,VRML的一些功能不能用小小50K的Java來實現(xiàn)??梢哉f這兩個公司最先在它們的產(chǎn)品中實現(xiàn)了核心的X3D技術(shù)。
????????使用這種"無插件技術(shù)"(plug-in)的Shout公司為Macy's and Excite web portal網(wǎng)站制作了栩栩如生如生的3D虛擬時裝模特展示,觀看者用菜單可以選擇:展示的服裝,模特的膚色,發(fā)型,步型,甚至于燈光都可以用菜單即刻更換。觀看者可以用鼠標(biāo)變換視角,遠(yuǎn)近,從各個角度觀看動態(tài)展示。而所有的展示文件只有1M-2M,不需下載插件。圖像的質(zhì)量較好,人物動畫的動作流暢自然。
第二章 ?Java3D技術(shù)的簡介
Java3D用其自己定義的場景圖和觀察模式等技術(shù)構(gòu)造了3D的上層結(jié)構(gòu),實現(xiàn)了在Java平臺使用三維技術(shù)。本章將介紹Java3D特有的兩個重要概念:場景圖(Scene Graph)、觀察模式(View Model)。在接口使用上的介紹分為兩部分:說明如何使用Java3D接口;說明如何將Java3D技術(shù)與Java原有的Web技術(shù)(JSP、Serverlet)相結(jié)合,在網(wǎng)頁上實現(xiàn)三維顯示。
§2.1?Java3D概述
2.1.1 ?Java3D簡介
Java3D API是Sun定義的用于實現(xiàn)3D顯示的接口。3D技術(shù)是底層的顯示技術(shù),Java3D提供了基于Java的上層接口。Java3D把OpenGL和DirectX這些底層技術(shù)包裝在Java接口中。這種全新的設(shè)計使3D技術(shù)變得不再繁瑣并且可以加入到J2SE、J2EE的整套架構(gòu),這些特性保證了Java3D技術(shù)強大的擴展性。????????
JAVA3D建立在JAVA2(JAVA1.2)基礎(chǔ)之上,JAVA語言的簡單性使JAVA3D的推廣有了可能。它實現(xiàn)了以下三維顯示能夠用到的功能:
- 生成簡單或復(fù)雜的形體(也可以調(diào)用現(xiàn)有的三維形體)
- 使形體具有顏色、透明效果、貼圖
- 在三維環(huán)境中生成燈光、移動燈光
- 具有行為的處理判斷能力(鍵盤、鼠標(biāo)、定時等)
- 生成霧、背景、聲音
- 使形體變形、移動、生成三維動畫
- 編寫非常復(fù)雜的應(yīng)用程序,用于各種領(lǐng)域如VR(虛擬現(xiàn)實)
2.1.2 ?Java3D與其他三維技術(shù)的比較
JAVA3D可應(yīng)用在三維動畫、三維游戲、機械CAD等多個領(lǐng)域。但作為三維顯示實現(xiàn)技術(shù),它并不是唯一選擇而且是一個新面孔。在Java3D之前已經(jīng)存在很多三維技術(shù),這些三維技術(shù)在實現(xiàn)的技術(shù)、使用的語言以及適用的情況上各有不同,我主要介紹與Java3D又密切關(guān)系的三種技術(shù):OpenGL、DIRECT3D、VRML ??
OpenGL
OpenGL是業(yè)界最為流行也是支持最廣泛的一個底層3D技術(shù),幾乎所有的顯卡廠商都在底層實現(xiàn)了對OpenGL的支持和優(yōu)化。OpenGL同時也定義了一系列接口用于編程實現(xiàn)三維應(yīng)用程序,但是這些接口使用C(C++)語言實現(xiàn)并且很復(fù)雜。掌握針對OpenGL的編程技術(shù)需要花費大量時間精力。
DIRECT3D
DIRECT3D是Microsoft公司推出的三維圖形編程API,它主要應(yīng)用于三維游戲的編程。眾多優(yōu)秀的三維游戲都是由這個接口實現(xiàn)。與OpenGL一樣,Direct3D的實現(xiàn)主要使用C++語言。
VRML2.0(VRML97)
自1997年12月正式成為國際標(biāo)準(zhǔn)之后,在網(wǎng)絡(luò)上得到了廣泛的應(yīng)用,這是一種比BASIC、JAVASCRIPT等還要簡單的語言。腳本化的語句可以編寫三維動畫片、三維游戲、計算機三維輔助教學(xué)。它最大的優(yōu)勢在于可以嵌在網(wǎng)頁中顯示,但這種簡單的語言功能較弱(如目前沒有形體之間的碰撞檢查功能),與JAVA語言等其它高級語言的連接較難掌握,因而逐漸被淹沒在競爭激烈的網(wǎng)絡(luò)三維技術(shù)中。
表1是Java3D與其它三維技術(shù)的比較圖,可以從中直觀的看出他們相互間的區(qū)別:
技術(shù) |
實現(xiàn)層次 |
開發(fā)技術(shù)(難度) |
擴展性 |
最適合應(yīng)用領(lǐng)域 |
Java3D |
中層(JVM) |
Java(較易) |
J2SE標(biāo)準(zhǔn)擴展(好) |
網(wǎng)上三維顯示實現(xiàn)… |
OpenGL |
底層(顯卡) |
C\C++(難) |
各大廠商支持(較好) |
三維設(shè)計軟件… |
Direct3D |
底層(操作系統(tǒng)) |
C++(較難) |
Windows平臺(差) |
三維游戲… |
VRML |
上層(網(wǎng)頁) |
標(biāo)記語言(容易) |
安裝插件支持(一般) |
網(wǎng)上虛擬現(xiàn)實… |
表1:3D技術(shù)對招表
§2.2?Java3D的場景圖結(jié)構(gòu)
????????Java3D實際上是Java語言在三維圖形領(lǐng)域的擴展,與Java一樣,Java3D有純粹的面向?qū)ο蠼Y(jié)構(gòu)。Java3D的數(shù)據(jù)結(jié)構(gòu)采用的是Scene Graphs Structure(場景圖),就是一些具有方向性的不對稱圖形組成的樹狀結(jié)構(gòu)(圖1)。
????????實際由Java3D定義的一系列的對象,這些對象不是雜亂無序,對象之間也不是毫無關(guān)系。如果想讓三維圖像正常顯示,必須在這兩點上遵循Java3D場景圖的規(guī)定。觀察圖1,Java3D場景圖的樹結(jié)構(gòu)由各種各樣的對象組成:
在圖中出現(xiàn)的這些對象都實現(xiàn)了Java3D中有重要的意義的類,從邏輯上我將它們分為三類:
- 根節(jié)點(Root):Virtual Universe Object
- 節(jié)點(Node):Local Object、Branch Group Nodes、Behavior Node、Shape3D Node…
- 葉子節(jié)點(Leaf):Appearance、Geometry..
?
圖1:在應(yīng)用中的Java3D場景圖
場景圖中線和線的交匯點稱為節(jié)點(Node),這些節(jié)點都是Java3D類的實例(Instance of Class),節(jié)點之間的線表示各個實例之間的關(guān)系。
- Virtual Universe是根節(jié)點,每一個場景圖的Virtual Universe是唯一的。
- 在Virtual Universe下面是Locale節(jié)點,每個程序可以有一個或多個Locale,但同時只能有一個Locale處于顯示狀態(tài),就好像一個三維世界非常大,有很多個景點,但我同時只能在一個景點進行觀察。Java3D允許從一個Locale跳到另一個Locale,不過絕大多數(shù)程序只有一個Locale。
- 每一個Locale可以擁有多個Branch?Group節(jié)點。所有三維形體的其位置信息(Transform Group Nodes)都建立在Branch?Group節(jié)點之上。
- Transform?Group Node用來設(shè)定Shape3D在Virtual Universe中的位置。
- Spape3D Node是三維圖形節(jié)點,這個節(jié)點的實體放映在最后的顯示畫面中,就是三維世界中的每個形體。包括正方體、球體以及任何形狀和外觀的三維形體。
- 位于場景圖最下層的是兩個葉子節(jié)點:三維體的外觀(Appearance)和幾何信息(Geometry),這兩個節(jié)點定義了一個三維體的顯示效果。
- View Platform位于圖1的另一個分枝上,與前面所有描述三維體的性質(zhì)的概念不同,View Platform和View都是用來定義觀察者的信息。
對于建立一個簡單的Java3D程序,我至少需要了解三個概念:虛擬宇宙(Virtual Universe)、場景(Locale)、坐標(biāo)系統(tǒng)。
2.2.1 ?虛擬宇宙(Virtual Universe)
在Java3D中,虛擬宇宙被定義為結(jié)合一系列對象的三維空間。虛擬宇宙被用作最大的聚集體表現(xiàn)單位,同時也可被看作一個數(shù)據(jù)庫。不管是在物理空間還是邏輯內(nèi)容,虛擬宇宙都可以很大。實際上在大多數(shù)情況下,一個虛擬宇宙就可以滿足一個應(yīng)用程序所有的需求。
虛擬宇宙是各自獨立的個體,原因是在任何時候一個結(jié)點對象都不能在超過一個的虛擬宇宙中存在。同樣的,在一個虛擬宇宙中的結(jié)點對象也不能在其他的虛擬宇宙中可見或者與其他的對象結(jié)合。 對于一個Java3D應(yīng)用程序,必須定義一個虛擬宇宙才可以在這個"宇宙"中顯示三維圖像。
2.2.2 ?Java3D的坐標(biāo)系統(tǒng)
默認(rèn)情況下,Java3D的坐標(biāo)系統(tǒng)是右旋的,用方位語義學(xué)來解釋就是:正y方向是本地重力的上,正x方向是水平的右,正z是這對著觀察者的方向。默認(rèn)的單位是米。 雙精度浮點、單精度浮點甚至是定點來表示的三維坐標(biāo)都足夠來表示和顯示豐富的3D場景。不幸的是,場景不是真實世界,更不必說整個宇宙了。如果使用單精度坐標(biāo),有可能出現(xiàn)下列情景:
- 離原點僅有一百公里的距離,被描繪得相當(dāng)量子化,所能達到的最好效果就是三分之一英寸,在實際應(yīng)用中這樣的精度比要求的粗糙的多。
- 如果要縮小到一個很小的尺寸(例如表現(xiàn)集成電路的大小),甚至在離原點很近的地方就會出現(xiàn)同坐標(biāo)問題。
為了支持一個大型的鄰接虛擬宇宙,Java3D選擇了有256位的高分辨率坐標(biāo):
????????Java3D高分辨率坐標(biāo)由三個256位的定點數(shù)組成,分別表示x、y、z。定點被固定在第128位,并且值1.0被定義為真實的1米。這個坐標(biāo)系統(tǒng)足夠用來描述一個超過幾百萬光年距離的宇宙,也可以定義小于一質(zhì)子大?。ㄐ∮谝黄绽士碎L度)的對象。
????????在Java3D中,高分辨率坐標(biāo)僅僅用于將更加傳統(tǒng)的浮點坐標(biāo)系統(tǒng)嵌入更高分辨率的底層系統(tǒng)。用這種方法,可以創(chuàng)造出一個具有任意大小和規(guī)模的在視覺上無縫的虛擬宇宙,而且可以不必?fù)?dān)心數(shù)字上的精度。(參看表2)
一個256位的定點數(shù)還具有能夠直接表示幾乎任何的合理適當(dāng)?shù)膯尉雀↑c值。
????????Java3D用有符號的、兩位補碼的256位定點數(shù)字來表示高分標(biāo)率坐標(biāo)。盡管Java3D保持內(nèi)部高分辨率坐標(biāo)表示的不透明,但用戶用有八個整型變量的數(shù)組來表示256位的坐標(biāo)。Java3D把數(shù)組中從索引號由0到7分別看作高分辨率坐標(biāo)的從高到底位上的數(shù)。第128位上是二進制的小數(shù)點,也可以說在索引號為3和4的整數(shù)之間。高分辨率坐標(biāo)的1.0就是1米。 如果是"小"的虛擬宇宙(類似于相對比例的幾百米),在虛擬宇宙對象下(0.0,0.0,0.0)點建立一個帶有高分辨率坐標(biāo)的Locale作為根節(jié)點就足夠使用了;裝入程序在裝入過程中能自動構(gòu)建結(jié)點,而在高分辨率坐標(biāo)下的點不需要任何外部文件的直接描述。 大一些的虛擬宇宙期待被構(gòu)建為有如同計算機文件那樣的層次,這意味著一個根宇宙要包含由外部文件引用的嵌入虛擬宇宙。就這樣,文件引用的對象(用戶指定的Java3D組或高分辨率結(jié)點)定義了被讀入現(xiàn)存虛擬宇宙的數(shù)據(jù)的位置。
Java 3D 高分辨率坐標(biāo) | |
2n Meters |
Units |
87.29 |
Universe (20 billion light years) |
69.68 |
Galaxy (100000 light years) |
53.07 |
Light year |
43.43 |
Solar system diameter |
23.60 |
Earth diameter |
10.65 |
Mile |
9.97 |
Kilometer |
0.00 |
Meter |
-19.93 |
Micron |
-33.22 |
Angstrom |
-115.57 |
Planck length |
表2:Java 3D 高分辨率坐標(biāo)
2.2.3 ?場景(Locale)
????????為了支持大型虛擬宇宙,Java3D提出了"Locale"的概念。Locale把高分辨率坐標(biāo)作為起源。把高分辨率坐標(biāo)看作精確的定位,它在高分辨率坐標(biāo)的影響范圍之內(nèi)使用精度較低的浮點坐標(biāo)指定對象的位置。
????????一個Locale和與它結(jié)合的高分辨率坐標(biāo)一起組成了在虛擬宇宙之下的一個表現(xiàn)層。所有虛擬宇宙包含一個或多個高分辨率Locale。而所有其他的對象都是附加在一個Locale上的。在整個體系中,高分辨率坐標(biāo)扮演的是上層的僅供翻譯的轉(zhuǎn)換結(jié)點。例如,附加到一個特定Locale的所有對象的坐標(biāo)都會與這個Locale位置的高分辨率坐標(biāo)有關(guān)。(圖2)
?
圖2:高分辨率坐標(biāo)指定場景
????????如果一個虛擬宇宙與傳統(tǒng)的計算機圖像的概念相近,給定的虛擬宇宙可能會變得太大。所以在通常情況下最好把一個場景圖看作是一個高分辨率坐標(biāo)場景的子結(jié)點。構(gòu)造一個三維場景,程序員必須運行一個Java3D程序。這個Java3D應(yīng)用程序必須首先創(chuàng)建一個虛擬宇宙對象并且至少把一個Locale對象附加之上。然后,構(gòu)建出需要的場景圖像,它由一個分支組結(jié)點開始并且包括至少一個觀察平臺對象,而場景圖就是附加于這個觀察平臺。當(dāng)一個包含場景圖的觀察對象被附加于一個虛擬宇宙,Java3D的渲染循環(huán)就開始工作。這樣,場景就會和它的觀察對象一起被繪制在畫布上。
§2.3?實現(xiàn)三維世界
2.3.1 ?Java3D的觀察模式
????????Java3D引入了一種新的觀察模式,這種模式使Java編寫的顯示效果符合"編寫一次,隨處運行"的原則。Java3D還把這種功能推廣到顯示設(shè)備或六等級自由度輸入外部設(shè)備,例如跟蹤攝像頭。這種新的觀察模式的"一次編寫,隨處觀察"的特性意味著用Java3D觀察模式編寫的應(yīng)用程序和Applet可以廣泛應(yīng)用于各種各樣的顯示設(shè)備。在不修改場景圖的條件下,圖像可以在包括標(biāo)準(zhǔn)電腦顯示、多放射顯示空間和安裝攝像頭設(shè)備的顯示設(shè)備上被渲染。這也意味著在不需要修改場景圖的情況下,同一個應(yīng)用程序既能夠渲染立體景象,還能通過攝像頭的輸入控制渲染過的觀察圖。 Java3D的觀察模式通過完全分離虛擬和現(xiàn)實世界來實現(xiàn)這種多功能性。這種模式區(qū)分了以下兩種情況:
- 一個應(yīng)用程序通過控制觀察平臺的位置和方向在虛擬宇宙中對一個觀察臺對象(ViewPlatform)定位、定向和設(shè)定比例尺;
- 渲染器使用已知位置和方向計算出要使用的觀察對象,對終端用戶物理環(huán)境的描述確定用戶在物理環(huán)境中的位置和方向。
為什么使用一個新的模式,由于在底層的編程接口中可以找到基于照相機的觀察模式,開發(fā)者通過它可以控制所有渲染圖的參數(shù)。它可以應(yīng)付處理常規(guī)的應(yīng)用程序,但是處理有更廣闊的適應(yīng)性的系統(tǒng)的時候就顯得力不從心,這些系統(tǒng)包括:把整個世界作為一個單元裝入和顯示的觀察器或瀏覽器、可供終端用戶觀察、操縱、顯示、甚至與虛擬世界交互的系統(tǒng)。
????????基于照相機的觀察模式仿效在虛擬世界中放置一個照相機而不是一個人。開發(fā)者必須持續(xù)重新配置一個照相機來模擬"在虛擬世界中有一個人"。Java3D觀察模式直接和跟蹤攝像頭結(jié)合。在有攝像頭的情況下,用戶會有好像他們是真實的存在在那個虛擬世界的錯覺,而開發(fā)者可以不做任何附加的工作就可以為用戶帶來這種效果。在沒有攝像頭并且只是用來表現(xiàn)一個單一的標(biāo)準(zhǔn)顯示的情況下,Java3D觀察模式表現(xiàn)得更像傳統(tǒng)的基于照相機的觀察模式,只是加上了能夠產(chǎn)生立體透視圖的功能。在一個需要由物理環(huán)境規(guī)定一些觀察參數(shù)的系統(tǒng)中,讓應(yīng)用程序來控制所有的觀察參數(shù)并不合理。例子就是:一個帶有攝像頭的顯示設(shè)備可以用其光系統(tǒng)直接決定應(yīng)用程序中的觀察領(lǐng)域。不同的設(shè)備有不同的光系統(tǒng),程序開發(fā)者硬綁定這樣的參數(shù)或允許終端用戶改變這樣的參數(shù)都是不合理的。另外一個例子是:一個可以由用戶當(dāng)前的頭部位置自動計算出觀察參數(shù)的系統(tǒng)。只有一個對世界的說明和一條預(yù)先定義的軌跡可能不會嚴(yán)密的定義一個終端對象的觀察。對于有攝像頭設(shè)備用戶,他們可能會期待在沿著一條固定的路線前進的時候能夠看到他們左右兩旁的物體。就好像在一個游樂場中,游客乘坐觀光車按照固定的路線參觀游樂場,但是在這過程中,游客可以持續(xù)轉(zhuǎn)動他們的頭。
????????由于依靠終端用戶的具體物理環(huán)境,觀察的各個參數(shù),尤其是觀察和投影的基體變化很大。影響觀察和投影基體的因素包括顯示設(shè)備的物理尺寸,顯示設(shè)備的安裝方法(在用戶的桌面或用戶的頭頂上),計算機是否知道用戶的頭在三維空間的位置,頭頂裝置真實的觀察領(lǐng)域,顯示設(shè)備上每平方英寸的像素數(shù),還有其他類似的參數(shù)。Java3D建立的觀察模式完全可以滿足上述所有的需求。
2.3.2??Java3D中用來定義觀察的對象
????????Java3D通過幾個對象來發(fā)布它的觀察模式。特別是View對象和與它相關(guān)的組件對象:??PhysicalBody對象、PhysicalEnvironment對象、Canvas3D對象、Screen3D對象。圖3描述了View對象的中心角色和組件對象的輔助角色。
????????觀察有關(guān)的對象都在圖3中,它們起的作用如下:
ViewPlatform(觀察平臺):一個view用一個葉子結(jié)點來在場景圖為自己定位。觀察平臺的起始結(jié)????????點指定了它的位置、方向和在虛擬世界中的比例尺。
View(觀察):主要的觀察對象包含了很多觀察的狀態(tài)。
Canvas3D:抽象窗口工具箱中畫布對象的3D版本。它描繪了一個可以讓Java3D在上面畫圖像的窗口。它包括了一個對Screen3D對象的引用和描述一個Canvas3D要用到的尺寸、形狀和位置信息。
Screen3D:一個包含描述顯示熒屏物理屬性信息的對象。Java3D把顯示熒屏信息分別放在單獨的對象中,這樣做可以防止在每一個Canvas3D對象中不同的顯示屏幕信息共享一個屏幕。
PhysicalBody:一個包含刻度信息的對象,它描述了用戶的物理身體。
PhysicalEnvironment:一個包含刻度信息的對象,它描述了物理世界。主要的信息描述了環(huán)境的六自由度硬件。
?
圖3:View和它的組件對象以及它們的相互聯(lián)系
????????這些對象一起描述觀察的幾何體勝于明白的提供觀察或投影基體。Java3D的表現(xiàn)工具用這個信息來構(gòu)造適合的觀察和投影基體。這些觀察對象的幾何中心為產(chǎn)生一個觀察提供了更大的彈性,這種彈性需要支持可以選擇的顯示配置。
????????ViewPlatform: 在虛擬世界中的位置?一個ViewPlatform結(jié)點定義了一個坐標(biāo)系統(tǒng)。這樣,在虛擬世界中就有了一個有原點或參考點的參考系。觀察平臺是一個附加在觀察對象的點并且作為決定描繪工具觀察的基礎(chǔ)。圖4表示了一個場景圖的一部分,它包括一個觀察平臺結(jié)點。直接在觀察平臺之上的結(jié)點決定了它在虛擬世界中的位置和方向。應(yīng)用程序和行為通過修改直接在觀察平臺之上任何與TransformGroup結(jié)點結(jié)合的Tramsform3D對象可以在虛擬世界中任意移動ViewPlatform。一個簡單的應(yīng)用程序可能直接在一個觀察平臺上定義一個TransformGroup結(jié)點。一個虛擬宇宙可能有很多不同的觀察平臺,但是一個特定的View對象只能附加于一個單一的觀察平臺之上。這樣,每個畫在Canvas3D上的圖畫都是從一個單一的觀察平臺開始。
?
圖4:包含觀察平臺的一部分場景圖
2.3.3 ?在三維世界中建立、移動觀察點
????????應(yīng)用程序通過修改觀察平臺的上級TransformGroup在虛擬世界中航行。修改一個觀察平臺的位置和方向的應(yīng)用程序的例子包括:瀏覽器、提供航行控制的閱讀器、做建筑預(yù)設(shè)計的程序、甚至是搜尋和毀壞游戲。
????????控制觀察平臺對象能產(chǎn)生很有趣和有用的結(jié)果。我可以定義一個簡單的場景圖,這個程序的目的是在窗口的正中畫了一個對象并且繞自己的中心轉(zhuǎn)動。不管在中心的對象,而讓ViewPlatform在虛擬世界中繞圈。如果形體結(jié)點包括一個地球模型,這個程序可能產(chǎn)生一個類似于繞地球的遠(yuǎn)航員觀察對象。如果在這個世界中加入更多的對象,這個場景圖允許經(jīng)由行為結(jié)點來瀏覽整個虛擬世界。
?
圖5:一個由觀察控制的簡單場景圖
????????應(yīng)用程序和動作通過TransformGroup的可訪問方法操縱它。這些方法允許應(yīng)用程序得到和設(shè)置組結(jié)點的Transform3D對象。Transform3D結(jié)點有setTransform和getTransform兩個方法。
????????形體移動的實現(xiàn)向來都是三維實現(xiàn)的難點和復(fù)雜之處,傳統(tǒng)三維技術(shù)的實現(xiàn)多是注重模擬三維物體的真實移動。而Java3D除了提供傳統(tǒng)的方案,還可以在一個存在的三維世界中移動一個觀察點,借助觀察點的移動模擬物體的移動。如同物理所學(xué)的切割磁力線發(fā)電,轉(zhuǎn)子和靜子本來就是一對可以互逆的對象,結(jié)果都是把動能轉(zhuǎn)化為電能。例2的代碼顯示了在Virtual Universe中建立Viewer、ViewPlatForm、和如何通過綁定OrbitBehavior實現(xiàn)移動ViewPlatform。
2.3.4 ?Java3D的網(wǎng)絡(luò)基礎(chǔ)
將Java3D與Java平臺技術(shù)的結(jié)合。Java3D可以很容易的與Java平臺的其他技術(shù)相結(jié)合,如Applet、JSP、Serverlet、JDBC、EJB等。100%的純Java實現(xiàn)是Java3D可以與如此多的Java平臺技術(shù)結(jié)合的根本原因:
- 同是Java平臺保證Java3D可以在Applet中實現(xiàn);
- Applet使Java3D可以輕易的在網(wǎng)頁中顯示;
- JSP、Serverlet技術(shù)保證將動態(tài)網(wǎng)頁技術(shù)用于Java3D顯示;
- Serverlet本身就是J2EE平臺的核心技術(shù),這使得Java3D可以搭建于J2EE平臺。更可以使用所有J2EE的其他技術(shù):JDBC、EJB、JMS…
第三章 實現(xiàn)JAVA3D結(jié)構(gòu)體系的方法
§3.1 總體設(shè)計
設(shè)計思想是:以JAVA3D為平臺,使用JBuilder編譯器,生成一個三維小場景,實現(xiàn)簡單實體建模,物體運動,場景移動,各種燈光,霧等場景變換操作以及更換背景圖片增加背景音樂等三維體系的基本功能。
§3.2 基本形體的生成
和VRML不同,JAVA3D沒有基本形體類,因而在程序中無法直接生成大量應(yīng)用的基本形體,如BOX、CONE、SPHERE等。我們可以通過復(fù)雜的編程生成這些基本形體,也可以直接調(diào)用JAVA3D為我們提供的geometry?classes,利用它生成程序所需要的BOX、COLORCUBE、CONE、SPHERE、CYLINDER。下面是這些基本體的生成方法。
3.2.1平板的生成
UTILITY里BOX的構(gòu)造函數(shù)有:
1.Box():成一個各邊尺寸均為2的BOX,要說明的是,BOX、COLORCUBE、SPHERE的坐標(biāo)原點均在其中心點,CONE、CYLINDER的則在其軸線的中點上。
- Box(float?xdim,?float?ydim,?Appearance?ap)?:成一個給定尺寸、給定外觀屬性的BOX ,例Box(.5f,?.6f,?.4f,?myApp)
- Box(float?xdim,?float?ydim,?float?zdim,?int?primflags,?Appearance?ap):生成一個有特定說明的BOX,例如:Box(.4f,.6f,.3f,Primitive.ENABLE_APPEARANCE_MODIFY,?ap)表示程序在運行時可以改變其外觀屬性。
3.2.2 立方體的生成
UTILITY里COLORCUBE的構(gòu)造函數(shù)有:
-
- ColorCube()
生成一個邊長均為2的COLORCUBE
- ColorCube(double?scale)
將邊長均為2的COLORCUBE按比例放大縮小。
3.2.3 圓錐的生成
UTILITY里CONE的構(gòu)造函數(shù)有:
- public?Cone()
生成一個底半徑為1,高為2的CONE。
- Cone?(float?radius,?float?height)
- Cone?(float?radius,?float?height,?int?primflags, ?Appearance?ap)
- Cone(float?radius,?float?height,?int?primflags, ?int?xdivision,?int?ydivision,?Appearance?ap)
這里,xdivision、ydivision可用來表示圓錐的顯示是高精度的顯示,或是底精度的顯示,缺省時的中等精度時xdivision?=?15;?ydivision?=?1;?我們可利用這兩個參數(shù)來改變顯示的效果,使顯示圓錐的三角片更多或更少些。
3.2.4?球體的生成
?UTILITY里SPHERE的構(gòu)造函數(shù)有:
- Sphere()
生成一個半徑為1的SPHERE。
- Sphere?(float?radius)
- Sphere?(float?radius,?Appearance?ap)
- Sphere(float?radius,?int?primflags,?Appearance?ap)
- Sphere(float?radius,?int?primflags,?int?divisions)
- Sphere(float?radius,?int?primflags,?int?divisions, Appearance?ap)
這里,divisions的作用和圓錐的xdivision、ydivision相似。
3.2.5.圓柱體的生成
?UTILITY里CYLINDER的構(gòu)造函數(shù)有:
- Cylinder()?
生成一個底半徑為1,高為2的CYLINDER。
- Cylinder?(float?radius,?float?height)?
- Cylinder?(float?radius,?float?height,?Appearance?ap)
4.??Cylinder?(float?radius,?float?height,?int?primflags,?Appearance?ap)
5.??Cylinder(float?radius,?float?height,?int?primflags,??int?xdivision,?int?ydivision,?Appearance?ap)
§3.3 點、線、面的生成
3.3.1點的生成
編寫JAVA3D程序?qū)嶋H上是編寫一個特定的場景圖,給出了場景圖中帶有形體及其屬性的一個分支(BranchGroup)和表示觀察位置等數(shù)據(jù)的另一個分支(View?Platform)。一般來說,表示觀測位置的分支可以用JAVA3D的UTILITY來完成,即createSceneGraph方法的定義。
在這個方法里,程序先定義了一個分支objRoot,然后用數(shù)組的形式定義了頂點坐標(biāo)vert和顏色color,再用PointArray 定義了一組點point,并將頂點坐標(biāo)及顏色賦值給point,由于JAVA3D中的PointArray點是Shape3D的子類,它不能直接放入一個BranchGroup,因而我們還要先定義一個Shape3D對象shape,再將point賦予shape,這樣point就可以放入BranchGroup類型的對象objRoot中了。
JAVA3D提供的API中,可用于生成Point的對象有:?PointArray?IndexedPointArray
- PointArray
PointArray的構(gòu)造函數(shù)為:
PointArray(?int?vertexCount,?int?vertexFormat?);這里,vertexCount表示應(yīng)生成的點的數(shù)目,vertexFormat表示所需要的頂點的格式。
點、線、面幾何體所需要的頂點的格式有:
COORDINATES 頂點坐標(biāo)數(shù)組
NORMALS 頂點法向數(shù)組
COLOR_3 不帶alpha值的顏色數(shù)組
COLOR_4??帶alpha值的顏色數(shù)組
TEXTURE_COORDINATE_2???二維紋理坐標(biāo)數(shù)組
TEXTURE_COORDINATE_3???三維紋理坐標(biāo)數(shù)組
- IndexedPointArray
IndexedPointArray的構(gòu)造函數(shù)為:
IndexedPointArray(?int?vertexCount,?int?vertexFormat,int?indexCount?);
利用本函數(shù),我們可以從眾多的點中,選擇特定的點來顯示。這里,vertexCount表示頂點坐標(biāo)數(shù)組所提供的點的總個數(shù),indexCount表示最終應(yīng)生成的點的個數(shù)。JAVA3D可以生成任意大小的點,并且可以使點為方點或圓點。
3.3.2直線的生成
利用JAVA3D的一些對象,生成各種直線??梢陨芍本€的對象有:
- LineArray
- LineStripArray?
- IndexedLineArray
- IndexedLineStripArray
我們可以根據(jù)各種不同的情況,生成不同的直線,如給定寬度的直線、虛線等。相應(yīng)的的方法有:setLineWidth(float?lineWidth)
setLinePattern(int?linePattern)
setLineAntialiasingEnable(boolean?state)
對于線型linePattern有以下數(shù)據(jù)可選:
int??PATTERN_SOLID,int??PATTERN_DASH,int??PATTERN_DOT,int??PATTERN_DASH_DOT
這些內(nèi)容對所有種類的直線都有效。
3.3.3面的生成
生成平面的對象及其定義
????JAVA3D可通過編程顯示出面來,面有兩種:三角形和四邊形,相應(yīng)的對象為Triangle和Quad。
?JAVA3D用于生成平面的對象有:
-
-
-
- TriangleArray
- QuadArray
-
-
- TriangleStripArray
- TriangleFanArray
- IndexedTriangleArray
- IndexedTriangleStripArray
- IndexedTriangleFanArray
§3.4 外部復(fù)雜形體的調(diào)用
利用前面介紹的方法生成我們所需要的基本形體,生成點、線、平面。但有的時候,我們需要用到其它格式的三維形體,如VRML2.0格式的圖形文件,AUTOCAD繪出的DWG格式的三維形體,3DS?MAX繪制出的復(fù)雜形體。對于這些形體,我們可以非常方便地將其用到JAVA3D程序中去。下面我們介紹一些圖形格式在JAVA3D中的應(yīng)用方法。
-
- Wavefront的OBJ格式的圖形文件的調(diào)用
????????JAVA3D編譯環(huán)境所帶的UTILITY有兩個LOADER,一個可用來調(diào)用Wavefront軟件的OBJ格式的三維圖形格式文件,一個可用來調(diào)用Lightwave軟件的LWS及LWO格式的三維圖形格式文件。
????????為了使JAVA3D能夠調(diào)用Wavefront的OBJ格式的圖形文件,程序的頭四行import語句就是用來處理Wavefront的OBJ格式的圖形文件,第五行的import語句則是打開外部文件之用。
import?com.sun.j3d.loaders.objectfile.ObjectFile;
import?com.sun.j3d.loaders.ParsingErrorException;
import?com.sun.j3d.loaders.IncorrectFormatException;
import?com.sun.j3d.loaders.Scene;
import?java.io.*;
-
- VRML2.0(VRML97)圖形文件在JAVA3D中的應(yīng)用簡介
利用VRML97的LOADER我們可以在JAVA3D程序中方便地調(diào)用VRML圖形。調(diào)用VRML97程序就象調(diào)用Wavefront的OBJ一樣簡單。?
-
- AUTOCAD?R14的DWG圖形及3DS?MAX圖形在JAVA3D中的應(yīng)用。
在三維圖形生成過程中,國內(nèi)目前大量使用AUTOCAD及3DS?MAX等軟件。對于3DS?MAX軟件,處理起來非常方便 3DS?MAX可以將其圖形直接輸出成VRML97格式。對于AUTOCAD?R14來說,目前還不太方便,需借助第三方軟件轉(zhuǎn)換成JAVA3D支持格式。
§3.5背景變換的實現(xiàn)方法
3.5.1 燈光
????????光用于照亮場景中的幾何對象。有幾種不同的光類型,它們都是抽象?Light 類的子類。所有光都有一個顏色值,即開/關(guān)位,以及一個描述它照亮的場景區(qū)域的綁定對象。在現(xiàn)實世界里,周圍的對象被幾個不同的光源照亮。從窗戶射進的陽光和屋頂?shù)臒艄庖黄鹫樟亮宋輧?nèi)的一切。兩種光都會影響屋內(nèi)對象的顏色和外觀。在?Java 3D 中,可以通過使用多個光源來模擬實際的光照效果。
光的類型
環(huán)境光:在場景中?AmbientLight 無處不在。它不發(fā)自某個特定點,也不指向某個特定方向。
它的方法:
AmbientLight ( )
點光:
Point Light 從一個指定位置向各個方向輻射,并隨著距離的增加而減弱。點光源的一個例子是沒有燈罩的臺燈。
它的方法是:
PointLight( )
void setPosition( Point3f pos )
Spotlight?PointLight的繼承,是一種將光的范圍限制在一個圓錐形內(nèi)的點光源。聚光源的一個例子是手電筒。
直射光:DirectionalLight 的光線射向某一個特定方向,卻不發(fā)自任何特定的位置。這種定向光的所有光線都平行發(fā)射。雖然從技術(shù)上說,太陽是一個點光源,但使用?DirectionalLight 可以更準(zhǔn)確地模擬太陽光。
AmbientLight |
PointLight |
Spotlight |
DirectionalLigh |
?
????????所有的?Light 節(jié)點都是場景圖中的葉節(jié)點。創(chuàng)建它們時,需要指定 Bounds 對象;我們使用 BoundingSphere。光將僅僅影響那些位于光的 BoundingSphere 所定義的空間內(nèi)的幾何對象,因此我們需要確保 BoundingSphere 足夠大。在創(chuàng)建完光之后,我們用Scene1.addChild( Node?);將其附加到場景圖的頂部 BranchGroup。光、行為和材質(zhì)都在場景圖的上面添加。
3.5.2 紋理貼圖
????????裝入紋理 同光照一樣,紋理貼圖影響整個幾何對象。再一次使用?Appearance 類來指定紋理貼圖效果。
????????Java 3D 簡化了裝入紋理圖像的過程。TextureLoader 類位于 Java3D 實用類中。為了看起來更真實,請總是將紋理圖像的寬度和高度設(shè)置成?2 的冪。其它的值會導(dǎo)致 TextureLoader 將紋理壓變形。
Primitive 類將生成紋理坐標(biāo)――就象它們?yōu)橛嬎愎庹丈煞ň€一樣。
3.5.3 霧
????????霧效果可以增添場景的真實感,也可以使遠(yuǎn)處的形體變模糊或是屏蔽它們,也可以使場景產(chǎn)生透視效果。
????????Java3D中可以用ExponentialFog類添加霧效果。
它的方法:
ExponentialFog?( )
§3.6 動畫的生成
????????所有的內(nèi)插器節(jié)點在使用時都需要與TimeSensor(時間傳感器)配合使用。TimeSensor把給定的時間周期歸一化,雖然時間的周期 cycleInterval?有給定的秒數(shù),但計算機內(nèi)部將其處理成從0.0到 1.0,即起始時間為0.0,終止時間為1.0,假如一個時間周期為 20(單位均為秒),則第6秒的歸一化結(jié)果是0.3,第10秒的歸一化結(jié)果是0.5,第20秒的歸一化結(jié)果是1.0。?Alpha可以輸出從0到1之間的數(shù)值給特定的內(nèi)插對象,當(dāng)Alpha輸出的數(shù)值為0時,對應(yīng)的特定內(nèi)插對象的值為最小;當(dāng)Alpha輸出的數(shù)值為1時,對應(yīng)的特定內(nèi)插對象的值為最大;當(dāng)Alpha輸出的數(shù)值為0到1之間的數(shù)值時,對應(yīng)的特定內(nèi)插對象生成和Alpha成相同比例的數(shù)值。假設(shè)某一時刻Alpha輸出的數(shù)值為0.2,則對應(yīng)的特定內(nèi)插對象的當(dāng)前值為最小值加上最大最小值之差乘以0.2。(當(dāng)前值-最小值)/(最大值-最小值)=0.2
????????JAVA3D里的各種Interpolator對象可用來旋轉(zhuǎn)形體、移動形體的坐標(biāo)、變化形體的顏色等。假設(shè)我們要讓一個形體在規(guī)定的時間內(nèi)按照指定的方式運動,我們首先要給出時間段的大小,還要指出時間是否要循環(huán)。這些內(nèi)容都是由Alpha類來完成的。基本上我們用它以及一個旋轉(zhuǎn)內(nèi)插器RotationInterpolator來使形體繞著其所在的局部坐標(biāo)系不停地旋轉(zhuǎn)。
第四章JAVA3D場景的實現(xiàn)
§4.1Java3D的實現(xiàn)流程
????????本次畢業(yè)設(shè)計中實現(xiàn)一個JAVA3D場景,其中包括各類燈光的實現(xiàn),三維場景的移動,任意物體的運動,場景背景變換,指數(shù)霧的實現(xiàn)以及與之配合的背景音樂.
????????該3D場景設(shè)計中運用到立方體、圓錐及橢圓等基本形體,生成Temple和Tower;各種點、線、面生成地面及背景環(huán)境。以下即是其設(shè)計流程圖:
?
圖6 結(jié)構(gòu)設(shè)計流程圖
§4.2 JAVA3D的建模
4.2.1 生成場景:(SimpleUniverse在哪生成的并沒說清楚)
先生成一個Scene1場景作為父結(jié)點,以后在此結(jié)點下加入子結(jié)點完成各種操作及圖形顯示。:
public Group buildScene( SimpleUniverse u)??// 繼承Group類
{
Group Scene1= new Group ( );
????????……
return Scene1;
}
這里的SimpleUniverse是對VirtualUniverse的繼承,一個應(yīng)用程序只有一個SimpleUniverse(VirtualUniverse)。它同時定義了其下的Locale、Node、Group及BranchGroup結(jié)點。
4.2.2 Temple的圓柱體的構(gòu)建
在程序中定義了一個函數(shù)buildColumns來生成一對圓柱體
// 開始構(gòu)建柱體
Vector3f trans = new Vector3f( );
Transform3D tr = new Transform3D( );
TransformGroup tg;
for ( int i = 0; i < NumberOfColumns; i++ )
{
// 左邊的圓柱
trans.set( x, y, z );
tr.set( trans );
tg = new TransformGroup( tr );
tg.addChild( new Link( column ) );
group.addChild( tg );
z += zSpacing;
}
// 柱體構(gòu)建完畢
return group;
}
然后創(chuàng)建一個函數(shù)ColumnScene設(shè)置光線、紋理,并將buildColumns加入
public ColumnScene (Component observer)
{
// 在地面上構(gòu)建一系列圓柱
SharedGroup?column = buildSharedColumn ( );
Group columns = buildColumns (column);
addChild (columns);
}
在4.1.1生成的場景中利用addChild方法調(diào)用ColumnScene函數(shù),
Scene1.addChild (new ColumnScene (this));
即在場景中顯示構(gòu)建好的圓柱體。
?
圖7利用Java3D構(gòu)建的Temple
4.2.3 Tower的構(gòu)建
創(chuàng)建函數(shù)TowerScene構(gòu)建Tower場景,并加到Scene1中
public TowerScene (Component observer)
{
……
// 構(gòu)建粗糙的地面
CraterGrid grid = new CraterGrid (
50, 50, ?????// 柵格范圍
1.0, 1.0, ????// 位置
4.0, ????????// 高度放大比例
craters, ?????// 柵格仰角
moonApp ); ?// 顯示
addChild (grid);
……
// 構(gòu)建金字塔
Arch towerShape = new Arch (
0.0, ?????????// 起始λ角
1.571, ???????// 結(jié)束λ角
2, ???????????// nλ
0.0, ?????????//起始θ角
Math.PI*2.0,???//?結(jié)束θ角
5, ???????????// nθ
3.0, ?????????// 起始半徑
8.0, ?????????// 結(jié)束半徑
0.0, ?????????// 起始λ層
0.0, ?????????// 結(jié)束λ層
towerApp); ??// 顯示
tower.addChild (towerShape);
}
插入到Scene1場景中,
Scene1.addChild(new TowerScene (this));?
在這里面函數(shù)CraterGrid是建立粗糙柵格表面,Arch是建立給定參數(shù)的一個弧面。這兩個函數(shù)是Java3D里已經(jīng)定義好的功能所以這里就直接拿來調(diào)用,而不給出具體建模的算法了。
?
圖8加入TowerScene后的場景效果
§4.3 動畫的實現(xiàn)
4.3.1 調(diào)用galleon.obj文件
將galleon.obj文件調(diào)入到場景中要加入五行import?,
import?com.sun.j3d.loaders.objectfile.ObjectFile;
import?com.sun.j3d.loaders.ParsingErrorException;
import?com.sun.j3d.loaders.IncorrectFormatException;
import?com.sun.j3d.loaders.Scene;
import?java.io.*;
下面這段代碼就是用來調(diào)用外部OBJ文件的,
TransformGroup trans = new TransformGroup ();
trans.setCapability(trans.ALLOW_TRANSFORM_READ);
trans.setCapability(trans.ALLOW_TRANSFORM_WRITE);
int flags = ObjectFile.RESIZE;
ObjectFile f = new ObjectFile(flags, (float) (49.0 * Math.PI / 180.0));
Scene s = null;
try {
??s = f.load("galleon.obj");?// 讀出obj文件在工程目錄下
}
然后再把它加到場景中去,
trans.addChild(s.getSceneGroup());
Scene1.addChild(trans);
4.3.2 物體轉(zhuǎn)動
要使galleon轉(zhuǎn)動學(xué)要用到interpolator?behaviors,它繼承了Behavior類。轉(zhuǎn)動的類是
RotationInterpolato。
Alpha spinAlpha = new Alpha (-1, 4000);
spinAlpha.setCapability (Alpha.DECREASING_ENABLE);
spinAlpha.setCapability (Alpha.INCREASING_ENABLE);
spinner =
????new RotationInterpolator(spinAlpha, trans);
spinner.setEnable(false);
spinner.setSchedulingBounds?(
???????new BoundingSphere (new Point3d(), 1000.0));
trans.addChild (spinner);
這樣就使得galleon.obj的帆船在場景中轉(zhuǎn)動了。
?
圖9物體轉(zhuǎn)動效果圖
4.3.3場景的移動
1.鼠標(biāo)交互移動
主要實現(xiàn)了“行走模式”和“視檢模式”兩種模式,具體方式可用Java3D封裝的WalkViewerBehavior以及ExamineViewerBehavior兩個類來實現(xiàn),這兩個類都是對ViewerBehavior類的繼承。
examineBehavior = new ExamineViewerBehavior(
exampleSceneTransform,
exampleFrame); ???????
examineBehavior.setSchedulingBounds (allBounds);
sceneRoot.addChild (examineBehavior);
walkBehavior = new WalkViewerBehavior(
exampleViewTransform,
exampleFrame );
walkBehavior.setSchedulingBounds (allBounds);
sceneRoot.addChild (walkBehavior);
2.場景的自動移動
在這個小場景中,使用了PositionInterpolator類來實現(xiàn)場景位置的前后來回自動移動,
TransformGroup vpTrans =
???universe.getViewingPlatform().getViewPlatformTransform();?//這條語句是讓操作對整個場景的,而不是某個物體
Transform3D axisOfTranslation = new Transform3D ();
Alpha transAlpha = new Alpha (-1,
?????????????????????????????Alpha.INCREASING_ENABLE |
?????????????????????????????Alpha.DECREASING_ENABLE,
?????????????????????????????0, 0,
?????????????????????????????5000, 0, 0,
?????????????????????????????5000, 0, 0);
axisOfTranslation.rotY(-Math.PI/2.0);?// 延X軸平移
translator = new PositionInterpolator(transAlpha,
????????????????????????????????vpTrans,
????????????????????????????????axisOfTranslation,
????????????????????????????????-4.0f, 20.5f);?// 起始位置,中止位置
translator.setSchedulingBounds(bounds);
translator.setEnable(false);
objScale.addChild(translator);
Scene1.addChild (objScale);
這樣場景就可以自動從-4.0到20.5的位置移動了。
§4.4 背景變換
4.4.1 創(chuàng)建燈光
在這個場景中創(chuàng)建了強弱不同的兩組Ambient光,照射方向不同的兩組Directional光,分別為紅色和黃色,以及一組橙色的Point光。
1.創(chuàng)建一個環(huán)境光:
AmbientLight?ambient = new AmbientLight( );??// 光的類型為AmbientLight
????ambient.setEnable (ambientOnOff);??// 根據(jù)ambientOnOff的值設(shè)置為true或
false
????ambient.setColor (new Color3f (0.3f, 0.3f, 0.3f));??// 光的顏色
????ambient.setCapability (AmbientLight.ALLOW_STATE_WRITE);
????ambient.setInfluencingBounds (worldBounds);
Scene1.addChild (ambient);??// 加到場景中
設(shè)置包圍球:
BoundingSphere worldBounds = new BoundingSphere (
????????new Point3d ( ), 1000.0);
myLight.setInfluencingBounds (myBounds);
運行結(jié)果如下:
?
圖10無燈光效果的場景
?
圖11加入AmbientLight效果的場景
2.創(chuàng)建PointLight
PointLight orangePoint = new PointLight ( );
????orangePoint.setEnable (orangePointOnOff);
????orangePoint.setColor (new Color3f (1.0f, 0.5f, 0.0f));?/ / 同樣為光的顏色,橙色
????orangePoint.setPosition (new Point3f (0.0f, 0.5f, 0.0f));?/ / 設(shè)置光的位置
????orangePoint.setCapability (AmbientLight.ALLOW_STATE_WRITE);
????orangePoint.setInfluencingBounds (worldBounds);
Scene1.addChild (orangePoint);
運行結(jié)果如下:
?
圖12加入PointLight效果的場景
3.創(chuàng)建一個DirectionalLight:
DirectionalLight?redDirectional = new DirectionalLight ( );
????redDirectional.setEnable (redDirectionalOnOff);
????redDirectional.setColor (new Color3f (1.0f, 0.0f, 0.0f));
????redDirectional.setDirection (new Vector3f (1.0f, -0.5f, -0.5f));
????redDirectional.setCapability (AmbientLight.ALLOW_STATE_WRITE);
????redDirectional.setInfluencingBounds (worldBounds);
Scene1.addChild (redDirectional);
執(zhí)行結(jié)果如下:
?
圖13加入DirectionalLight效果的場景
4.4.2 創(chuàng)建背景圖片
????????這里的背景圖片實際上就是一張640×480的jpg圖片,所以就是么把2D圖片讀到場景中。為了同時實現(xiàn)交互式更換背景圖片,這里也加入了菜單。
????????讀入2D圖片要用到ImageComponent2D和TextureLoader兩個類。其中ImageComponent2D用于定義一個二維組件,TextureLoader則是讀取ImageComponent2D定義的二維組件。
// 預(yù)載背景圖片
// 使用TextureLoader讀圖片
// 將要讀取的圖片裝入ImageComponent2D[ ]中
if ( debug ) System.err.println( " ?background images..." );
??????????TextureLoader texLoader = null;
??????????String value = null;
??????????imageComponents = new ImageComponent2D[images.length];
??????????for ( int i = 0; i < images.length; i++ )
??????????{
??????????????????value = (String)images[i].value;
??????????????????if ( value == null )
??????????????????{
??????????????????????????imageComponents[i] = null;
??????????????????????????continue;
??????????????????}
??????????????????texLoader = new TextureLoader( value, this );
??????????????????imageComponents[i] = texLoader.getImage( );
??????????}
?
圖14紋理背景--白云
4.4.3 指數(shù)霧
用ExponentialFog可以產(chǎn)生霧的效果
霧的密度通過指數(shù)控制厚度:
effect = e(-density * distance)?
color = effect * shapeColor + (1-effect) * fogColor
下面是場景中對霧的初始化
// 設(shè)置霧的顏色、密度和范圍
fog = new ExponentialFog();
????fog.setColor(color);
????fog.setDensity(density);
????fog.setCapability(Fog.ALLOW_COLOR_WRITE);
????fog.setCapability(ExponentialFog.ALLOW_DENSITY_WRITE);
????fog.setInfluencingBounds(worldBounds);
????Scene1.addChild (fog);
?
圖15各種不同的霧效果
?
4.4.4 背景音樂
在場景中加入背景音樂可以是氣氛更加活躍。
首先要把音樂加入到背景中,
if ( debug ) System.err.println( " sounds..." );
String path = getCurrentDirectory( );
MediaContainer backgroundMedia ?= new MediaContainer(
??path + "canon.wav" );
backgroundMedia.setCacheEnable( true );
然后對背景音樂初始化,
backgroundSound = new BackgroundSound( );
backgroundSound.setEnable( true );
backgroundSound.setLoop( Sound.INFINITE_LOOPS );?// 設(shè)置音樂循環(huán)播放
backgroundSound.setSoundData( backgroundMedia );
backgroundSound.setInitialGain( 1.0f );?// 設(shè)置音量
backgroundSound.setSchedulingBounds( worldBounds );
backgroundSound.setCapability( Sound.ALLOW_ENABLE_WRITE );
backgroundSound.setCapability( Sound.ALLOW_INITIAL_GAIN_WRITE );
backgroundSound.setCapability( Sound.ALLOW_PAUSE_WRITE);
backgroundSound.setCapability( Sound.ALLOW_PAUSE_READ);
Scene1.addChild( backgroundSound );
§4.5 在網(wǎng)頁上顯示3D圖形
Java3D一個最大的特性是可以使用Applet作為顯示容器,
<HTML>
<BODY>
<APPLET code= ExExponentialFog.class width=400 height=400>
</APPLET>
</BODY>
</HTML>
第五章 實踐和展望
§5.1 ?Web3D技術(shù)發(fā)展前景????????
????????雖然,Web3D技術(shù)將有好的發(fā)展前景,但仍然不可樂觀,它面臨下述問題:
????????網(wǎng)絡(luò)帶寬仍然是Web3D主要瓶頸:當(dāng)前處理器的速度與網(wǎng)絡(luò)的帶寬只能初步滿足Web3D圖形聯(lián)機操作的要求,隨著 Cable modems 和 DSL 連接的應(yīng)用,網(wǎng)絡(luò)帶寬將有更大的改進,當(dāng)一個10MB左右的Web3D模型文件只需要幾秒鐘下載時,Web3D圖形的質(zhì)量將有很大的改善,而現(xiàn)在的帶寬還不能滿足要求。Flash作為2D動畫在互聯(lián)網(wǎng)上的成功的關(guān)鍵是只有唯一的技術(shù)和標(biāo)準(zhǔn)?,F(xiàn)在的Web3D圖形是有幾十種可供選擇的技術(shù)和解決方案,多種文件格式和渲染引擎的存在是Web3D圖形在互聯(lián)網(wǎng)上應(yīng)用的最大障礙,而這種局面在今后若干年還將存在。從現(xiàn)在的發(fā)展態(tài)勢來看,有幾種技術(shù)可能在未來有一定的優(yōu)勢:
????X3D:由Web 3D Consortium制定,得到大學(xué),政府機構(gòu)及一些Web3D圖形公司的支持,由于它是VRML97下一代新的國際標(biāo)準(zhǔn),有比較廣泛的社會基礎(chǔ)。
????????Pulse3D:在游戲娛樂領(lǐng)域內(nèi)領(lǐng)先,使用它的技術(shù)的游戲網(wǎng)站有100多個,它得到Discreet 和Entertaindom公司的資金支持,現(xiàn)在它正在把游戲領(lǐng)域的技術(shù)優(yōu)勢應(yīng)用到e-commerce。它的插件支持QuickTime 5 and RealPlayer。
????????Viewpoint:前身是MetaCreations(3D圖形應(yīng)用軟件開發(fā)商),它賣掉了所有的其他軟件產(chǎn)品,改名為Viewpoint,專們從事Web3D圖形技術(shù)。其渲染引擎的模塊化結(jié)構(gòu)極易擴充,并且能與QTVR-, iPix-, and XML-等標(biāo)準(zhǔn)集成。它的目標(biāo)是e-commerce。它的技術(shù)的最大特色是與XML集成。
????????Cult3D:開發(fā)了e-commerce的全套解決方案,已經(jīng)有450 e-commerce網(wǎng)站使用了 Cult3D技術(shù),近10000個商業(yè)模型,它也在向娛樂領(lǐng)域擴充,提供全面解決方案,提供最穩(wěn)定可靠的渲染引擎。
????????Shockwave3D: 這是Macromedia公司Flash插件,有著極為廣大的用戶群,更引人注目的是Intel把它的Web3D 圖形集成到Shockwave。IntelWeb3D圖形極具特色:動態(tài)調(diào)節(jié)3D內(nèi)容的分辨率,曲面光滑技術(shù),照片級逼真材質(zhì)及各種特色效應(yīng)。
????????在今年的SIGGRAPH 2002世界計算機圖形會議上, Intel宣布建立 Web3D/CAD工作組, 其主要目標(biāo)是:建立一個統(tǒng)一的,開放的文件格式,用于在Web上顯示實時的3D圖形。與此同時Web3D Consortium在SIGGRAPH 2002會議上了發(fā)布X3D最終工作草案。X3D是一個成熟的標(biāo)準(zhǔn),是VRML的下一代標(biāo)準(zhǔn),但是Intel完全沒有提到它,如果Intel重新制定另外一個新標(biāo)準(zhǔn),X3D的將面臨尷尬,就Intel公司的實力和威望,X3D很難成為真正的國際標(biāo)準(zhǔn)。Intel公司很可能將左右新標(biāo)準(zhǔn)的制定與推行。
?? 預(yù)測未來誰是最后的勝利者是困難的,也許很長一段時間內(nèi)將是多種技術(shù)同時共存而又相互競爭。而Intel和微軟都具有左右Web3D發(fā)展前景的實力。
§5.2 論文總結(jié)
????????首先,要感謝鄭坤老師給我這次在武漢中地數(shù)碼公司學(xué)習(xí),實習(xí)機會,中地公司舒適的工作環(huán)境,良好的學(xué)習(xí)環(huán)境,團結(jié)協(xié)作的作風(fēng),不懈努力的進取精神給我很大的啟發(fā),并留下了深刻的映像。感謝鄭老師、黃秋龍師兄的熱心指導(dǎo)和幫助,使我能夠順利地完成畢業(yè)設(shè)計。
????????本次的畢業(yè)設(shè)計就是不斷學(xué)習(xí)的過程。本人初次基礎(chǔ)Java3D這種全新的3D開發(fā)工具,在編程方面,不斷的接觸、認(rèn)識、克服了一些以前從未遇到的問題。在畢業(yè)設(shè)計的開始階段了解了Java語言及JBuilderX等編譯器,因此花費較多時間。
????在這次畢業(yè)設(shè)計中對Java3D有了較好的理解并在一個場景中實現(xiàn)了其中絕大多的功能。但也有很多不足之處只得更進一步學(xué)習(xí),比如Vrml97文件的導(dǎo)入,利用Billboard類實現(xiàn)向場景中加入樹等。
在一個瞬息萬變的變革時代,在一個新技術(shù)層出無窮的年代,每一個學(xué)科都在新的坐標(biāo)系中尋找自己新的定位。如何處理傳統(tǒng)與現(xiàn)代、科學(xué)與技術(shù)、理論與實踐等諸多矛盾,尋求一個學(xué)科發(fā)展正確的概念模式,對傳統(tǒng)學(xué)科尤其顯得重要而緊迫。本文對現(xiàn)時由于技術(shù)的進步對Web3D所產(chǎn)生的影響進行了遠(yuǎn)不算成熟的思考。不論是從科學(xué)、技術(shù)還是社會的角度,Web3D處在一個蓬勃發(fā)展的階段,值得我們不倦地追求并為之努力奮斗。
參考文獻
- 作者,刊物名稱,年,卷(期),頁。
?????????(宋體,英文均為Times New Roman,小四)
2)作者,“書名”,出版社(出版地),出版年。
關(guān)注博主下篇更精彩
一鍵三連?。?!
一鍵三連?。?!
一鍵三連?。。?/strong>
感謝一鍵三連?。?!
文章來源:http://www.zghlxwxcb.cn/news/detail-758869.html
?
到了這里,關(guān)于基于Java3D的網(wǎng)絡(luò)三維技術(shù)的設(shè)計與實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!