魯亞飛,王正方
(1.中國科學(xué)院沈陽自動化研究所 工業(yè)信息學(xué)實(shí)驗(yàn)室,遼寧 沈陽110016;2.中國科學(xué)院研究生院,北京100049)
電子商城作為一種網(wǎng)上商品交易平臺為廣大消費(fèi)者帶來了便利,網(wǎng)上購物已經(jīng)被很多消費(fèi)者所接受,尤其是新崛起的年輕一代消費(fèi)群體,甚至成為其主要的消費(fèi)方式。然而其單一、有限的展示方式卻難以向消費(fèi)者傳遞豐富的商品信息,且與現(xiàn)實(shí)購物相比,現(xiàn)有的電子商城,不能滿足消費(fèi)者較高的購物體驗(yàn)與要求。為了使企業(yè)的品牌形象或產(chǎn)品形象獲得更生動的展現(xiàn),進(jìn)而增強(qiáng)消費(fèi)者的購物體驗(yàn)、提高其對商品的認(rèn)知程度,三維動態(tài)交互立體商城便應(yīng)運(yùn)而生。盡管目前國內(nèi)外已經(jīng)有幾家3D網(wǎng)上商城,但由于其功能不夠完善,執(zhí)行效率較低,用戶較少,所以難以推廣。而虛擬現(xiàn)實(shí)引擎作為3D網(wǎng)上商城開發(fā)的基礎(chǔ),是決定3D網(wǎng)上商城性能的重要因素,為了緩解當(dāng)前3D網(wǎng)上商城面臨的問題,并使其變得更具吸引力、影響力和生命力,設(shè)計(jì)實(shí)現(xiàn)了面向電子商城的虛擬現(xiàn)實(shí)引擎,以此作為三維動態(tài)交互立體商城的核心部件。文章結(jié)合虛擬現(xiàn)實(shí)引擎的開發(fā)過程,深入探討了三維動態(tài)交互立體商城開發(fā)平臺中所應(yīng)用到的幾項(xiàng)關(guān)鍵技術(shù)——3ds模型導(dǎo)入、基于復(fù)合層次樹的場景管理、AABB和Capsule包圍盒相結(jié)合的碰撞檢測、實(shí)時渲染等的實(shí)現(xiàn)方法。
根據(jù)引擎開發(fā)過程中應(yīng)用程序?qū)ο鄳?yīng)數(shù)據(jù)信息的處理過程,把整個引擎分為兩部分:接口部分和核心部分,如圖1所示,這兩部分是上下層的關(guān)系,即通過接口部分輸入的數(shù)據(jù)信息,需要通過核心部分的處理,才能實(shí)現(xiàn)三維動態(tài)交互式立體商城應(yīng)有的效果和功能。其中LWJGL(lightweight java game library)為開發(fā)提供了簡單易用的API,這些API用來訪問OpenGL(open graphics library),實(shí)現(xiàn)場景、物體模型的實(shí)時重繪、渲染以及人機(jī)交互的實(shí)時控制。
虛擬現(xiàn)實(shí)引擎以開源軟件Eclipse為開發(fā)平臺,以LWJGL為底層API,根據(jù)三維動態(tài)交互式立體商城應(yīng)具有的功能,運(yùn)用Java相關(guān)知識構(gòu)建開發(fā)應(yīng)用程序。
圖1 系統(tǒng)架構(gòu)
(1)輸入模塊:把現(xiàn)有的三維動態(tài)交互立體商城的3D模型(用三維動畫渲染和制作軟件創(chuàng)建的三維模型)及相關(guān)的資源信息加載到程序中,且對它們進(jìn)行統(tǒng)一管理以便在創(chuàng)建立體商城的過程中使用;同時該模塊也接收通過鼠標(biāo)、鍵盤輸入的信息。
(2)場景管理實(shí)現(xiàn)模塊:基于BSP(binary space partitioning)樹[1]和場景圖(scene graph)兩種場景管理方法,提出設(shè)計(jì)了復(fù)合層次樹法來構(gòu)建場景樹,以此實(shí)現(xiàn)對商城場景中所有對象的統(tǒng)一組織和管理。
(3)碰撞檢測實(shí)現(xiàn)模塊:通過計(jì)算要檢測物體對象外面添加的包圍盒的相交情況,判斷兩個物體對象之間是否發(fā)生碰撞。該模塊的實(shí)現(xiàn)可以使顯示到屏幕上的場景更加真實(shí)、自然。
(4)實(shí)時渲染實(shí)現(xiàn)模塊:利用視錐(view frustum)、渲染隊(duì)列和Z-Order,有效的實(shí)現(xiàn)商城中場景及場景中各個物體的實(shí)時渲染,以使商城場景及其中的物體達(dá)到逼真的可視化效果。
LWJGL提供了訪問OpenGL的API,在繪制立體商城中的模型和場景時使用。盡管OpenGL是高性能圖形和交互性場景處理的行業(yè)標(biāo)準(zhǔn)[2],但它沒有提供建立三維模型的高級命令,而是通過點(diǎn)、線及多邊形等基本的幾何圖元來建立三維模型的[3]。因此,要利用LWJGL的API直接進(jìn)行復(fù)雜物體的建模是不太現(xiàn)實(shí)的。而專業(yè)建模軟件如3DSMAX,可以較方便的建立三維模型,但是難以對建立的模型進(jìn)行控制。所以,綜合OpenGL和用于建立3D模型的軟件的優(yōu)勢,首先采用常用的3D建模軟件3DSMAX建立立體商城的模型,然后在Eclipse開發(fā)環(huán)境下讀取立體商城模型的數(shù)據(jù)信息,并對其進(jìn)行相應(yīng)的控制操作,最后在LWJGL的基礎(chǔ)上進(jìn)行繪制、渲染。該設(shè)計(jì)不僅可以借助3DSMAX建模軟件的優(yōu)勢,降低建立立體商城模型的時間,減少代碼量;而且以LWJGL作為底層API實(shí)現(xiàn)對立體商城模型的實(shí)時重繪和人機(jī)的交互控制,可以降低程序的復(fù)雜度,提高虛擬現(xiàn)實(shí)引擎的開發(fā)速度。
3ds模型文件的基本組成單位是塊,且塊層次結(jié)構(gòu)非常復(fù)雜。其中,塊包括塊頭和主體內(nèi)容兩部分,主體內(nèi)容是塊的數(shù)據(jù)信息,塊頭又分為塊ID和長度,塊ID表明該塊中包含了哪類信息,如ID為0x4110表示該塊包含了對象中的頂點(diǎn)信息,ID為0x4120表示該塊包含了對象中的三角面信息。在整個立體商城模型中,由于塊中的信息不包含對象模型在整個立體商城模型中的位置,因此,在構(gòu)建立體商城模型時,用數(shù)字來表示每個對象模型在其中的位置順序。
由于立體商城的3ds模型結(jié)構(gòu)復(fù)雜、數(shù)據(jù)量大,所以為了降低開發(fā)過程中應(yīng)用程序的復(fù)雜度,且保證讀取數(shù)據(jù)的準(zhǔn)確率,該虛擬現(xiàn)實(shí)引擎對模型文件實(shí)行了兩次轉(zhuǎn)化處理,完成了3ds模型的導(dǎo)入,導(dǎo)入過程如圖2所示。
圖2 3ds模型的導(dǎo)入過程
(1)3ds模型文件轉(zhuǎn)化為二進(jìn)制文件。
以某純電動汽車為研究對象,以傳統(tǒng)汽車設(shè)計(jì)思路為基礎(chǔ),根據(jù)設(shè)計(jì)目標(biāo)確定了動力系統(tǒng)的相關(guān)參數(shù)。介紹了動力性系統(tǒng)參數(shù)的相關(guān)計(jì)算要求,確定了各個部件參數(shù)。在設(shè)計(jì)邏輯門限控制策略以及雙向DC/DC轉(zhuǎn)換器的基礎(chǔ)上,搭建了純電動汽車動力系統(tǒng)各組成部分的數(shù)學(xué)模型。在ADVISOR環(huán)境下對某純電動的車動力系統(tǒng)進(jìn)行了仿真,仿真結(jié)果驗(yàn)證了設(shè)計(jì)方案的各項(xiàng)指標(biāo)的合理性。結(jié)果也表明電機(jī)在較高工作效率區(qū)間工作且電池具有良好的充放電特性。為純電動汽車動力性能設(shè)計(jì)提供了一種高效可行的方法。
根據(jù)3ds模型文件的結(jié)構(gòu)特點(diǎn),以3dsToBin類為主導(dǎo),通過T3dsFile類以及其它輔助類中的數(shù)據(jù)處理方法讀取模型的每個塊,并根據(jù)其塊頭ID判斷塊中所包含的是哪類信息,然后以二進(jìn)制緩存數(shù)組為中介把3ds模型文件中的數(shù)據(jù)信息儲存到二進(jìn)制文件中,相關(guān)的數(shù)據(jù)信息之間通過索引數(shù)組相關(guān)聯(lián)。
(2)二進(jìn)制文件轉(zhuǎn)化為場景樹的幾何節(jié)點(diǎn)。
幾何節(jié)點(diǎn)所包含的對象是立體商城中的實(shí)體對象,其中包含該對象的頂點(diǎn)、法向量、紋理、顏色信息及標(biāo)識其在場景中位置順序的數(shù)字,這些信息均存儲在緩存中,且每個頂點(diǎn)通過數(shù)組列表與其對應(yīng)的紋理相關(guān)聯(lián)。以二進(jìn)制文件為參數(shù)把模型數(shù)據(jù)加載到引擎中,并根據(jù)幾何節(jié)點(diǎn)對象相關(guān)信息的存儲方式進(jìn)行存儲,之后將根據(jù)所有幾何節(jié)點(diǎn)對象信息構(gòu)建場景樹。
目前三維游戲中常用的場景管理方法有BSP樹、八叉樹(Oct-Tree)、場景圖等。其中BSP樹法主要應(yīng)用于室內(nèi)場景的管理,八叉樹法主要適用于室外場景中靜態(tài)物體的管理,而場景圖則是能有效的管理動態(tài)室外場景中的物體的方法,由此可見不同管理方法的應(yīng)用場合不同。然而合理的場景管理,能夠從一定程度上提高虛擬現(xiàn)實(shí)引擎的渲染效率。由于要建立的三維動態(tài)交互立體商城為室內(nèi)場景,且只有商品模型和人物模型可以移動。因此,文章根據(jù)面向三維動態(tài)交互立體商城特點(diǎn),并結(jié)合BSP樹和場景圖的優(yōu)點(diǎn),在虛擬現(xiàn)實(shí)引擎的開發(fā)過程中設(shè)計(jì)實(shí)現(xiàn)了一種構(gòu)建場景樹的新方法——復(fù)合層次樹法。
該復(fù)合層次樹法的主要特點(diǎn)為:①將立體商城中的靜態(tài)對象按照BSP樹管理方法添加到場景樹中,以避免單一使用場景圖方法時出現(xiàn)冗余的控制節(jié)點(diǎn);②為立體商城中的動態(tài)對象創(chuàng)建相應(yīng)控制節(jié)點(diǎn),并以場景圖方法添加到場景樹中,據(jù)此可以有效控制商城中店鋪內(nèi)外的動態(tài)物體,增強(qiáng)立體商城的真實(shí)感。
按照復(fù)合層次樹法構(gòu)建場景樹的流程如圖3所示,其中,選擇分割面的原則是以走廊和店鋪或店鋪與店鋪的交界面為主,且盡量保持樹的平衡性。
圖3 場景樹的構(gòu)造流程
根據(jù)以上方法構(gòu)造的場景樹簡圖,如圖4所示。
場景樹是根據(jù)三維動態(tài)交互立體商城中場景和模型的空間位置關(guān)系來構(gòu)建的,其不僅包含與場景和模型相關(guān)的位置坐標(biāo)、紋理、渲染狀態(tài)等靜態(tài)屬性信息,而且還含有它們所用到的動態(tài)操作方法,其中最主要的是:①場景數(shù)據(jù)改變時的更新方法,實(shí)現(xiàn)了人物或商品模型的移動、旋轉(zhuǎn)及大小的改變。②更新包圍盒的方法,用來調(diào)整人物或商品模型的包圍盒大小或位置。兩種方法相互配合,不僅可以加快引擎的執(zhí)行速度,而且可以提高碰撞檢測和渲染的精確度。
圖4 場景樹
人物模型在三維動態(tài)交互立體商城中走動觀看的時候,應(yīng)避免人物沿著墻壁走上去或從障礙物中穿過等不符合自然現(xiàn)象的情況出現(xiàn)。為此設(shè)計(jì)并實(shí)現(xiàn)了AABB和Capsule包圍盒相結(jié)合的碰撞檢測方法。即在構(gòu)建的場景樹中,為所有靜止的場景、商品架及商品模型添加AABB,為移動的人物模型添加Capsule包圍盒。之后通過判斷兩個測試對象外包圍盒的相交情況來確定人物模型是否與另一個對象模型發(fā)生碰撞。若發(fā)生碰撞,則通過更新場景數(shù)據(jù)的方法改變?nèi)宋锬P偷囊苿臃较颍瑫r需要通過更新包圍盒的方法對其包圍盒的位置方向做相應(yīng)調(diào)整;否則,人物模型將繼續(xù)前行,并隨之調(diào)整其包圍盒的位置。具體的實(shí)現(xiàn)過程如圖5所示。
虛擬現(xiàn)實(shí)引擎的最終目的是把現(xiàn)有的3D模型經(jīng)過處理后,渲染并投影到2D屏幕上。為此,先定義實(shí)現(xiàn)了幾個主要功能:①創(chuàng)建視錐模型實(shí)現(xiàn)對渲染空間的剪裁;根據(jù)給定的位置、方向和視口設(shè)置等,計(jì)算出與渲染對象相關(guān)的數(shù)據(jù)信息。②通過視變換[1]把渲染對象從世界空間轉(zhuǎn)變到攝像機(jī)空間,然后再進(jìn)行投影變換[1]把攝像機(jī)空間中的對象轉(zhuǎn)變到屏幕空間。③為渲染隊(duì)列定義空間對象列表。④在渲染之前根據(jù)要渲染對象的透明程度,把場景元素分為透明、不透明以及正常顏色隊(duì)列,然后對正常顏色隊(duì)列中的對象用Z-Order方法進(jìn)行渲染順序排列操作,以避免渲染后出現(xiàn)不正常的遮擋現(xiàn)象。
在上述功能的基礎(chǔ)上實(shí)現(xiàn)引擎實(shí)時渲染的具體步驟如下:
圖5 碰撞檢測流程
(1)調(diào)用LWJGLRenderer類中的draw(Spatial s)方法。即通過調(diào)用Spatial類中的onDraw(LWJGLRenderer r)方法確定要渲染的場景或模型。
(2)判斷要渲染的場景或模型是否可見。首先獲得要渲染對象的剪裁屬性(Always、Dynamic、Inherit或Never);然后創(chuàng)建攝像機(jī)類對象,獲取其視錐模型當(dāng)前面的狀態(tài),并通過frustrumIntersects(用來表示視錐與面的相交情況)屬性判斷是否對該對象進(jìn)行剪裁操作;最后重新設(shè)置視錐模型當(dāng)前面的狀態(tài)。
(3)如果可見,調(diào)用該場景或模型的draw方法。
(4)如果要渲染的為TriMesh類對象,則把這些數(shù)據(jù)渲染到2D屏幕,該功能由draw(TriMesh tris)方法實(shí)現(xiàn)。其中TriMesh類是通過點(diǎn)、顏色、法向量和紋理的集合定義了一個3D對象的網(wǎng)狀形式。
在虛擬現(xiàn)實(shí)引擎開發(fā)過程中,通過對3ds模型文件的格式轉(zhuǎn)換,將三維動態(tài)交互立體商城的模型數(shù)據(jù)加載到引擎中,不僅彌補(bǔ)了利用LWJGL的API不能創(chuàng)建復(fù)雜場景的缺陷,而且通過專業(yè)建模軟件3DSMAX構(gòu)建立體商城模型,也避免了通過大量程序代碼創(chuàng)建相關(guān)模型的繁瑣過程,從而減少了代碼量,簡化了虛擬現(xiàn)實(shí)引擎的開發(fā)過程,因此加快了虛擬現(xiàn)實(shí)引擎的開發(fā)速度。由于本文提出的復(fù)合層次樹構(gòu)建方法,僅僅是對可移動模型添加了相應(yīng)控制節(jié)點(diǎn),所以在控制過程中將不需要考慮可移動模型節(jié)點(diǎn)是否繼承父節(jié)點(diǎn)中的控制操作,簡化了場景管理中控制操作的實(shí)現(xiàn)過程。
根據(jù)三維動態(tài)立體交互商城中場景、商品和人物模型的特點(diǎn),采用AABB和Capsule包圍盒相結(jié)合的方法,實(shí)現(xiàn)了非物理性的碰撞檢測,在此情況下僅需計(jì)算結(jié)構(gòu)簡單的外包圍盒的相交情況,便可以判斷是否發(fā)生了碰撞,而不需要根據(jù)復(fù)雜的模型結(jié)構(gòu)數(shù)據(jù)信息進(jìn)行碰撞檢測,從而減少了計(jì)算量,提高了碰撞檢測的執(zhí)行效率。視錐、渲染隊(duì)列和Z-Order相結(jié)合實(shí)現(xiàn)的實(shí)時渲染技術(shù),不僅減少了送入渲染通道中的場景模型數(shù)量,而且給定了合理的渲染順序,其提高了渲染速度、增強(qiáng)了渲染效果的真實(shí)性。經(jīng)該引擎處理后的模型顯示效果如圖6所示。
圖6 模型效果
實(shí)驗(yàn)證明,在虛擬現(xiàn)實(shí)引擎的實(shí)現(xiàn)過程中采用的這些關(guān)鍵技術(shù),不僅可以從一定程度上減少開發(fā)時的工作量,節(jié)約了開發(fā)時間,而且還提高引擎的執(zhí)行效率,增強(qiáng)了其實(shí)用性及準(zhǔn)確性。
本文提出的復(fù)合層次樹場景管理方法,降低了虛擬現(xiàn)實(shí)引擎執(zhí)行過程中對物體模型實(shí)施控制操作的復(fù)雜度;而且利用AABB和Capsule包圍盒相結(jié)合實(shí)現(xiàn)的碰撞檢測方法,提高了人物模型參與碰撞檢測時的精確度。與常用方法相比,文中設(shè)計(jì)實(shí)現(xiàn)的這兩種方法比較適用于面向三維動態(tài)立體交互商城的虛擬現(xiàn)實(shí)引擎的開發(fā)。文章介紹的模型導(dǎo)入、場景管理、碰撞檢測及實(shí)時渲染關(guān)鍵技術(shù)的實(shí)現(xiàn)方法,在虛擬現(xiàn)實(shí)引擎開發(fā)中得到了深入應(yīng)用,這些技術(shù)在面向三維動態(tài)立體交互商城的虛擬現(xiàn)實(shí)引擎開發(fā)中具有通用性,且提高了虛擬現(xiàn)實(shí)引擎的開發(fā)效率。在今后的工作中,可進(jìn)一步探索骨骼動畫技術(shù),使虛擬現(xiàn)實(shí)引擎的功能更完善,更具有通用性。
[1]Fletch Dunn,Ian Parberry.3Dmath primer for graphics and game development[M].SHI Yinxue,CHEN Hong,WANG Rongjing,transl.Beijing:Tsinghua University Press,2010:85-368(in Chinese).[Fletch Dunn,Ian Parberry.3D數(shù)學(xué)基礎(chǔ):圖形與游戲開發(fā)[M].史銀雪,陳洪,王榮靜,譯.北京:清華大學(xué)出版社,2010:85-368.]
[2]Dave Shreimer.The Khronos OpenGL ARB Working Group.OpenGL programming guide[M].7th ed.LI Jun,XU Bo,transl.Beijing:China Machine Press,2010:1-307(in Chinese).[Dave Shreimer.The Khronos OpenGL ARB Working Group.OpenGL編程指南[M].7版.李軍,徐波,譯.北京:機(jī)械工業(yè)出版社,2010:1-307.]
[3]ZHOU Feng,NI Junfang,ZENG Xianzheng,et al.Research on reading and redrawing of 3DS models based on OpenGL[J].Journal of Soochow University(Engineering Science Edition),2009,29(2):53-56(in Chinese).[周峰,倪俊芳,曾憲政,等.基于OpenGL對3DS模型的讀取與重繪的研究[J].蘇州大學(xué)學(xué)報(工科版),2009,29(2):53-56.]
[4]David H Eberly.3Dgame engine design:A practical approach to real-time computer graphics[M].2nd ed.Beijing:Posts & Telecom Press,2009:7-895(in Chinese).[David H.Eberly.3D游戲引擎設(shè)計(jì)實(shí)時計(jì)算機(jī)圖形學(xué)的應(yīng)用方法[M].2版.北京:人民郵電出版社,2009:7-895.]
[5]Christer Ericson.Real-time collision detection[M].LIU Tianhui,transl.Beijing:Tsinghua University Press,2010:49-162(in Chinese).[Christer Ericson.實(shí)時碰撞檢測算法技術(shù)[M].劉天慧,譯.北京:清華大學(xué)出版社,2010:49-162.]
[6]GAO Lina.Study on visibility culling in virtual reality engine[D].Nanjing:Nanjing University of Technology,2006:11-29(in Chinese).[高麗娜.虛擬現(xiàn)實(shí)引擎中可見性裁減問題的研究[D].南京:南京工業(yè)大學(xué),2006:11-29.]
[7]CHEN Kai.Design and implementation of 3Dgame engine[D].Hangzhou:Zhejiang University,2007:7-26(in Chinese).[陳凱.三維游戲引擎的設(shè)計(jì)與實(shí)現(xiàn)[D].杭州:浙江大學(xué),2007:7-26.]
[8]FAN Cui.Design of 3Dgame engine and implementation of key technologies[D].Xi’an:Northwestern Polytechnical University,2006:27-36(in Chinese).[樊翠.三維游戲引擎的設(shè)計(jì)及關(guān)鍵技術(shù)的實(shí)現(xiàn)[D].西安:西北工業(yè)大學(xué),2006:27-36.]
[9]GENG Weidong,CHEN Kai,LI Xin.Implementation of 3D game engine[M].Hangzhou:Zhejiang University Press,2008:8-47(in Chinese).[耿衛(wèi)東,陳凱,李鑫.三維游戲引擎設(shè)計(jì)與實(shí)現(xiàn)[M].杭州:浙江大學(xué)出版社,2008:8-47.]
[10]ZHANG Jing.Virtual reality technology and aapplication[M].Beijing:Tsinghua University Press,2011:1-66(in Chinese).[張菁.虛擬現(xiàn)實(shí)技術(shù)及應(yīng)用[M].北京:清華大學(xué)出版社,2011:1-66.]
[11]ZHOU Li,SU Honggen.Research on general file formats and algorithms of 3-D models and their implementation with Open-GL[J].Computer Engineering and Design,2009,30(2):433-434(in Chinese).[周莉,蘇鴻根.通用3D模型文件格式和算法的研究及其OpenGL實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(2):433-434.]
[12]Andrew Davision.JavaTM6 3Dgame development Java 3DTM,JOGL,Jinput,and JOAL APIs[M].the United States of America:Apress Inc,2007:3-200.