張陽+楊長強+鄭慧平



摘 要:智能手機迅速普及,VR虛擬現實頭盔技術亦日趨成熟。將手機與VR頭盔結合,開發出虛擬現實的手機體感游戲。利用手機中的陀螺儀系統,實現慣性定位來捕獲人身體的變化,達到體感操作目的。使用Unity3D雙屏顯示與VR頭盔結合,通過手機便可身臨其境地體驗到沉浸式的虛擬現實效果。配合藍牙搖桿控制器,玩家通過佩戴裝載有智能手機的VR頭盔,即可體驗身臨其境的虛擬現實體感游戲。
關鍵詞:虛擬現實;Unity3D;VR;手機體感游戲
DOIDOI:10.11907/rjdk.171222
中圖分類號:TP319
文獻標識碼:A 文章編號文章編號:1672-7800(2017)008-0119-04
0 引言
VR虛擬現實技術是一種可以創建和體驗虛擬世界的計算機仿真系統。它利用計算機生成一種模擬環境,是一種多源信息融合的交互式三維動態視景和實體行為系統仿真[1]。2015年三星、谷歌、微軟等大型公司進軍VR市場,2016年被業內稱為VR元年。本文中的游戲使用的暴風魔鏡四代VR頭盔作為交互式硬件。
Unity3D游戲引擎平臺開放、交互友好,可使用C#、JS、Boo語言進行開發,并可發布成PC、網頁、安卓、蘋果、家用機等跨平臺應用版本,使用Unity3D可以更好地普及虛擬現實體感游戲。基于Unity3D開發并發布成手機應用,將安裝有應用的手機放入暴風魔鏡等主流VR頭盔中,使玩家沉浸式地體驗體感游戲。
1 概述
本游戲策劃取材于“真人CS”戶外對抗活動。游戲采用第一人稱視角,玩家佩戴VR頭盔后,通過頭部和身體的移動控制角色移動與玩家視野,用藍牙控制器控制游戲角色射擊。在360°沉浸式的VR視覺效果中,體感方式控制游戲,在游戲中取得資源,完成任務通過關卡。
程序開發分為美工開發、游戲場景與UI搭建、游戲程序設計、角色程序設計、VR系統配置幾個部分。游戲開發流程如圖1所示。
游戲設計過程:調用Unity官方API函數AnimationEvent創建動畫事件播放過場動畫,AudioSettings實現音頻控制,通過GUIContent界面內容、GUILayout界面布局、GUIStyleState界面風格狀態函數對界面內容進行編輯,實現模式選擇等功能。游戲中設置多處場景觸發器,當玩家抵達規定的地方時,觸發道具獲得與場景變化。游戲中玩家需要找到并操作智能計算機控制臺,關閉路徑上的陷阱,打開通過下一關卡的控制門。
VR系統開發需要使用可以放入手機的VR頭盔,游戲程序通過調用手機內的陀螺儀裝置實現慣性定位、虛擬漫游,并使用藍牙遙控器對手機中游戲應用進行控制。VR頭盔如圖2所示,藍牙遙控器如圖3所示。
人眼之所以能分辨出立體物體與平面物體,是因為人的兩個眼睛看到不同的視覺畫面。VR頭盔利用這一點,將人的兩個眼睛看到的畫面單獨分開顯示,這就要求在游戲開發時設置成雙屏畫面。雙屏畫面有細微差別,以供人眼看到后顯示出三維效果。游戲畫面如圖2所示,佩戴頭盔后的操作效果如圖2左下角所示。
2 游戲程序算法
2.1 A星算法
游戲設計了多種敵方機器人,要使敵方機器人進入防御狀態很容易,可通過設置坐標位置或采用Unity3D中的AI設計方法。但要讓敵人智能逼真地動起來,就需要用到相應的算法——A星算法。
A星算法在人工智能中是一種典型的啟發式搜索算法[2],解決搜索問題的過程就是從開始位置點經過每一個過程位置點到目標位置點的過程。這些點構成一個圖的數據結構,這個圖就是狀態空間,狀態空間搜索就是在這些點中找到一條從起點到終點的路徑過程。
一般情況下,使用的狀態空間搜索類似于數據結構中圖的遍歷方法,分為深度優先和廣度優先兩種搜索方式。廣度優先,顧名思義是從初始點一層一層向下找,直到找到目標為止。深度優先是按照層的順序先搜索完成一個分支,再搜索另一個分支,直至找到目標為止。當過程中的點過多時,無論是深度優先搜索還是廣度優先搜索,都會使得搜索效率降低,因此需要使用啟發式搜索算法。
之所以稱為啟發式搜索算法是因為這種算法只是一種猜測。啟發式搜索就是從起點對周圍每個位置點進行評估,將起點周圍點寫進open表中,計算出表中每個點的h(n)和g(n),得到評估值f(n),將f(n)較小的值寫進close表中,繼續將close表中周圍的點加入open表中,注意障礙物和已加入的點不作處理。逐個對位置點遍歷直到終點目標。啟發中的估價用估價函數表示:
f(n)=g(n)+h(n)(1)
函數表示的含義如下:f(n):節點n的估價函數;g(n):在狀態空間中從初始位置點到第n個位置點的實際代價;h(n):從n到目標節點最佳路徑的估計代價[3]。
h(n)是估計出來的,計算方法有多種,這里采用最方便的方法,即h(n)等于起點和終點所在行差的絕對值加上起點和終點所在列差的絕對值。h(n)在啟發搜索中對位置的估價起著很重要的作用。A星搜索在搜索時能夠利用啟發式信息智能地調整搜索策略。
A星搜索是一種迭代的有序搜索。從起點開始通過評價函數f*(n)評價點close表中各個鄰接點的狀態。若新的預測值小于之前迭代值則將該點作為新的迭代點,直到遍歷到終點為止。
定義如下:
f*(n)=g*(n)+h*(n)(2)
其中各函數表示的具體含義如下:g*(n):表示沿路徑從起點到當前點的移動耗費;h*(n):從第n個點到目標點的估算代價;f*(n):從初始點經過第n個點到達目標點的預計值[4]。將這個值與之前的迭代值比較,若小于迭代值便將該點加入“最優路徑”中,當迭代到目標點時迭代結束,得到的路徑便是“最優路徑”。endprint
A星算法思想就是從起始點開始不斷迭代的過程,下一個迭代點從目前點的周圍點產生,計算出目前點的f*(n)值和周圍點的f*(n)值,每次保留數值最小的f*(n)將其加入最優路徑表中。如此下去,直到迭代到終點為止。這是一個不斷搜索的過程,最后得到的路徑便是最優路徑。
2.2 OBB包圍盒碰撞檢測算法
三維物體的碰撞檢測比二維物體復雜得多,這里使用OBB包圍盒碰撞檢測算法實現。在游戲引擎中,對于場景物體進行表面凸分解,組織層次凸塊二叉樹,然后為凸塊構建OBB包圍盒,最后對凸塊進行三角形帶壓縮編碼來完成三維物體間的碰撞檢測[5]。
構建凸塊的OBB包圍盒,凸塊所有頂點的坐標向量協方差矩陣計算如下:
Cjk=13n∑ni=0(pjipki+qjiqki+rjirki)(3)
μ=13n∑ni=0(pi+qi+ri)1≤j,k≤3(4)
p、q、r為凸塊頂點的三維坐標系,μ為三維坐標凸塊的向量均值,C是協方差矩陣。碰撞檢測中遍歷物體的層次凸塊二叉樹,可采用SAT來判斷兩個凸多邊形是否發生重疊,檢測凸塊OBB包圍盒是否相交,以實現碰撞檢測算法,最終完成相應的游戲開發設計。
2.3 陀螺儀空間定位算法
主流手機中都內置有陀螺儀傳感器,三軸磁傳感器的坐標方向是參考地磁場,當運動控制器件指向發生變化時,相對于地磁場會有一定變化。當運動控制器件指向任意方向時,地磁場產生的作用會分配在磁傳感器的三軸上,表示為如下關系式:
axisX2+axisY2+axisZ2=Cgnd(5)
axisX:地磁場向量在傳感器X軸上的分量;axisY:地磁場向量在傳感器Y軸上的分量;axisZ:地磁場向量在傳感器Z軸上的分量; Cgnd:地磁場向量目前作用于運動控制器件的磁場強度。axisX、axisY、axisZ是目前地磁傳感器三軸采集的磁場強度值,進行必要的數據處理后,可計算出平面指向角α和俯仰角δ:
α=arctanaxisYaxisX(6)
δ=arctanaxisZaxisX2+axisY2(7)
重力加速度方向在某一固定位置是恒定的[5],根據重力加速度在多軸加速度傳感器上的分量可計算出此時設備的俯仰角。
根據計算出的俯仰角信息、加速度信息以及重力感應信息,實時定位用戶的頭部運動狀態,根據用戶的頭部變化、視角變化,控制游戲引擎中的攝像機位置,實現攝像機完全跟隨用戶視角變化而移動,達到VR虛擬現實效果。
3 游戲實現
Unity3D 是一款功能強大的專業游戲開發引擎,可用于創建3D交互式應用程序,也可以跨平臺發布。它支持絕大多數文件格式,具有易用、靈活的著色器、支持聯網、實時三維圖形混音頻流及視頻流[6]等功能。本游戲使用 MAYA 進行場景建模。為了達到更好的視覺效果,在建模過程中進行了一系列優化,以充分達到逼真沉浸式的體驗效果。
3.1 游戲開發需求分析
在游戲開發設計中,需求分析是首要也是最重要的環節,良好的分析活動有助于避免或盡早剔除早期錯誤,提高游戲開發效率與質量,降低開發成本。
此游戲故事情節開始于一家邪惡集團派遣各式各樣的殺人暴徒和機器人來毀滅城市。玩家可以選擇獨闖虎穴、直搗黃龍,潛入總部毀滅基地。游戲角色是一位機槍手,游戲氛圍刺激緊張,在玩家還在研究手中武器時,敵人可能已經沖上來。正是這種駭人的對手,使玩家必須打起十二分精神,仔細觀察周圍,找到一切隱性的通關秘訣。精致逼真的3D場景,眾多的特殊道具,帶給玩家全新的視覺和玩法體驗。
根據劇情游戲設計3個關卡:第1關以科幻色彩濃厚的工業大樓作為主要場景,任務是玩家潛入軍事基地收集情報,殺死邪惡暴徒并破壞設備,然后順利逃出軍事基地;第2關任務是潛入基地深處殺死幕后指揮官并破壞設備,在到達指揮室的過程中,玩家要不斷收集場景中紙片,紙片內容會指引玩家找到指揮官;第3關玩家需要到達基地總部引爆炸彈,毀掉整個軍事基地,贏得最后勝利。
在游戲中玩家扮演機槍手,可射擊或躲避,可操縱敵軍設備,通過藍牙控制器以及頭部和身體移動來控制方向、躲避敵人、射擊、更換裝備等。在突破游戲設計關卡后,完成設定的劇情任務便可獲勝。
3.2 場景優化
三維虛擬游戲中,模型建立是非常重要的部分,逼真的場景能夠迅速吸引玩家的眼球,激發玩家的興趣。然而VR游戲又不同于普通游戲,最大差別在于VR的渲染是普通游戲的兩倍,因此在性能優化上必須下很大功夫。
(1)使用法線貼圖優化表面。在搭建模型方面,為了實現逼真效果,必然要建立很多畫面,導致渲染次數增加,性能消耗增大。為解決這一問題,最直接的方法便是改建模,每個模型減掉一半的面來實現,但這樣逼真效果就會降低。在保證高性能和高逼真度的情況下,本文使用法線貼圖優化表面。
(2)烘焙技術。在Unity中,實時光照可帶來很好的體驗效果,但由于手機CPU有限,實時光照過多會導致渲染次數增加,最終反映在畫面上便是抖動嚴重,出現卡頓眩暈現象。為了解決這個問題,在游戲中選擇一個實時光照,其它作為烘焙光照。光照探針(lightprobe)能對靜態物品產生一個模擬光照,但這個光照是靜態的,在游戲開始時進行渲染,游戲過程中不會重復渲染。這樣做的好處就是在游戲開始時只做一次渲染,不必進行重復渲染,大大提高了渲染效率。
(3)遮擋剔除技術。游戲中每個被展示的部分放在一個特別的包中,稱之為“描繪指令”(draw call),通過這個包傳遞到3D部分在屏幕上顯示[7]。CPU負責相應模型和場景的包裝和顯示。場景中每一顆子彈消耗的字節和一個角色消耗的字節是一樣的,如果不降低 draw call,電腦就會把場景中所有的物體都進行渲染,嚴重增加了CPU的負載,降低了渲染效率。解決這個問題需要用到遮擋剔除技術。遮擋剔除即當物體被其它物體遮擋,不出現在攝像機可視范圍內時,不對其進行渲染。遮擋剔除并不是自動完成的,需要進行相應設置。首先關卡中的幾何體必須分割成不同尺寸的塊,每個塊生成一個可見列表,當攝像機位于該范圍內時激活列表,不在列表中的將其剔除。endprint
(4)LOD技術。該技術需要建兩個模型,一個面數多,較為逼真,一個面數少,較為粗糙,具體執行過程如下:定義兩個關鍵距離D1和D2作為攝像機和場景距離,當實際距離小于D1時,調用高清模型,當距離大于D2時,調用較粗糙模型。通過選擇不同精度模型,大量減少繪制的頂點數目,從而對游戲場景的實時效果進行優化。在Unity中可以通過Component→Rendering→LODGroup進行操作,選擇需要控制的模型以及進行距離設置。
(5)像素優化。overdraw指一個像素被多次繪制,像素優化的重點便是降低overdraw。控制繪制順序,便是為了最大限度地避免overdraws。在PC上,資源無限,為了得到最準確的渲染結果,繪制順序可能是從后往前繪制不透明物體,然后再繪制透明物體進行混合。但在移動平臺上,這種方式會造成大量的overdraw。從前往后繪制之所以可以減少overdraw,都是因為深度檢驗的功勞[8]。
在Unity中,Shader中被設置為“Geometry” 隊列的對象都是從前往后繪制,而其它固定隊列(如“Transparent”、“Overla”等)的物體,則都是從后往前繪制。這意味著,可以盡量把物體的隊列設置為“Geometry” ,還可以充分利用Unity隊列來控制繪制順序。例如,天空盒子幾乎覆蓋了所有像素,并且它永遠會在所有物體的后面。因此,可以將它的隊列設置為“Geometry+1”,這樣就可保證降低overdraws。
3.3 代碼優化
代碼編寫過程中,能夠使用單例就盡量少用靜態。單例在程序中只保留一份,而靜態是多個;使用對象池對重復使用的物體進行統一管理;使用預加載方式,對一些資源加載造成的卡頓進行處理;盡量不使用foreach,而是使用for。foreach會涉及到迭代器的使用,而每一次循環所產生的迭代會帶來24 Bytes的垃圾,循環10次就是240Bytes;不要直接訪問gameobject的tag屬性,比如if (go.tag ==“machine”)最好換成if (go.CompareTag (“machine”)),因為訪問物體的tag屬性會在堆上額外分配空間,如果在循環中這么處理,留下的垃圾就可想而知了;對代碼多一些重構處理,程序的架構設計必須耦合性低,易于擴展。
3.4 CPU優化
CPU優化可通過減少Draw Calls實現,平時用的最多的還有批處理。所謂批處理就是將很多物體一起處理的意思,條件是同一材質物體。對于同一材質物體,除了頂點數據的差異外無其它差別,將這些頂點數據合并起來交給CUP處理,便是一次批處理,這大大降低了CUP的消耗。
Unity中有兩種批處理方式:動態批處理和靜態批處理。動態批處理會對每一幀進行計算,大量增加CUP開銷;靜態批處理可使游戲引擎盡量降低繪制物體所產生的DrawCall。由于合并后的物體需要額外內存資源來存儲,所以內存占用會增加,CPU資源會減少。在繪制圖形,例如桌子、椅子等時,可以在編輯器里設置成靜態,所有具有相同材質的物體會被組合成一個網絡,調用一個繪制,降低了CUP消耗[9]。
3.5 特殊效果
VR中第一人稱能很好地模擬機槍手的視角,再加上真實的環境、氣氛、聲音,玩家很容易沉浸在游戲中,本游戲通過環境氣氛、特效、光影(烘焙)和聲音等方面進行強化。
3.6 游戲敵人AI功能
人工智能在游戲中非常重要,它可通過一些隨機的數字讓敵人做一些動作或邏輯,在Unity中通過AI腳本程序實現。傳統的射擊游戲設計,都是通過一套AI規則進行判斷,無論玩家做出什么行為,都會根據AI規則作出相應的行動,因為確定性太強,易使玩家覺得單調,因此,需要引入更多的隨機性。
為使機器人AI 更具智能,加入了模糊概率算法,提高了不確定性,給玩家一種新奇感。當玩家靠近敵人并在敵人視線之內,敵人便會進行攻擊,可以通過腳本設定敵人攻擊速度以及移動速度、命中率等。腳本寫得足夠詳細,游戲玩起來才足夠靈活。
針對游戲需求,設計的非玩家角色控制算法具備主動和被動控制兩種狀態[10]。處于被動時,要考慮是否被攻擊為觸發條件以及作出相應對策,如果非玩家角色被觸發則轉向主動狀態。在主動狀態時,如果有目標進入一個特定的距離范圍,非玩家角色就進入攻擊模式,否則處于防備狀態。
4 結語
本文著重闡述了游戲開發過程中涉及到的算法、場景搭建規范以及優化技巧,通過復雜的AI系統創造出更加真實的角色行為,大大增強了游戲的逼真性及可玩性。游戲玩法多樣,故事情節豐富。玩家戴著VR頭盔,手持藍牙遙控器,通過頭部和身體的移動,便能盡情享受激戰中帶來的快感。
VR技術日趨成熟,新的應用層出不窮,在醫療、教育、建筑等行業應用逐步發展,但VR游戲依然是VR的重要發展部分。如何做到泛而不濫、內容精良,在策劃和優化上要下功夫。本文著重闡述了游戲開發中涉及到的優化方法,以提高游戲的流暢性及逼真度,無論是場景搭建還是AI設計都會給用戶帶來全新的體驗。
參考文獻:
[1] 陳浩磊,鄒湘軍,陳燕,等.虛擬現實技術的最新發展與展望[J].中國科技論文在線,2011,20(8):1-15.
[2] 林中盛.基于DGPS/GIS機場場面交通管理系統的研究與開發[D].南京:南京航空航天大學, 2004.
[3] 劉爽.基于VRML的虛擬現實場景漫游技術研究與實現[D].長春:吉林大學,2007.
[4] 魏博.基于cocos2d-x跨平臺引擎的趣味籃球游戲設計與開發[D].西安:西安電子科技大學,2014.
[5] 實時碰撞檢測技術研究[EB/OL].[ 2012-09-04].http://www.docin.com.
[6] 伍傳敏,張帥,邱錦明.基于Unity3D的FPS游戲設計與開發[J].三明學院學報,2012,29(2):2-6.
[7] J LU,Z PAN,H LIN,et al.Virtual leaning environment for medical education based on VRML and VTK[J].Computers & Graphics ,2014(6):25-26.
[8] P L WEISS,A S JESSEL.Vitual reality application to work[J].Work,2001(2):25-26.
[9] 申薇,夏利文.虛擬現實技術[M].北京:希望出版社,2012.
[10] 陳雪梅.基于 Unity3D 的手機游戲開發[J].電子技術與軟件工程,2016,45(1):71-72.endprint