李 晶
(廣東輕工職業(yè)技術學院 廣東 廣州 510300)
隨著虛擬現(xiàn)實技術在各個行業(yè)的快速普及與發(fā)展,其在空間與時間上的技術突破對人們的工作、生活、娛樂都產(chǎn)生了不同程度的影響[1]。本文結合虛擬現(xiàn)實技術特點,將其應用于博物館場景的虛擬展示和交互中,設計與實現(xiàn)了一個基于Unity3D的虛擬仿真博物館漫游系統(tǒng),打破了時間與空間的限制,為用戶提供了逼真的博物館游覽體驗,并針對技術應用過程中以下3點問題提出了針對性的解決策略。
問題1:三維場景的構建與資源優(yōu)化問題。虛擬現(xiàn)實技術必須應用在三維場景中,而三維場景在圖形處理、渲染等方面需要占用大量的計算資源,容易造成系統(tǒng)運行效率低下、響應延時等問題[2],繼而影響用戶體驗。因此在保證虛擬場景顯示效果同時還需對場景結構進行優(yōu)化和對場景資源進行有效調度,以保證系統(tǒng)的運行效率。
問題2:場景交互的觸發(fā)精度問題。用戶在虛擬場景中漫游,會通過各類觸發(fā)條件與場景進行交互,在觸發(fā)點較多,且場景空間較小的情況下,觸發(fā)點的邊界設置過大容易產(chǎn)生相互遮擋或邊界重合,導致響應錯誤;邊界設置過小,又難以被精準觸發(fā),也會影響用戶體驗效果,因此需要對場景交互的觸發(fā)精度做進一步的優(yōu)化處理。
問題3:場景漫游的視角問題。場景漫游需要設置邊界以防止用戶視角移出到場景之外,通常采用的策略是對場景邊界添加剛體組件以阻止場景攝像機的移出。但攝像機視角都設置有視域,當攝像機移動到場景邊界,視角已經(jīng)超出了場景邊界,因此還需要對視角進行單獨調整。
Unity3D是由丹麥公司開發(fā)的一款3D引擎,最初主要應用于3D游戲的設計開發(fā)。隨著虛擬現(xiàn)實技術的發(fā)展與普及,Unity3D也逐漸被用于各個行業(yè)領域的虛擬現(xiàn)實項目開發(fā),成為虛擬現(xiàn)實項目開發(fā)的主流工具之一。其技術優(yōu)勢主要包括以下幾個方面。
(1)初期開源免費,通過用戶的共用推廣,積累了豐富的功能插件和精美的場景、模型資源,能夠高效滿足用戶的各類開發(fā)需求[3]。
(2)圖形化界面操作,提供了基于三維空間的可視化操作界面以及直觀、便捷的操作工具,便于開發(fā)者快速搭建場景,調整場景布局。
(3)提供了多種數(shù)據(jù)接口,支持3D模型、二維圖像、音頻、視頻等多媒體文件的指定格式導入。
(4)支持組件式開發(fā),內置多種功能組件供開發(fā)者調用,并可由開發(fā)者自行設置功能參數(shù),例如物理模擬組件用于模擬物體重力、碰撞彈射、刮風下雨等效果,粒子組件用于模擬煙火、爆炸等效果。
(5)支持C#、JavaScript等主流編程語言工具,用于進行系統(tǒng)前端界面交互功能的開發(fā);支持MySQL、SQLlite等數(shù)據(jù)庫管理工具,用于實現(xiàn)系統(tǒng)后端的數(shù)據(jù)管理。
(6)支持多平臺的項目發(fā)布,基于unity3D開發(fā)的虛擬現(xiàn)實項目可以發(fā)布在各類主流平臺,包括PC端、移動Android端和iOS端以及Web瀏覽器端。
基于Unity3D的上述技術特點,采用Unity3D引擎進行虛擬仿真博物館漫游系統(tǒng)的設計開發(fā)在技術層面是可行的。
虛擬仿真博物館漫游系統(tǒng)開發(fā)流程見圖1。
(1)三維場景的構建。該模塊用于完成虛擬仿真系統(tǒng)的三維模型素材制作,主要包括博物館場景建模、物品建模兩個部分。其中場景建模屬于建筑模型,需要先繪制二維平面圖,再進行三維建模,因此采用CAD制圖軟件按照1∶1比例進行精準的二維平面圖形繪制,再生成三維場景;物品建模使用3DMAX軟件完成。
(2)模型材質的制作。三維場景的視覺效果好壞很大一部分原因是取決于模型材質的精美程度[4],因此繪制材質時,物體本身細節(jié)的表現(xiàn)、明暗層次的自然過渡、不同材質的特質區(qū)分都需要十分注意。材質繪制常用的軟件有Photoshop、Illustrator等軟件工具。
(3)素材導入。Unity3D引擎支持三維模型、圖形、視頻、音頻等各類素材的規(guī)范化格式導入,其中三維模型統(tǒng)一導入格式為FBX;圖形圖像文件導入格式為PSD、TIFF、JPG、TGA、PNG、GIF、BMP、IFF、PICT 等,需要注意的是Unity3D導入圖片后統(tǒng)一默認為Texture(紋理)模式,不能直接應用于項目開發(fā),需要手動轉換為Sprite(圖片精靈)模式;音頻導入格式包括AIFF、WAV、MP3、OGG 4種[5],其中AIFF、WAV為原生音頻,可在不損失音頻質量的前提下進行播放,但文件占用存儲空間較大;MP3為有損壓縮的音頻格式,雖然節(jié)省了大量的存儲空間,但每次播放都需要消耗CPU周期進行解碼,并且開發(fā)環(huán)境需要配置適用的解碼器;視頻導入格式包括MOV、MPG、MPEG、MP4、AVI等[6],基于Windows平臺的開發(fā)環(huán)境中還需要額外配置QuickTime插件才能正常播放視頻。
Unity3D工程開發(fā):Unity3D引擎以工程為單位進行獨立項目的開發(fā)。創(chuàng)建工程后,基于工程完成項目開發(fā)的具體工作,包括:場景搭建、前端界面設計、交互功能實現(xiàn)、數(shù)據(jù)管理、項目發(fā)布5個步驟。
步驟1:場景搭建。導入場景模型素材后,首先設置攝像機位置、視域、遮罩范圍等參數(shù),如場景需要假設多個攝像機,還需設置優(yōu)先級;其次制作天空盒,Unity3D提供了天空盒插件,配合制作好的天空素材即可在虛擬場景中模擬出藍天白云、黑夜星空等天空效果;場景光源設置,Unity3D提供了多種光源效果,包括自然光和方向光兩大類,可以營造室內外不同環(huán)境下的光源效果[7];為場景中的墻體、物品等需要交互的模型對象設置剛體屬性和添加碰撞體組件,使其具有交互檢測的功能。
步驟2:前端界面設計,Unity3D內置有UI組件用于交互界面的設計,并提供了二維與三維兩種設計模式,二維模式常用于二維屏幕終端發(fā)布的項目界面設計,例如PC終端和手機移動終端;三維模式用于VR終端發(fā)布的項目界面設計,例如VR眼鏡、VR頭盔。
步驟3:交互功能實現(xiàn)。首先需要進行觸發(fā)條件的設置,Unity3D主要通過檢測攝像機與場景中其他物體的剛體碰撞,或是攝像機的射線與物體的碰撞來觸發(fā)交互事件,因此需要預先為交互物體設置剛體屬性和添加碰撞體組件;交互功能的編程實現(xiàn),Unity3D內置有碰撞器檢測函數(shù)與觸發(fā)器檢測函數(shù)分別對上述兩個碰撞方式進行檢測,檢測條件滿足后即可觸發(fā)相應的交互事件。
步驟4:數(shù)據(jù)管理。Unity3D后端數(shù)據(jù)庫的連接與訪問需要通過導入MySql.Data.MySqlClient插件實現(xiàn),該插件提供了在C#語言中引用SQL語句連接數(shù)據(jù)庫的方法以及對數(shù)據(jù)增、刪、改、查的操作接口。
步驟5:項目發(fā)布。Unity3D的項目發(fā)布以場景為單位,當項目中包含多個場景時,需要按照場景的順序逐一添加至項目中,再進行打包發(fā)布。除此,Unity3D還提供了項目發(fā)布的個性化參數(shù)設置,包括項目名稱、開發(fā)者署名、軟件圖標、項目啟動的展示界面、項目分辨率、項目內存優(yōu)化、項目發(fā)布平臺選擇等。
系統(tǒng)交互功能設計包括3個模塊:UI交互、藏品交互和場景漫游,見圖2。
UI交互模塊:用于實現(xiàn)用戶注冊、登錄及數(shù)據(jù)管理等功能。用戶可以通過系統(tǒng)提供的UI界面進行數(shù)據(jù)的輸入、查詢、修改、存儲、刪除等具體操作。
場景交互模塊:用于實現(xiàn)用戶與模型和場景的交互。模型交互主要針對藏品模型可以進行物體的放大、縮小、旋轉、移動以及藏品信息的文字展示、音頻和視頻播放等;場景交互用于實現(xiàn)多個場景之間的切換。
場景漫游模塊:用于實現(xiàn)用戶在虛擬場景中的漫游,用戶可以第一個人稱視角在虛擬場景中漫游,游覽各個展覽點。場景設置有邊界碰撞檢測,防止用戶移出到場景之外。
場景交互與場景漫游兩個功能模塊,系統(tǒng)提供了鍵盤、觸屏、鼠標3種操作模式,用戶可以根據(jù)應用環(huán)境的不同靈活選擇操作方式。
精美的三維場景制作可以帶給用戶更加美觀和逼真的游覽體驗,但同時也會增加系統(tǒng)開銷,導致系統(tǒng)運行效率低下,甚至出現(xiàn)系統(tǒng)卡頓。因此在場景結構優(yōu)化與最終的項目展示效果之間需要通過合理的優(yōu)化策略以達到兩者之間的平衡。三維場景的資源優(yōu)化可以從3個方面實現(xiàn)。
(1)三維場景的模型優(yōu)化。在三維場景建模過程中,通過模型的合理布線與面數(shù)控制等方式,在保證模型細節(jié)呈現(xiàn)的同時盡可能簡化模型的結構。例如模型布線應以三角形邊面為主,盡量減少不規(guī)則邊面的形成,因為三角形邊面的計算效率是最高的;另外模型曲面的計算開銷是非常大的,因此盡量減少曲面的構成可以有效提高模型的計算效率,并以高質量的材質繪制彌補模型的細節(jié)損失。
(2)減少不必要的模型面構建。例如場景地面的處理,Unity3D內置的平面幾何體輔以材質即可呈現(xiàn)較好的地面效果,因此場景建模就可以省略地面的處理;再如像展柜、植物、裝飾物等不需要交互的靜態(tài)模型,被放置在場景中固定不動的情況下,部分面會與場景重疊的而無法展示,因此也可以省略處理。
(3)三維模型的資源調度優(yōu)化。Unity3D加載場景時會對場景中的所有模型進行計算和渲染,切換新的場景時,原來場景中的模型信息仍然會被保留在內存當中,需要通過調用Destroy方法才能手動清理。如果不清理原來的模型信息,會導致項目運行時間越長,內存消耗越大,系統(tǒng)效率越低;如果清理原有的模型信息,則會導致每次切換場景都要花費較長的時間對模型重新進行計算和渲染,而場景與場景之間頻繁切換的話,也會造成很大的計算開銷。資源調度優(yōu)化主要采取的策略是將場景的模型進行分類管理和選擇調度,將其劃分為共有模型資源與私有模型資源兩類,通過Unity3D的資源管理器對模型進行分類管理,屬于場景之間的共有模型資源的,在場景切換時不做銷毀處理;屬于單獨場景私有模型資源的,在切換場景時進行銷毀,以有效提高場景資源的調度效率。
場景中可交互模型都需要添加剛體組件,攝像機與物體的碰撞或射線檢測都是基于與剛體的接觸,剛體組件提供了位置、縮放比例、旋轉角度等屬性,以便開發(fā)者自行調整剛體框架,使其能將模型完全包裹。場景較小而交互對象較多的情況下,各模型的剛體之間很容易出現(xiàn)前后遮擋或邊界重疊的問題,導致交互事件觸發(fā)錯誤,用戶想與A物體交互,觸發(fā)的卻是B物體。解決這一問題最簡單的方法是盡可能縮小剛體的邊界,例如只將模型的一部分包裹在剛體中,縮小交互檢測的范圍。但剛體是透明不可見的,用戶交互時只能看到交互對象的整體模型,看不到剛體范圍,就導致用戶無法準確觸發(fā)該物品的交互事件,需要不斷的移動視角進行嘗試。針對上述場景交互的準確觸發(fā)問題,基于范圍的碰撞檢測是較為有效的解決方法。
基于范圍的碰撞檢測策略,需要先對攝像機添加碰撞機組件,Unity3D提供了盒狀、球狀、膠囊狀3種碰撞機,由于本系統(tǒng)采用的是第一人稱視角,需要交互的范圍鎖定在視角的前、后方向,因此適用于膠囊狀范圍檢測,通過調整膠囊碰撞機Y軸的縮放比例,可以確定視角前后的碰撞檢測距離。當攝像機視角在場景中前后移動時,進入到碰撞機范圍的物體將以數(shù)組形式返回各自的屬性信息,攝像機通過范圍檢測即可鎖定進入交互范圍的物體,依據(jù)物體的屬性信息可以動態(tài)計算出距離攝像機最近的物體,觸發(fā)與其的交互。通過范圍檢測,可以將距離較遠的物體進行剔除,處于范圍內的物體通過動態(tài)算法始終鎖定距離攝像機視角前方(Z軸正方向)最近的物體進行交互。
場景漫游的邊界檢測是防止用戶視角移出的重要手段,但視角具有一定的視野范圍,當攝像機檢測到與邊界發(fā)生碰撞時,視野范圍已經(jīng)超出了場景邊界?;诜秶呐鲎矙z測策略同樣可以解決這一問題,但其范圍檢測主要是視角的前后方向,無法檢測到其他方向的邊界,因此還需要結合剛體碰撞檢測,為場景邊界添加剛體組件。為了進一步改善用戶的漫游體驗,當視角前方檢測到場景邊界的同時,可通過編程動態(tài)調整視角的視野范圍,當視角退出邊界檢測范圍后,還原其視野屬性,以確保視野始終處于場景之內。
本文針對虛擬現(xiàn)實技術在虛擬博物館游覽中的應用及主要技術問題進行了研究和探討,并設計開發(fā)了一個基于Unity3D的虛擬仿真博物館漫游系統(tǒng),該系統(tǒng)具有場景漫游、用戶交互、數(shù)據(jù)管理等主要功能,并在場景構建和資源調度、交互觸發(fā)準確性、場景漫游邊界視角控制3個方面進行了策略改進與優(yōu)化。