高 強
(山西職業技術學院 山西 太原 030006)
隨著計算機技術的發展,借助Auto CAD、3DMAX、MAYA等計算機輔助設計軟件已經可以構建出十分逼真的三維虛擬空間,并將其廣泛應用于工業制造、建筑設計等專業領域。但是采用上述方法所構建的三維虛擬空間都是靜態空間,不具有交互功能,用戶只能通過固定視角對局部空間進行觀測,且不能對數據進行動態查詢和處理,因此在實際應用中用戶還需要輔助人工操作進行圖像拼接和數據采集。針對這一技術缺陷,本研究結合虛擬現實技術,基于Unity3D開發引擎設計了一個虛擬空間交互系統,在構建好的三維虛擬空間基礎上增加了場景漫游、模型編輯、數據管理等動態交互功能。
三維建模用于虛擬現實場景中所有三維素材的設計與制作,常用軟件有Auto CAD、3DMAX、MAYA等,三維建模的主要方法有2種。第一種是人工建模,也就是通過人工操作上述軟件,進行模型的設計構建、材質繪制等。Auto CAD的模型構建方法是先通過圖形繪制命令生成準確尺寸的二維圖形,再依據高度標注等參數轉換為三維模型,適用于建筑模型、工業零配件模型的制作;3DMAX、MAYA軟件是基于幾何體方式直接進行三維模型的制作,通過幾何面片的拼接、編輯生成各種形態的模型體,并提供有材質管理器、粒子特效、場景光源等工具,適用于大場景、人體等復雜模型的構造[1]。第二種是通過三維掃描實現模型重構,利用三維掃描設備對真實物體進行數據采集,再通過模型重構算法轉換為數字化模型,適用于仿真要求度高的模型制作。
虛擬現實技術是一種計算機仿真技術,通過三維建模、計算機編程等方式實現對真實世界的數字化模擬[2],用戶可以配合相應的虛擬產品對數字環境進行虛擬體驗和交互,如虛擬場景漫游、光源變化、虛擬物品操作等。虛擬現實技術主要由硬件部分與軟件系統兩部分組成。硬件部分主要指的是VR眼鏡、手柄等設備[3],它是虛擬軟件系統運行的物理載體,通過左右眼分開成像的光學原理在人眼中呈現出立體的視覺效果,同時配合傳感器、VR手柄就可以與虛擬場景進行人機交互。軟件系統又分為前端與后端系統兩部分,前端系統負責三維場景渲染、用戶交互和業務邏輯處理等功能的實現,后端系統負責三維場景的圖形運算和數據庫管理[4]。
3D引擎是虛擬現實軟件系統開發的核心工具,負責場景搭建、交互程序設計、業務邏輯控制、前后端數據通信等功能的實現,主流的常用軟件為Unity3D、UE4,這兩款3D引擎軟件最初主要用于三維游戲的設計、開發,其中Unity3D具有跨平臺部署、多種編程語言的程序庫支持、物理屬性模擬、粒子特效等技術優勢,且匹配有豐富的第三方資源庫和多種第三方軟件工具的通信接口,使其在虛擬現實技術領域也快速得到了廣泛應用,此外針對數據通信,Unity3D還提供了MySQL與SQLite兩類數據庫接口。
(1)交互性功能需求。允許用戶對虛擬空間進行各種交互操作,包括二維/三維視圖切換、場景漫游、建筑元素的移動/編輯、建筑材質更換、光照效果切換、視角切換等。
(2)動態數據管理需求。包括用戶數據管理、系統數據管理、專業數據管理等,用戶數據管理指的是系統用戶的基本信息管理;系統數據管理包括系統設置參數、通知消息、日志,以及系統備份恢復記錄等數據的管理;專業數據管理是指虛擬建筑空間規劃的測量數據、用戶標注數據等信息的管理。
(3)粒子效果與物理屬性的動態模擬需求。允許用戶通過粒子效果切換實現對自然環境的風、光、雷、電、火等效果的模擬,通過物理屬性設置實現虛擬空間中物體碰撞、摩擦等物理效果的模擬。
(4)文件格式的解析需求。虛擬空間系統涉及了大量的三維場景、模型、貼圖等素材資源,還涉及了不同軟件開發平臺下多種文件格式的數據交互與轉換。Unity3D所支持的音頻類文件格式有原生音頻WAV、AIFF,壓縮音頻MPEG、Ogg等,模型類資源的文件存儲格式為FBX,貼圖文件存儲格式有PNG、JPG、TGA、DDS等[5]。因此系統還需要具備文件格式的解析功能,以實現各種數據文件格式的動態交互。
(1)系統實時性。由于系統涉及大量三維數據的可視化處理,特別是在空間動態變換的情況下,場景、模型的實時渲染需要消耗大量的運算資源,一旦資源調度不合理,就會產生明顯的延時,甚至宕機,因此保障系統的實時性是十分必要的。
(2)數據安全性。虛擬空間交互系統應用于專業領域時,相關數據多屬于商業數據,在數據的安全性方面要求要高于一般的用戶數據,因此在數據安全性方面需要具有完善的保障機制,包括用戶數據合法性驗證、數據操作日志管理機制、數據安全備份與恢復機制等。
(3)系統的穩定性。系統穩定性是對系統綜合性能的一種客觀評價,評價指標包括系統的平均無故障時間、平均故障修復時間、平均故障間隔時間等。系統穩定性越高,系統的有效使用時間就越長,相對的技術投入成本也就越低。因此在系統應用過程中應建立相應的故障檢測、用戶反饋、設備維護等機制,以保障系統的穩定運行。
基于Unity3D的虛擬空間交互系統的架構設計主要采用了客戶端/服務器(Client/Server,C/S)模式。建筑空間規劃設計VR系統架構設計如圖1所示。

