劉賢梅,石 楊,趙 婭,林 琳
(東北石油大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院,黑龍江 大慶 163318)
虛擬現(xiàn)實(shí)技術(shù)能夠利用計(jì)算機(jī)生成較為真實(shí)的模擬環(huán)境,使用戶沉浸在虛擬環(huán)境中,并通過(guò)人機(jī)接口,實(shí)現(xiàn)用戶與虛擬環(huán)境的交互[1]。由于目前家居設(shè)計(jì)行業(yè)的主要展示方式為二維效果圖,客戶只能通過(guò)靜態(tài)的方式觀看家居的格局與風(fēng)格,裝修效果往往不能使用戶滿意。
基于虛擬現(xiàn)實(shí)的室內(nèi)家居仿真操作系統(tǒng)能為室內(nèi)裝修提供一種新的思路。用戶可以直觀地看到三維仿真裝修效果[2],并且可以通過(guò)模擬真實(shí)人物行走的方式進(jìn)行場(chǎng)景漫游,按照喜好修改房屋的風(fēng)格,查看家具的價(jià)格、材質(zhì)等信息。在設(shè)計(jì)功能時(shí)會(huì)涉及到Biped骨骼關(guān)鍵幀技術(shù)、自動(dòng)尋路檢測(cè)算法、角色管理器調(diào)用、碰撞體檢測(cè)、射線檢測(cè)等技術(shù)手段。這一系統(tǒng)的實(shí)現(xiàn)能更大程度地實(shí)現(xiàn)用戶需求,同時(shí)也可以為房地產(chǎn)公司節(jié)省很多人力、物力資源。
Unity3D是由Unity Technologies開(kāi)發(fā)的一個(gè)能輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà)等類(lèi)型互動(dòng)內(nèi)容的多平臺(tái)綜合型游戲開(kāi)發(fā)工具,是一個(gè)全面整合的專(zhuān)業(yè)游戲引擎[3]。它功能異常強(qiáng)大,提供了各種API讓游戲開(kāi)發(fā)者通過(guò)給游戲?qū)ο筇砑咏M件以及編寫(xiě)腳本的方式實(shí)現(xiàn)各種游戲功能,如角色動(dòng)畫(huà)、碰撞檢測(cè)、播放音樂(lè)音效等。
該系統(tǒng)采用MVC(model-view-controller)分層設(shè)計(jì)的思想,系統(tǒng)從下到上依次為數(shù)據(jù)層、控制層、業(yè)務(wù)層、顯示層,以B/S結(jié)構(gòu)為基礎(chǔ),PC端用戶使用Oracle數(shù)據(jù)庫(kù),移動(dòng)端用戶使用SQLite數(shù)據(jù)庫(kù)對(duì)信息進(jìn)行存儲(chǔ)。控制層包括業(yè)務(wù)數(shù)據(jù)接口、邏輯控制層和數(shù)據(jù)網(wǎng)絡(luò)服務(wù)[4]。業(yè)務(wù)層包括前期準(zhǔn)備、場(chǎng)景功能以及交互功能。前期準(zhǔn)備包括模型設(shè)計(jì)、角色設(shè)計(jì)、家具及場(chǎng)景模型制作、角色模型及動(dòng)畫(huà)制作四個(gè)方面。場(chǎng)景功能包括實(shí)時(shí)漫游、場(chǎng)景截圖、場(chǎng)景切換、音樂(lè)切換、人物選擇和數(shù)據(jù)存儲(chǔ)功能六個(gè)方面。系統(tǒng)交互功能包括:家具刪除、更換家具風(fēng)格和家具信息展示三個(gè)方面。顯示層為PC端用戶和移動(dòng)端用戶,具體效果如圖1所示。
圖1 系統(tǒng)架構(gòu)
PC端用戶使用Oracle數(shù)據(jù)庫(kù)存儲(chǔ)信息。移動(dòng)端用戶使用SQLite數(shù)據(jù)庫(kù)存儲(chǔ)信息。場(chǎng)景信息的存儲(chǔ)包括以下八個(gè)方面:場(chǎng)景名稱(chēng)、家具名稱(chēng)、家具價(jià)格、家具貼圖、是否瀏覽、是否刪除、退出時(shí)相機(jī)的位置以及旋轉(zhuǎn)角信息等。圖片信息的存儲(chǔ)是將圖片保存在項(xiàng)目的路徑下,在數(shù)據(jù)庫(kù)中存儲(chǔ)圖片的相對(duì)路徑,對(duì)于圖片的調(diào)用則直接將Oracle數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的圖片路徑。場(chǎng)景截圖和材質(zhì)更換的圖片分別存放在ScreenShots文件夾和Tencent文件夾下,以實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和讀取。音樂(lè)信息的存儲(chǔ)是將音樂(lè)以二進(jìn)制流的形式存入數(shù)據(jù)庫(kù)中,然后存到Oracle的Blob的字段里[5]。
建立一個(gè)虛擬現(xiàn)實(shí)系統(tǒng)的關(guān)鍵問(wèn)題是對(duì)系統(tǒng)的建模與仿真。首先利用AutoCAD工具對(duì)場(chǎng)景和角色進(jìn)行平面設(shè)計(jì),然后按照設(shè)計(jì)草圖利用3D Max軟件中的布爾運(yùn)算以及網(wǎng)格建模實(shí)現(xiàn)家居模型以及虛擬角色模型的建造。具體如圖2所示。
圖2 系統(tǒng)仿真模型結(jié)構(gòu)
家居三維仿真模型的制作主要包含以下5類(lèi)房間:客廳、臥室、餐廳、廚房、衛(wèi)生間。每類(lèi)房間中包含了大量家具模型,其中家具模型需要先創(chuàng)建基礎(chǔ)模型,然后利用模型修改器對(duì)基礎(chǔ)模型的形狀進(jìn)行改變,配合布爾運(yùn)算以及二維圖型的放樣操作制作出家具模型,最終利用Multi/Sub-Object(即多維/子對(duì)象材質(zhì))貼圖,為不同ID賦予對(duì)應(yīng)的材質(zhì)[6]實(shí)現(xiàn)總體的家居三維仿真模型的建造。
虛擬角色會(huì)增加室內(nèi)瀏覽的真實(shí)感,此外,還可以通過(guò)自身高度和角色高度的比較,感受用戶置身于房間內(nèi)的視角。系統(tǒng)中角色的制作主要包含以下4方面:虛擬角色模型制作、UVW展開(kāi)貼圖、Biped骨骼匹配和基于關(guān)鍵幀技術(shù)的虛擬角色動(dòng)畫(huà)制作。首先,虛擬角色建模是利用底層三角面片建模,將面片頂點(diǎn)“焊接”形成光滑的曲面,增加模型的線條、調(diào)節(jié)頂點(diǎn)的位置。然后利用UVW貼圖坐標(biāo)將模型的所有面按照一定的順序分布到一張二維網(wǎng)格的圖片上,為對(duì)應(yīng)的網(wǎng)格賦予相應(yīng)的紋理即可實(shí)現(xiàn)一張完整的角色材質(zhì)圖[7]。接著利用基于H-Anim人體建模標(biāo)準(zhǔn),采用樹(shù)形結(jié)構(gòu)創(chuàng)建角色骨骼模型[8]。通過(guò)提取深度數(shù)據(jù)流中人體骨骼節(jié)點(diǎn)的坐標(biāo)數(shù)據(jù),Kinect可以實(shí)時(shí)地獲取預(yù)先定義的20個(gè)人體骨骼節(jié)點(diǎn)。為了能夠?qū)崟r(shí)地展示人體的運(yùn)動(dòng)過(guò)程,需要根據(jù)人體骨骼特征建立一個(gè)具有層次結(jié)構(gòu)的鉸接式虛擬角色模型,將骨骼按照人體的比例調(diào)整。利用蒙皮修改器將骨骼和模型綁定,調(diào)節(jié)角色每個(gè)骨骼關(guān)節(jié)所包含的面片數(shù)量和衰減區(qū)域即可完成模型和骨骼的匹配。最后利用關(guān)鍵幀技術(shù)實(shí)現(xiàn)場(chǎng)景中的角色動(dòng)畫(huà),即在不同位置插入關(guān)鍵幀并設(shè)置骨骼形狀,實(shí)現(xiàn)虛擬角色動(dòng)畫(huà)的制作。
圖3 3D Max中的角色制作效果
系統(tǒng)仿真模型最后利用Unity3D的模型導(dǎo)入接口,將3D Max文件導(dǎo)入到系統(tǒng)中,具體流程如下:首先在3D Max中制作并保存角色模型,常規(guī)的存儲(chǔ)模式為.3ds格式,但是此模式在Unity3D中不能正常識(shí)別,需要先將.3ds格式導(dǎo)出為.fbx格式進(jìn)行存儲(chǔ),然后在Unity3D工程項(xiàng)目中導(dǎo)入文件和貼圖,最終實(shí)現(xiàn)帶貼圖模型文件的生成,達(dá)到圖像實(shí)時(shí)動(dòng)態(tài)模型的顯示[9]。
軟件設(shè)計(jì)對(duì)室內(nèi)家居仿真操作系統(tǒng)的制作至關(guān)重要。軟件設(shè)計(jì)過(guò)程中,除了要實(shí)現(xiàn)系統(tǒng)的基本功能,還要考慮系統(tǒng)運(yùn)行的穩(wěn)定性、可靠性、高效性和實(shí)時(shí)性。具體的設(shè)計(jì)流程如圖4所示。
首先登錄系統(tǒng),打開(kāi)默認(rèn)的場(chǎng)景進(jìn)行室內(nèi)漫游,漫游方式可分為兩種:第一種是以第一人稱(chēng)視角瀏覽整個(gè)房間;第二種是角色調(diào)用,選擇角色后可模擬真實(shí)角色在場(chǎng)景中的行走狀態(tài),利用按鍵調(diào)用不同的角色動(dòng)畫(huà),如:行走、轉(zhuǎn)身、后退、上樓梯、跳躍等。漫游場(chǎng)景功能包括:燈光調(diào)節(jié)、音樂(lè)切換、鏡頭升降、鏡頭旋轉(zhuǎn)、鏡頭前進(jìn)和鏡頭后退,在瀏覽的同時(shí)進(jìn)行碰撞體檢測(cè),如果瀏覽過(guò)程中碰到家具無(wú)法前進(jìn),則會(huì)在一定時(shí)間內(nèi)進(jìn)行自動(dòng)尋路檢測(cè),重新調(diào)整到離用戶最近的、可行走的位置,提升仿真效果和漫游趣味性。在室內(nèi)展示系統(tǒng)中,用戶不只可以瀏覽固定的場(chǎng)景,還可以根據(jù)自己的喜好對(duì)模型場(chǎng)景進(jìn)行實(shí)際操作。其中包含顯示家具的價(jià)格信息、更換家具的材質(zhì)、家具的選擇與刪除、場(chǎng)景截圖等。用戶在刪除家具、更改家具風(fēng)格后可以利用場(chǎng)景截圖功能來(lái)記錄效果,系統(tǒng)中為截圖指定存儲(chǔ)的文件夾為ScreenShot、為圖片命名為sc_1…sc_n、規(guī)定截圖的尺寸,并將圖片的名稱(chēng)及物理路徑存儲(chǔ)到相應(yīng)數(shù)據(jù)庫(kù)中。最后在本場(chǎng)景瀏覽并操作完成后,用戶可以選擇切換到下一個(gè)場(chǎng)景或者完成操作并退出。
圖4 系統(tǒng)軟件設(shè)計(jì)流程
場(chǎng)景中設(shè)置了不同類(lèi)型的光源,如:點(diǎn)光源、線光源和平行光源等,實(shí)現(xiàn)了不同燈光照射下的陰影效果[10]。通過(guò)調(diào)節(jié)燈光的投影顏色、強(qiáng)度、間接照明、烘焙陰影、陰影貼圖、渲染模式等參數(shù),對(duì)比分析真實(shí)效果下的陰影實(shí)時(shí)渲染。并對(duì)比分析了各類(lèi)數(shù)據(jù),最終選擇逼真度最高的一組數(shù)據(jù)。具體對(duì)比分析效果圖如圖5所示。
圖5 燈光陰影對(duì)比效果
碰撞檢測(cè)是機(jī)器人、動(dòng)畫(huà)仿真、虛擬現(xiàn)實(shí)等領(lǐng)域中一個(gè)非常關(guān)鍵的問(wèn)題,其基本任務(wù)是確定兩個(gè)或多個(gè)物體彼此之間是否發(fā)生接觸或穿透。該系統(tǒng)中碰撞體檢測(cè)的目的是在相機(jī)或角色接觸到家具時(shí)不會(huì)穿透家具,并形成碰撞效果[11]。
Unity3D提供了碰撞檢測(cè)的API,需要給游戲?qū)ο筇砑优鲎财鰿ollider跟剛體Rigid body組件。碰撞器有各種形狀,如Box Collider、Sphere Collider、Mesh Collider等等,該系統(tǒng)根據(jù)家具的形狀來(lái)進(jìn)行選擇。其中剛體是用來(lái)描繪對(duì)象的各種物理屬性,可以讓家具在碰撞后嚴(yán)格遵照物理規(guī)則進(jìn)行運(yùn)動(dòng)。Unity3D內(nèi)的碰撞處理的方式有兩種,一種是利用碰撞器,游戲?qū)ο笈鲎睬昂髸?huì)調(diào)用碰撞函數(shù)OnCollisionEnter/StaylExit,同時(shí)根據(jù)物理規(guī)則產(chǎn)生碰撞效果。另一種是利用觸發(fā)器,即把對(duì)象身上碰撞器的IsTrigger屬性置為T(mén)rue,這種情況下僅調(diào)用碰撞函數(shù)OnTriggerEnter/Stay/Exit,而不產(chǎn)生任何碰撞效果。系統(tǒng)開(kāi)發(fā)過(guò)程中,為了保證對(duì)所有游戲?qū)ο蟮目煽匦裕捎煤笳邅?lái)處理碰撞。
角色對(duì)象是系統(tǒng)仿真中重要的組成元素,其中角色動(dòng)畫(huà)的調(diào)用是利用了Animator Controller組件,采用有限狀態(tài)機(jī)對(duì)角色行為進(jìn)行建模。狀態(tài)機(jī)中的狀態(tài)對(duì)應(yīng)角色的行為,每個(gè)狀態(tài)有一個(gè)與之相關(guān)的動(dòng)作,并在機(jī)器處于該狀態(tài)時(shí)播放,這樣就使角色管理器能夠定義角色動(dòng)作和動(dòng)畫(huà)的播放順序[12]。對(duì)狀態(tài)機(jī)添加不同狀態(tài),給每個(gè)狀態(tài)添加模型動(dòng)畫(huà),設(shè)置狀態(tài)轉(zhuǎn)換條件,點(diǎn)擊動(dòng)畫(huà)與動(dòng)畫(huà)之間的連線可以自由切割動(dòng)畫(huà)狀態(tài),設(shè)置轉(zhuǎn)換緩沖,利用狀態(tài)之間的連線實(shí)現(xiàn)不同角色動(dòng)畫(huà)間的轉(zhuǎn)換,從而實(shí)現(xiàn)不同的動(dòng)畫(huà)效果。
系統(tǒng)將自動(dòng)尋路算法應(yīng)用在角色漫游中。當(dāng)用戶調(diào)用角色在場(chǎng)景中行走時(shí),由于角色和家具的碰撞,導(dǎo)致角色可走的范圍減少。為了方便用戶的操作,當(dāng)用戶在和家具碰撞后并一定時(shí)間范圍內(nèi)不操作角色時(shí),角色自動(dòng)尋路,回到離該位置最近的“可操作點(diǎn)”。角色的自動(dòng)尋路算法為A*算法[13],開(kāi)始節(jié)點(diǎn)為虛擬角色碰撞后停留的最初位置,從初始位置向四個(gè)方向進(jìn)行尋路,黑色方格為障礙物,白色方格為可通行路徑,最終找到一條最短的,四周都可行走的位置節(jié)點(diǎn)。
系統(tǒng)中,當(dāng)鼠標(biāo)放在模型上面時(shí),鼠標(biāo)會(huì)變成圖標(biāo)并顯示家具價(jià)格信息。此功能利用了射線檢測(cè)技術(shù)。具體方法分析如下:
P=P0+T*α
(1)
其中,P表示射線上的某個(gè)點(diǎn);P0表示射線的起點(diǎn);α表示射線的方向。P,P0,α是三維矢量,t∈[0,∞),根據(jù)上式t=0時(shí),P表示起點(diǎn),t是其他數(shù)值時(shí),P表示射線上的其他點(diǎn),由于α僅表示射線的方向,于是t就表示射線上其他點(diǎn)離開(kāi)射線起點(diǎn)的距離。
假設(shè)已經(jīng)定義了3D矢量類(lèi)Vector3D,用C語(yǔ)言描述,射線的算法為:
Class Ray
{
Vector3D P; //射線的起點(diǎn)
Vector3D V; //指寸線的方向
};
設(shè)矢量P1是平面上的一點(diǎn),矢量N表示該平面的法線,這兩個(gè)矢量就足夠可以確定這個(gè)平面。例如給定一個(gè)點(diǎn)矢量(0,0,0)和一個(gè)法矢量(0,1,0)就唯一地定義了平面XOZ。任意一個(gè)平面的方程可寫(xiě)成:
N°P1=d
(2)
其中,d表示坐標(biāo)系原點(diǎn)到該平面的距離。
設(shè)射線與平面相交于點(diǎn)P,則P必定同時(shí)滿足方程(1)和(2),解這個(gè)方程組,得:
t=(N°P-N°P0)/(N·°α)
(3)
將式3代入式1即得到碰撞發(fā)生的位置P0,實(shí)現(xiàn)射線檢測(cè)后提取數(shù)據(jù)庫(kù)中存儲(chǔ)的信息[12],當(dāng)鼠標(biāo)放在模型上,經(jīng)過(guò)射線檢測(cè)后,將價(jià)格及材質(zhì)信息顯示出來(lái)。
在Unity3D中,播放音樂(lè)音效需要在系統(tǒng)場(chǎng)景的聲源處添加Audio Source組件用以掛載音頻源文件,在實(shí)際的游戲中往往需要在不同的時(shí)間播放不同的音效,因此需要實(shí)現(xiàn)一個(gè)Audio Manager來(lái)管理系統(tǒng)中的所有音樂(lè)音效的播放而非頻繁得掛載音頻文件。首先在Audio Manager中維護(hù)一個(gè)音效字典,以Key為標(biāo)記,在管理器初始化時(shí)將所需的音頻文件設(shè)置成不同的Key值,當(dāng)需要播放音頻的時(shí)候調(diào)用Audio Manager對(duì)應(yīng)的函數(shù)同時(shí)傳入所需音頻的Key。該系統(tǒng)中首先將10首歌曲設(shè)置成不同的Key值,然后在程序中創(chuàng)建一維數(shù)組a[i](0≤i≤9),將音樂(lè)以數(shù)據(jù)流的方式存入數(shù)據(jù)庫(kù)中,場(chǎng)景默認(rèn)播放第一首音樂(lè)(a[0]),判斷用戶是否點(diǎn)擊按鈕以及點(diǎn)擊的是左側(cè)按鈕還是右側(cè)按鈕,如果點(diǎn)擊左側(cè)按鈕則執(zhí)行“i--”,如果點(diǎn)擊右側(cè)按鈕則執(zhí)行“i++”。判斷i是否在此區(qū)間0
圖6 背景音樂(lè)切換方法流程
實(shí)驗(yàn)采取用戶體驗(yàn)的方式,檢測(cè)該系統(tǒng)的設(shè)計(jì)方法、使用的便捷性、用戶滿意度和對(duì)室內(nèi)家居的感興趣程度。100個(gè)用戶對(duì)系統(tǒng)進(jìn)行體驗(yàn),并以分?jǐn)?shù)的形式對(duì)系統(tǒng)進(jìn)行打分。將打分情況按照年齡分割成10組,對(duì)10組平均分值進(jìn)行匯總,結(jié)果見(jiàn)表1所示。
表1 用戶對(duì)系統(tǒng)的評(píng)估情況
最終發(fā)現(xiàn)用戶對(duì)此系統(tǒng)的直觀感受較好,滿意程度較高。
利用上述客戶端開(kāi)發(fā)框架開(kāi)發(fā)了一個(gè)三維室內(nèi)家居仿真操作系統(tǒng)。通過(guò)對(duì)大量家具模型的制作、家居材質(zhì)信息的調(diào)整、光影效果的實(shí)時(shí)渲染,三維仿真的效果得到了提升。系統(tǒng)在實(shí)驗(yàn)時(shí)利用碰撞檢測(cè)技術(shù)實(shí)現(xiàn)了用戶實(shí)時(shí)漫游的真實(shí)感模擬,利用角色管理器調(diào)用角色行走、轉(zhuǎn)身、后退、上樓梯、跳躍等動(dòng)畫(huà),利用自動(dòng)尋路算法在碰撞后進(jìn)行位置重置,利用射線檢測(cè)技術(shù)實(shí)現(xiàn)了室內(nèi)家居仿真操作系統(tǒng)中家具實(shí)時(shí)信息的加載。具體如圖7所示。
圖7 系統(tǒng)功能界面截圖
室內(nèi)展示系統(tǒng)首先利用AutoCAD對(duì)室內(nèi)場(chǎng)景進(jìn)行平面設(shè)計(jì),運(yùn)用3D Max按照相應(yīng)尺寸創(chuàng)建家具模型,創(chuàng)建Biped骨骼模型并與骨骼進(jìn)行匹配,利用關(guān)鍵幀技術(shù)實(shí)現(xiàn)虛擬角色的模型動(dòng)畫(huà)。其次,將模型存儲(chǔ)為fbx格式導(dǎo)入U(xiǎn)nity 3D中,通過(guò)對(duì)場(chǎng)景內(nèi)光影效果的對(duì)比分析、音樂(lè)切換的機(jī)制研究、角色控制器的調(diào)用、碰撞檢測(cè)技術(shù)、自動(dòng)尋路算法的改進(jìn)實(shí)現(xiàn)用戶在場(chǎng)景的高仿真度實(shí)時(shí)漫游模擬。然后,利用Oracle數(shù)據(jù)庫(kù)和SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)模型、貼圖、音樂(lè)等信息的存儲(chǔ),實(shí)現(xiàn)虛擬信息的實(shí)時(shí)調(diào)用。接著,運(yùn)用Unity 3D底層函數(shù)實(shí)現(xiàn)不同場(chǎng)景的切換,利用射線檢測(cè)技術(shù)實(shí)時(shí)加載家居信息。最后,通過(guò)對(duì)不同年齡段用戶系統(tǒng)體驗(yàn)實(shí)現(xiàn)系統(tǒng)的性能檢測(cè),最終發(fā)現(xiàn)用戶對(duì)此系統(tǒng)的直觀感受較好,滿意程度較高。