高 強(qiáng)
(山西職業(yè)技術(shù)學(xué)院 山西 太原 030006)
隨著計(jì)算機(jī)技術(shù)的發(fā)展,借助Auto CAD、3DMAX、MAYA等計(jì)算機(jī)輔助設(shè)計(jì)軟件已經(jīng)可以構(gòu)建出十分逼真的三維虛擬空間,并將其廣泛應(yīng)用于工業(yè)制造、建筑設(shè)計(jì)等專業(yè)領(lǐng)域。但是采用上述方法所構(gòu)建的三維虛擬空間都是靜態(tài)空間,不具有交互功能,用戶只能通過(guò)固定視角對(duì)局部空間進(jìn)行觀測(cè),且不能對(duì)數(shù)據(jù)進(jìn)行動(dòng)態(tài)查詢和處理,因此在實(shí)際應(yīng)用中用戶還需要輔助人工操作進(jìn)行圖像拼接和數(shù)據(jù)采集。針對(duì)這一技術(shù)缺陷,本研究結(jié)合虛擬現(xiàn)實(shí)技術(shù),基于Unity3D開發(fā)引擎設(shè)計(jì)了一個(gè)虛擬空間交互系統(tǒng),在構(gòu)建好的三維虛擬空間基礎(chǔ)上增加了場(chǎng)景漫游、模型編輯、數(shù)據(jù)管理等動(dòng)態(tài)交互功能。
三維建模用于虛擬現(xiàn)實(shí)場(chǎng)景中所有三維素材的設(shè)計(jì)與制作,常用軟件有Auto CAD、3DMAX、MAYA等,三維建模的主要方法有2種。第一種是人工建模,也就是通過(guò)人工操作上述軟件,進(jìn)行模型的設(shè)計(jì)構(gòu)建、材質(zhì)繪制等。Auto CAD的模型構(gòu)建方法是先通過(guò)圖形繪制命令生成準(zhǔn)確尺寸的二維圖形,再依據(jù)高度標(biāo)注等參數(shù)轉(zhuǎn)換為三維模型,適用于建筑模型、工業(yè)零配件模型的制作;3DMAX、MAYA軟件是基于幾何體方式直接進(jìn)行三維模型的制作,通過(guò)幾何面片的拼接、編輯生成各種形態(tài)的模型體,并提供有材質(zhì)管理器、粒子特效、場(chǎng)景光源等工具,適用于大場(chǎng)景、人體等復(fù)雜模型的構(gòu)造[1]。第二種是通過(guò)三維掃描實(shí)現(xiàn)模型重構(gòu),利用三維掃描設(shè)備對(duì)真實(shí)物體進(jìn)行數(shù)據(jù)采集,再通過(guò)模型重構(gòu)算法轉(zhuǎn)換為數(shù)字化模型,適用于仿真要求度高的模型制作。
虛擬現(xiàn)實(shí)技術(shù)是一種計(jì)算機(jī)仿真技術(shù),通過(guò)三維建模、計(jì)算機(jī)編程等方式實(shí)現(xiàn)對(duì)真實(shí)世界的數(shù)字化模擬[2],用戶可以配合相應(yīng)的虛擬產(chǎn)品對(duì)數(shù)字環(huán)境進(jìn)行虛擬體驗(yàn)和交互,如虛擬場(chǎng)景漫游、光源變化、虛擬物品操作等。虛擬現(xiàn)實(shí)技術(shù)主要由硬件部分與軟件系統(tǒng)兩部分組成。硬件部分主要指的是VR眼鏡、手柄等設(shè)備[3],它是虛擬軟件系統(tǒng)運(yùn)行的物理載體,通過(guò)左右眼分開成像的光學(xué)原理在人眼中呈現(xiàn)出立體的視覺效果,同時(shí)配合傳感器、VR手柄就可以與虛擬場(chǎng)景進(jìn)行人機(jī)交互。軟件系統(tǒng)又分為前端與后端系統(tǒng)兩部分,前端系統(tǒng)負(fù)責(zé)三維場(chǎng)景渲染、用戶交互和業(yè)務(wù)邏輯處理等功能的實(shí)現(xiàn),后端系統(tǒng)負(fù)責(zé)三維場(chǎng)景的圖形運(yùn)算和數(shù)據(jù)庫(kù)管理[4]。
3D引擎是虛擬現(xiàn)實(shí)軟件系統(tǒng)開發(fā)的核心工具,負(fù)責(zé)場(chǎng)景搭建、交互程序設(shè)計(jì)、業(yè)務(wù)邏輯控制、前后端數(shù)據(jù)通信等功能的實(shí)現(xiàn),主流的常用軟件為Unity3D、UE4,這兩款3D引擎軟件最初主要用于三維游戲的設(shè)計(jì)、開發(fā),其中Unity3D具有跨平臺(tái)部署、多種編程語(yǔ)言的程序庫(kù)支持、物理屬性模擬、粒子特效等技術(shù)優(yōu)勢(shì),且匹配有豐富的第三方資源庫(kù)和多種第三方軟件工具的通信接口,使其在虛擬現(xiàn)實(shí)技術(shù)領(lǐng)域也快速得到了廣泛應(yīng)用,此外針對(duì)數(shù)據(jù)通信,Unity3D還提供了MySQL與SQLite兩類數(shù)據(jù)庫(kù)接口。
(1)交互性功能需求。允許用戶對(duì)虛擬空間進(jìn)行各種交互操作,包括二維/三維視圖切換、場(chǎng)景漫游、建筑元素的移動(dòng)/編輯、建筑材質(zhì)更換、光照效果切換、視角切換等。
(2)動(dòng)態(tài)數(shù)據(jù)管理需求。包括用戶數(shù)據(jù)管理、系統(tǒng)數(shù)據(jù)管理、專業(yè)數(shù)據(jù)管理等,用戶數(shù)據(jù)管理指的是系統(tǒng)用戶的基本信息管理;系統(tǒng)數(shù)據(jù)管理包括系統(tǒng)設(shè)置參數(shù)、通知消息、日志,以及系統(tǒng)備份恢復(fù)記錄等數(shù)據(jù)的管理;專業(yè)數(shù)據(jù)管理是指虛擬建筑空間規(guī)劃的測(cè)量數(shù)據(jù)、用戶標(biāo)注數(shù)據(jù)等信息的管理。
(3)粒子效果與物理屬性的動(dòng)態(tài)模擬需求。允許用戶通過(guò)粒子效果切換實(shí)現(xiàn)對(duì)自然環(huán)境的風(fēng)、光、雷、電、火等效果的模擬,通過(guò)物理屬性設(shè)置實(shí)現(xiàn)虛擬空間中物體碰撞、摩擦等物理效果的模擬。
(4)文件格式的解析需求。虛擬空間系統(tǒng)涉及了大量的三維場(chǎng)景、模型、貼圖等素材資源,還涉及了不同軟件開發(fā)平臺(tái)下多種文件格式的數(shù)據(jù)交互與轉(zhuǎn)換。Unity3D所支持的音頻類文件格式有原生音頻WAV、AIFF,壓縮音頻MPEG、Ogg等,模型類資源的文件存儲(chǔ)格式為FBX,貼圖文件存儲(chǔ)格式有PNG、JPG、TGA、DDS等[5]。因此系統(tǒng)還需要具備文件格式的解析功能,以實(shí)現(xiàn)各種數(shù)據(jù)文件格式的動(dòng)態(tài)交互。
(1)系統(tǒng)實(shí)時(shí)性。由于系統(tǒng)涉及大量三維數(shù)據(jù)的可視化處理,特別是在空間動(dòng)態(tài)變換的情況下,場(chǎng)景、模型的實(shí)時(shí)渲染需要消耗大量的運(yùn)算資源,一旦資源調(diào)度不合理,就會(huì)產(chǎn)生明顯的延時(shí),甚至宕機(jī),因此保障系統(tǒng)的實(shí)時(shí)性是十分必要的。
(2)數(shù)據(jù)安全性。虛擬空間交互系統(tǒng)應(yīng)用于專業(yè)領(lǐng)域時(shí),相關(guān)數(shù)據(jù)多屬于商業(yè)數(shù)據(jù),在數(shù)據(jù)的安全性方面要求要高于一般的用戶數(shù)據(jù),因此在數(shù)據(jù)安全性方面需要具有完善的保障機(jī)制,包括用戶數(shù)據(jù)合法性驗(yàn)證、數(shù)據(jù)操作日志管理機(jī)制、數(shù)據(jù)安全備份與恢復(fù)機(jī)制等。
(3)系統(tǒng)的穩(wěn)定性。系統(tǒng)穩(wěn)定性是對(duì)系統(tǒng)綜合性能的一種客觀評(píng)價(jià),評(píng)價(jià)指標(biāo)包括系統(tǒng)的平均無(wú)故障時(shí)間、平均故障修復(fù)時(shí)間、平均故障間隔時(shí)間等。系統(tǒng)穩(wěn)定性越高,系統(tǒng)的有效使用時(shí)間就越長(zhǎng),相對(duì)的技術(shù)投入成本也就越低。因此在系統(tǒng)應(yīng)用過(guò)程中應(yīng)建立相應(yīng)的故障檢測(cè)、用戶反饋、設(shè)備維護(hù)等機(jī)制,以保障系統(tǒng)的穩(wěn)定運(yùn)行。
基于Unity3D的虛擬空間交互系統(tǒng)的架構(gòu)設(shè)計(jì)主要采用了客戶端/服務(wù)器(Client/Server,C/S)模式。建筑空間規(guī)劃設(shè)計(jì)VR系統(tǒng)架構(gòu)設(shè)計(jì)如圖1所示。
圖1 建筑空間規(guī)劃設(shè)計(jì)VR系統(tǒng)架構(gòu)設(shè)計(jì)
3.1.1 客戶端功能設(shè)計(jì)
客戶端主要負(fù)責(zé)用戶驗(yàn)證界面、UI界面、可視化場(chǎng)景界面的動(dòng)態(tài)效果顯示與業(yè)務(wù)邏輯管理。用戶驗(yàn)證界面用于采集用戶的登錄信息,并通過(guò)服務(wù)器請(qǐng)求完成信息的合法性驗(yàn)證。UI界面負(fù)責(zé)各類交互控件的動(dòng)態(tài)顯示,Unity3D提供的UI控件包括文本控件、按鈕控件、圖像控件、滑動(dòng)桿、富文本等[6],同時(shí)Unity3D還為這些控件配置了各種外觀屬性,如顏色、透明度、描邊、陰影等,通過(guò)程序控制可以實(shí)現(xiàn)動(dòng)態(tài)效果顯示,如按鈕按下/彈起的顏色變化、圖像的動(dòng)態(tài)填充等??梢暬瘓?chǎng)景用于三維場(chǎng)景及模型的動(dòng)態(tài)渲染與顯示,三維場(chǎng)景包括天空貼圖、樹/草模型等,Unity3D提供有預(yù)置的天空盒、樹/草模型和材質(zhì)球[7],可以快速生成場(chǎng)景環(huán)境,并且具有較高的渲染效率;三維模型主要指場(chǎng)景中的建筑樓宇、地面裝飾物、室內(nèi)家居等,如果模型面數(shù)過(guò)多,且曲面較為復(fù)雜的話,會(huì)對(duì)系統(tǒng)的渲染效率產(chǎn)生一定影響。業(yè)務(wù)邏輯管理負(fù)責(zé)客戶端界面的交互邏輯控制與業(yè)務(wù)數(shù)據(jù)的請(qǐng)求和響應(yīng),用戶與系統(tǒng)的交互業(yè)務(wù)類型主要有2種,一種是針對(duì)三維場(chǎng)景和模型的交互,如場(chǎng)景切換、視角移動(dòng)、環(huán)境變換、模型操作等,這類交互業(yè)務(wù)不涉及數(shù)據(jù)傳輸,因此通過(guò)客戶端的程序設(shè)計(jì)即可實(shí)現(xiàn)邏輯控制;另一種是針對(duì)數(shù)據(jù)的交互,如用戶信息驗(yàn)證、建筑信息查詢、標(biāo)注信息導(dǎo)入、用戶自定義的模型素材文件導(dǎo)入,都涉及對(duì)底層數(shù)據(jù)庫(kù)的訪問,這就需要與服務(wù)器端建立連接,以實(shí)現(xiàn)數(shù)據(jù)傳輸。
3.1.2 通信連接的建立
Unity3D將軟件系統(tǒng)封裝為EXE、APK這2種文件格式[8],分別部署在PC客戶端與移動(dòng)客戶端,通過(guò)套接字Socket與服務(wù)器建立連接通道進(jìn)行實(shí)時(shí)通信。套接字Socket是一種專用于C/S系統(tǒng)架構(gòu)的通信機(jī)制,將底層通信的各類協(xié)議進(jìn)行了封裝和屏蔽,并約定了統(tǒng)一的通信方式和一套通信接口。Socket的通信過(guò)程主要包括建立連接、傳送數(shù)據(jù)和關(guān)閉連接3個(gè)步驟,首先調(diào)用Unity3D內(nèi)置的Client函數(shù),通過(guò)客戶端中包含的Socket套接字與服務(wù)器建立連接,并將待處理的數(shù)據(jù)寫入通用緩沖區(qū)ByteArray;接著調(diào)用OnClientEvent函數(shù),對(duì)數(shù)據(jù)傳輸協(xié)議進(jìn)行解析,以及數(shù)據(jù)的粘包和分包處理;最后調(diào)用socket.Close函數(shù)關(guān)閉連接,在關(guān)閉連接之前服務(wù)器還需向客戶端發(fā)布一個(gè)訂閱消息,告知客戶端連接關(guān)閉。
3.1.3 服務(wù)器端功能設(shè)計(jì)
服務(wù)器端的功能設(shè)計(jì)包括資源調(diào)度、文件解析、圖形處理與數(shù)據(jù)庫(kù)服務(wù)等模塊。資源調(diào)度模塊主要負(fù)責(zé)監(jiān)聽各個(gè)客戶端的數(shù)據(jù)連接請(qǐng)求,進(jìn)行數(shù)據(jù)的解析處理,并按照一定的調(diào)度策略進(jìn)行系統(tǒng)資源的調(diào)度分配。文件解析模塊負(fù)責(zé)對(duì)用戶導(dǎo)入的文件進(jìn)行格式轉(zhuǎn)換與信息解析,如三維模型文件、貼圖文件、音頻文件等。在圖形處理模塊中,服務(wù)器采用了圖形處理專用引擎GPU進(jìn)行三維場(chǎng)景、模型的圖形計(jì)算和處理,包括頂點(diǎn)混合、紋理映射、貼圖壓縮等[9],以確??蛻舳讼到y(tǒng)能夠保持穩(wěn)定的圖形渲染效率。數(shù)據(jù)庫(kù)服務(wù)模塊則負(fù)責(zé)服務(wù)器與數(shù)據(jù)庫(kù)的通信、數(shù)據(jù)庫(kù)的備份與恢復(fù),當(dāng)服務(wù)器解析的任務(wù)請(qǐng)求涉及數(shù)據(jù)庫(kù)操作時(shí),由服務(wù)器對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫訪問,并將最終結(jié)果返回至客戶端。
3.1.4 數(shù)據(jù)庫(kù)功能設(shè)計(jì)
數(shù)據(jù)庫(kù)構(gòu)建采用了關(guān)系型數(shù)據(jù)庫(kù)管理工具M(jìn)ySQL,除了基本的數(shù)據(jù)存儲(chǔ)、寫入/讀出功能,MySQL還提供有身份驗(yàn)證機(jī)制,以確保數(shù)據(jù)庫(kù)的安全訪問。Unity3D訪問數(shù)據(jù)庫(kù)首先需要導(dǎo)入MySql.Data文件[10],代碼示例如下:
using MySql.Data.MySqlClient
其次,在Unity3D中通過(guò)自定義的MySQLBox類就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問。MySQLBox類內(nèi)封裝的Connect方法用于對(duì)用戶的身份合法進(jìn)行驗(yàn)證,Open、Close方法用于建立和關(guān)閉數(shù)據(jù)庫(kù)連接,同時(shí)提供了多種數(shù)據(jù)的增刪改查方法。
3.2.1 三維場(chǎng)景與模型的實(shí)時(shí)渲染
三維場(chǎng)景/模型實(shí)時(shí)渲染是指用戶對(duì)三維場(chǎng)景或模型進(jìn)行交互操作時(shí),系統(tǒng)需要實(shí)時(shí)對(duì)場(chǎng)景材質(zhì)和模型進(jìn)行動(dòng)態(tài)渲染和顯示。為了確保圖形處理的渲染效率,Unity3D提供了圖形緩存、場(chǎng)景預(yù)加載、任務(wù)調(diào)度等保障機(jī)制,首先由服務(wù)器對(duì)當(dāng)前加載場(chǎng)景中的所有圖形進(jìn)行預(yù)處理,再將其緩存至客戶端,已供場(chǎng)景調(diào)度。在此基礎(chǔ)上,還可以通過(guò)模型面數(shù)精減、分級(jí)渲染等方式進(jìn)一步提升渲染效率的實(shí)時(shí)性。模型面數(shù)精減是指在三維建模環(huán)節(jié)就對(duì)模型不需要顯示的面進(jìn)行刪減,如模型與地面接觸的部分。分級(jí)渲染是指在三維場(chǎng)景中,依據(jù)視角的覆蓋范圍,對(duì)渲染對(duì)象進(jìn)行分級(jí)管理,距離最近的對(duì)象為最高渲染級(jí)別,需優(yōu)先保障渲染效率;距離較遠(yuǎn)且在視角覆蓋范圍內(nèi)的對(duì)象,為中等優(yōu)先級(jí);而處于視角范圍外的對(duì)象為最低級(jí)別,可采用靜態(tài)渲染方式進(jìn)行圖像處理。
3.2.2 三維場(chǎng)景的交互碰撞檢測(cè)
Unity3D提供了2種碰撞檢測(cè)策略:射線檢測(cè)與碰撞體檢測(cè)。射線檢測(cè)是由場(chǎng)景中的攝像機(jī)發(fā)出一條射線,場(chǎng)景模型與射線相交時(shí)即認(rèn)為發(fā)生了碰撞,該策略適用于模型對(duì)象的拾取、更換材質(zhì)、移動(dòng)旋轉(zhuǎn)等操作的碰撞檢測(cè);碰撞體檢測(cè)是通過(guò)對(duì)模型表面生成的網(wǎng)格碰撞體進(jìn)行相交檢測(cè),來(lái)判斷物體是否發(fā)生碰撞,適用于場(chǎng)景、模型交互的邊界控制,防止用戶視角穿過(guò)模型或場(chǎng)景邊界。
碰撞檢測(cè)策略主要通過(guò)包圍盒算法對(duì)物體進(jìn)行相交檢測(cè)。對(duì)于建筑類模型,因其外觀形狀較為規(guī)則,因此可以采用最為基礎(chǔ)的算法—軸對(duì)齊包圍盒(axis-aligned bounding box,AABB)算法進(jìn)行碰撞檢測(cè)。AABB通過(guò)生成規(guī)則的立方體網(wǎng)格對(duì)碰撞檢測(cè)體進(jìn)行包裹,計(jì)算立方體6個(gè)頂點(diǎn)的三維坐標(biāo)最大投影值與最小投影值,確定包圍盒的大小,該算法程序設(shè)計(jì)簡(jiǎn)單,執(zhí)行效率高,但檢測(cè)精度較低,適用于構(gòu)造簡(jiǎn)單的靜態(tài)模型檢測(cè),主要用于場(chǎng)景漫游的邊界碰撞檢測(cè),防止視角穿過(guò)虛擬空間的邊界。針對(duì)運(yùn)動(dòng)中的模型檢測(cè),可以采用方向包圍盒(oriented bounding box,OBB)算法進(jìn)行檢測(cè)。模型在運(yùn)動(dòng)中隨著位置、角度的變換,包圍盒也需相應(yīng)地做出改變,才能確保檢測(cè)的正確性,OBB算法通過(guò)計(jì)算包圍盒3個(gè)軸向與模型軸向的相交半徑,確定模型的旋轉(zhuǎn)角度,從而調(diào)整包圍盒的變換方向,實(shí)現(xiàn)動(dòng)態(tài)模型檢測(cè)的效果。
綜上所述,計(jì)算機(jī)輔助設(shè)計(jì)軟件Auto CAD、3DMAX、MAYA等雖然能夠構(gòu)建逼真的三維虛擬空間,但在動(dòng)態(tài)交互與數(shù)據(jù)實(shí)時(shí)性管理等方面仍存在很大的技術(shù)缺陷,為了解決這一問題,本研究結(jié)合虛擬現(xiàn)實(shí)技術(shù),設(shè)計(jì)了一個(gè)基于Unity3D的虛擬空間交互系統(tǒng),并對(duì)其功能設(shè)計(jì)、三維場(chǎng)景實(shí)時(shí)渲染、碰撞檢測(cè)等核心功能的實(shí)現(xiàn)進(jìn)行了闡述,為之后的相關(guān)研究奠定了實(shí)踐基礎(chǔ)。