圖1 建筑空間規劃設計VR系統架構設計
3.1.1 客戶端功能設計
客戶端主要負責用戶驗證界面、UI界面、可視化場景界面的動態效果顯示與業務邏輯管理。用戶驗證界面用于采集用戶的登錄信息,并通過服務器請求完成信息的合法性驗證。UI界面負責各類交互控件的動態顯示,Unity3D提供的UI控件包括文本控件、按鈕控件、圖像控件、滑動桿、富文本等[6],同時Unity3D還為這些控件配置了各種外觀屬性,如顏色、透明度、描邊、陰影等,通過程序控制可以實現動態效果顯示,如按鈕按下/彈起的顏色變化、圖像的動態填充等。可視化場景用于三維場景及模型的動態渲染與顯示,三維場景包括天空貼圖、樹/草模型等,Unity3D提供有預置的天空盒、樹/草模型和材質球[7],可以快速生成場景環境,并且具有較高的渲染效率;三維模型主要指場景中的建筑樓宇、地面裝飾物、室內家居等,如果模型面數過多,且曲面較為復雜的話,會對系統的渲染效率產生一定影響。業務邏輯管理負責客戶端界面的交互邏輯控制與業務數據的請求和響應,用戶與系統的交互業務類型主要有2種,一種是針對三維場景和模型的交互,如場景切換、視角移動、環境變換、模型操作等,這類交互業務不涉及數據傳輸,因此通過客戶端的程序設計即可實現邏輯控制;另一種是針對數據的交互,如用戶信息驗證、建筑信息查詢、標注信息導入、用戶自定義的模型素材文件導入,都涉及對底層數據庫的訪問,這就需要與服務器端建立連接,以實現數據傳輸。
3.1.2 通信連接的建立
Unity3D將軟件系統封裝為EXE、APK這2種文件格式[8],分別部署在PC客戶端與移動客戶端,通過套接字Socket與服務器建立連接通道進行實時通信。套接字Socket是一種專用于C/S系統架構的通信機制,將底層通信的各類協議進行了封裝和屏蔽,并約定了統一的通信方式和一套通信接口。Socket的通信過程主要包括建立連接、傳送數據和關閉連接3個步驟,首先調用Unity3D內置的Client函數,通過客戶端中包含的Socket套接字與服務器建立連接,并將待處理的數據寫入通用緩沖區ByteArray;接著調用OnClientEvent函數,對數據傳輸協議進行解析,以及數據的粘包和分包處理;最后調用socket.Close函數關閉連接,在關閉連接之前服務器還需向客戶端發布一個訂閱消息,告知客戶端連接關閉。
3.1.3 服務器端功能設計
服務器端的功能設計包括資源調度、文件解析、圖形處理與數據庫服務等模塊。資源調度模塊主要負責監聽各個客戶端的數據連接請求,進行數據的解析處理,并按照一定的調度策略進行系統資源的調度分配。文件解析模塊負責對用戶導入的文件進行格式轉換與信息解析,如三維模型文件、貼圖文件、音頻文件等。在圖形處理模塊中,服務器采用了圖形處理專用引擎GPU進行三維場景、模型的圖形計算和處理,包括頂點混合、紋理映射、貼圖壓縮等[9],以確保客戶端系統能夠保持穩定的圖形渲染效率。數據庫服務模塊則負責服務器與數據庫的通信、數據庫的備份與恢復,當服務器解析的任務請求涉及數據庫操作時,由服務器對數據庫進行讀寫訪問,并將最終結果返回至客戶端。
3.1.4 數據庫功能設計
數據庫構建采用了關系型數據庫管理工具MySQL,除了基本的數據存儲、寫入/讀出功能,MySQL還提供有身份驗證機制,以確保數據庫的安全訪問。Unity3D訪問數據庫首先需要導入MySql.Data文件[10],代碼示例如下:
using MySql.Data.MySqlClient
其次,在Unity3D中通過自定義的MySQLBox類就可以對數據庫進行訪問。MySQLBox類內封裝的Connect方法用于對用戶的身份合法進行驗證,Open、Close方法用于建立和關閉數據庫連接,同時提供了多種數據的增刪改查方法。
3.2.1 三維場景與模型的實時渲染
三維場景/模型實時渲染是指用戶對三維場景或模型進行交互操作時,系統需要實時對場景材質和模型進行動態渲染和顯示。為了確保圖形處理的渲染效率,Unity3D提供了圖形緩存、場景預加載、任務調度等保障機制,首先由服務器對當前加載場景中的所有圖形進行預處理,再將其緩存至客戶端,已供場景調度。在此基礎上,還可以通過模型面數精減、分級渲染等方式進一步提升渲染效率的實時性。模型面數精減是指在三維建模環節就對模型不需要顯示的面進行刪減,如模型與地面接觸的部分。分級渲染是指在三維場景中,依據視角的覆蓋范圍,對渲染對象進行分級管理,距離最近的對象為最高渲染級別,需優先保障渲染效率;距離較遠且在視角覆蓋范圍內的對象,為中等優先級;而處于視角范圍外的對象為最低級別,可采用靜態渲染方式進行圖像處理。
3.2.2 三維場景的交互碰撞檢測
Unity3D提供了2種碰撞檢測策略:射線檢測與碰撞體檢測。射線檢測是由場景中的攝像機發出一條射線,場景模型與射線相交時即認為發生了碰撞,該策略適用于模型對象的拾取、更換材質、移動旋轉等操作的碰撞檢測;碰撞體檢測是通過對模型表面生成的網格碰撞體進行相交檢測,來判斷物體是否發生碰撞,適用于場景、模型交互的邊界控制,防止用戶視角穿過模型或場景邊界。
碰撞檢測策略主要通過包圍盒算法對物體進行相交檢測。對于建筑類模型,因其外觀形狀較為規則,因此可以采用最為基礎的算法—軸對齊包圍盒(axis-aligned bounding box,AABB)算法進行碰撞檢測。AABB通過生成規則的立方體網格對碰撞檢測體進行包裹,計算立方體6個頂點的三維坐標最大投影值與最小投影值,確定包圍盒的大小,該算法程序設計簡單,執行效率高,但檢測精度較低,適用于構造簡單的靜態模型檢測,主要用于場景漫游的邊界碰撞檢測,防止視角穿過虛擬空間的邊界。針對運動中的模型檢測,可以采用方向包圍盒(oriented bounding box,OBB)算法進行檢測。模型在運動中隨著位置、角度的變換,包圍盒也需相應地做出改變,才能確保檢測的正確性,OBB算法通過計算包圍盒3個軸向與模型軸向的相交半徑,確定模型的旋轉角度,從而調整包圍盒的變換方向,實現動態模型檢測的效果。
綜上所述,計算機輔助設計軟件Auto CAD、3DMAX、MAYA等雖然能夠構建逼真的三維虛擬空間,但在動態交互與數據實時性管理等方面仍存在很大的技術缺陷,為了解決這一問題,本研究結合虛擬現實技術,設計了一個基于Unity3D的虛擬空間交互系統,并對其功能設計、三維場景實時渲染、碰撞檢測等核心功能的實現進行了闡述,為之后的相關研究奠定了實踐基礎。