張帥,周恒杰,張琳濤
(三明學(xué)院信息工程學(xué)院,福建三明,365004)
基于Unity3D和Kinect的體感跑酷游戲開發(fā)關(guān)鍵技術(shù)設(shè)計(jì)與實(shí)現(xiàn)
張帥,周恒杰,張琳濤
(三明學(xué)院信息工程學(xué)院,福建三明,365004)
針對游戲中虛擬現(xiàn)實(shí)游戲的趣味性,交互性,以及虛擬現(xiàn)實(shí)游戲的操縱性等問題,設(shè)計(jì)基于Kinect體感設(shè)備和Unity3D游戲,對體感設(shè)備捕獲到的數(shù)據(jù)進(jìn)行分析,使游戲中的人物的行動符合我們的預(yù)期,研究場景的實(shí)時動態(tài)加載、場景優(yōu)化和NGUI等關(guān)鍵技術(shù),以滿足游戲的交互性,趣味性和游戲真實(shí)性,對今后體感游戲的開發(fā)有一定的參考價值。
Unity3D引擎;Kinect體感設(shè)備;體感識別;NGUI插件
隨著輸入設(shè)備的發(fā)展越來越先進(jìn),體感捕捉設(shè)備漸漸映入人們的眼簾。據(jù)調(diào)查,目前以XBox360為平臺的體感游戲(如Kinect大冒險(xiǎn)和運(yùn)動會、舞蹈大師、基于體感技術(shù)的切水果等)越來越豐富,玩法越來越新穎。與傳統(tǒng)的采用輸入設(shè)備(如鍵盤、鼠標(biāo)或觸屏)來操作游戲,體感游戲采用Kinect體感捕捉設(shè)備,玩家能夠通過自己的肢體動作來控制游戲中角色的行動,感覺如置身游戲之中,增強(qiáng)了游戲的趣味性,且游戲中的操作易于掌控,通過一些簡單上手的肢體動作來操控。在游戲設(shè)計(jì)與實(shí)現(xiàn)方面,有著關(guān)卡簡單,目標(biāo)明確,趣味性強(qiáng)等特點(diǎn)。
本文基于Unity3D引擎,利用Maya三維建模軟件完成游戲場景搭建,在Unity3D進(jìn)行腳本開發(fā),使用Kinect體感設(shè)備來進(jìn)行人物控制。重點(diǎn)研究Kinect設(shè)備的體感數(shù)據(jù)處理以及Unity中模型簡化、腳本驅(qū)動等關(guān)鍵技術(shù),最終完成PC端體感游戲的發(fā)布,為今后Kinect體感游戲開發(fā)提供參考。
1.1 Kinect傳感器
Kinect骨架追蹤處理流程的核心是一個無論周圍環(huán)境的光照條件如何,都可以讓Kinect感知世界的CMOS紅外傳感器。該傳感器通過黑白光譜的方式來感知環(huán)境:純黑代表無窮遠(yuǎn),純白代表無窮近。黑白間的灰色地帶對應(yīng)物體到傳感器的物理距離[1]。Kinect負(fù)責(zé)遍歷圖像中較可能是人體的移動物體,類似于人眼下意識地聚焦在移動物體上。然后Kinect會對景深圖像進(jìn)行像素級評估,來辨別人體的不同部位。同時,這一過程必須以優(yōu)化的預(yù)處理來縮短響應(yīng)時間。Kinect采用分割策略來將人體從背景環(huán)境中區(qū)分出來,即從噪音中提取出有用信號。Kinect可以主動追蹤最多兩個玩家的全身骨架,或者被動追蹤最多四名玩家的形體和位置。在這一階段,我們?yōu)槊總€被追蹤的玩家在景深圖像中創(chuàng)建了所謂的分割遮罩,這是一種將背景物體(比如椅子和寵物等)剔除后的景深圖像。在后面的處理流程中僅僅傳送分割遮罩的部分,以減輕體感計(jì)算量。
1.2體感設(shè)備的數(shù)據(jù)處理
在Unity3D中,接入Kinect顯示的是一個三維的骨架。Kinect能識別全身21個點(diǎn),包括頭部,腰部,左手,右手、左腳、右腳并對其進(jìn)行細(xì)分,例如,左手的部分就包括左肩部,左手肘部,左手腕處等[2]。如圖1。
圖1 Kinect骨架
在Unity3D中給每一個斷點(diǎn)創(chuàng)建一個Sphere,并重命名成部位的名稱,病給每個部位打上標(biāo)簽(Tag),方便根據(jù)標(biāo)簽(Tag)進(jìn)行場景中物體的查找。
Head=GameObject.FindWithTag("HEAD");
//獲取斷點(diǎn)信息,通過Tag
在系統(tǒng)中還應(yīng)處理三維端點(diǎn)信息來判定人物的動作。例如,需要判斷人物是否進(jìn)行跳躍,可以假設(shè)如果頭部骨架的坐標(biāo)超過了一個事先設(shè)定好的值的時候,就執(zhí)行跳躍操作。
floatheadHigh=1.6f;//設(shè)置一個最高點(diǎn)的值
if(Head.transform.localPosition.y>headHigh&&isJump){ ....
}//滿足條件執(zhí)行跳躍功能如果要識別一個身體向左或者向右扭動的動作時,就需要計(jì)算腰部斷點(diǎn)和肩部端點(diǎn)的夾角。將腰部端點(diǎn)和肩部端點(diǎn)的正切值計(jì)算出來,在進(jìn)行反三角,即可得到其弧度,在進(jìn)行弧度的判斷,就可以得知身體是否扭動。
KL=(Shoulder_left.transform.position.y-Hip_center.transform.position.y)/(Shoulder_left.transform.position.x-Hip_center.transform.position.x);
KL=Mathf.Atan(KL);
if(KL>=0.8f&&KL<){//判斷夾角是否大于0.8
……
}
在Unity3D中只需要具體研究身體部位上每個端點(diǎn)是如何移動的,從中分析其數(shù)學(xué)關(guān)系,通過簡單的數(shù)學(xué)計(jì)算,便可得到我們需要的結(jié)果。
1.3手掌模擬鼠標(biāo)技術(shù)
在體感游戲中,一切的操作都應(yīng)該用身體動作來實(shí)現(xiàn)。因此,在開始界面的控制上,通過手掌模擬鼠標(biāo)來進(jìn)行懸空操作,進(jìn)行按鈕的選擇。
rightHand=GameObject.FindGameObjectWithTag("HAND_RIGHT");
初始化右手物體,這樣,就能獲取到其相關(guān)的位置信息。
tempX=XValue*(rightHand.transform.localPosition.x+0.3f);
tempY=YValue*((rightHand.transform.localPosition.y-1.5f)*(-1.0f));
自定義一個手勢識別區(qū)間,通過計(jì)算,得到手掌在屏幕上顯示的位置。
GUI.DrawTexture(new Rect(tempX,tempY,50,50),texture);
①壩體堆石區(qū)中部采用部分砂粒料填筑,范圍為EL 895~940 m。本工程壩料分區(qū)充分利用了爆破堆石料力學(xué)性能好、抗剪強(qiáng)度高、休止角大、滲透系數(shù)大的特點(diǎn),把它布置在堆石區(qū)上下游提高壩坡穩(wěn)定性,布置在底部可加強(qiáng)壩體排水。壩體堆石區(qū)中部布置砂礫石區(qū),充分利用砂礫石具有高壓縮模量的特點(diǎn),減少壩體沉降變形。
通過自帶的GUI相關(guān)API把模擬出的鼠標(biāo)顯示在計(jì)算機(jī)顯示屏上,texture為顯示鼠標(biāo)的UI。當(dāng)模擬出的鼠標(biāo)在按鈕上懸停的時候觸發(fā)一個定時器(time-=0.04f;time是事先定義好的值,當(dāng)time等于0且鼠標(biāo)懸停在物體上,則觸發(fā)按鈕,執(zhí)行按鈕的功能)。
2.1游戲場景設(shè)計(jì)
在模型設(shè)計(jì)上,采用三維建模軟件(3DMAX,MAYA等)設(shè)計(jì)完整的3D模型并且導(dǎo)入。并且制作好規(guī)格相同可以拼接的模型。在Unity3D中,簡單的地形和簡單的基本對象(如樹木,花草等)可在Unity3D中直接進(jìn)行創(chuàng)建,需要特定的模型則需要通過Maya這類三維軟件來進(jìn)行創(chuàng)建。默認(rèn)情況下Unity3D中的單位為1cm,而Maya轉(zhuǎn)Unity3D的比例為0.01∶1,因此,在創(chuàng)建模型之前,需要做好模型大小的規(guī)劃操作。對于模型的面片數(shù),控制在32500個之內(nèi)為佳。當(dāng)一個三維模型創(chuàng)建完畢之后,需要對其進(jìn)行命名規(guī)范。
2.2游戲場景優(yōu)化
Unity3D中,并不支持所有的材質(zhì)球,只有標(biāo)準(zhǔn)材質(zhì)球如Blin,Lambert等材質(zhì)會被Unity3D支持。并且貼圖的分辨率必須為2的N次冪才能被Untiy3D所接受。在游戲場景中,不斷的實(shí)例化燈光和場景必然會消耗更多的CPU和GPU,通過燈光烘焙技術(shù),將燈光的效果烘焙到貼圖上,就不必每次都實(shí)例化燈光消耗GPU的渲染計(jì)算,從而使游戲變得流暢。遮擋剔除技術(shù)在游戲優(yōu)中必不可缺的一種技術(shù)[3]。遮擋剔除的運(yùn)行將通過在場景中使用一個虛擬的攝像機(jī)來創(chuàng)建一個物體潛在可視性狀態(tài)(set)的層級。這些數(shù)據(jù)可以讓每個運(yùn)行時間內(nèi)的攝像機(jī)來確定什么能看見什么看不見。通過這些數(shù)據(jù),Unity將確定只把可以看見的物體送去渲染。這將降低Drawcalls的數(shù)量并提供游戲的運(yùn)行效率。
2.3地圖控制
在Unity3D中,開辟存放需要實(shí)例化模型塊的數(shù)組,在這個數(shù)組中,存放的都是拼接地圖的零件。拼接地圖需要的技巧就是使用隊(duì)列進(jìn)行拼接。首先初始化一個隊(duì)列,并將模型實(shí)例化,存入隊(duì)列中,同時定義一個TempPos的變量來存下當(dāng)前的位置坐標(biāo),將當(dāng)前的位置坐標(biāo)加上模型寬度的一半,在這個坐標(biāo)下實(shí)例化下一個模型塊,然后存下當(dāng)前坐標(biāo),無限上述步驟。一般我們會把隊(duì)列定義在有50個元素左右,當(dāng)存滿之后,只需要從隊(duì)尾出隊(duì)一個元素,做坐標(biāo)的變換,然后再讓物體入隊(duì),這樣,就能重復(fù)使用這些物體,減少內(nèi)存和CPU消耗。
private Queue<GameObject>Terrian;
通過C#自身的泛型容器來生成一個隊(duì)列類。
StartRun();
}
通過一個For循環(huán)來進(jìn)行道路的初始化。
temp=Instantiate(NoZhangAi,terrianPosition,thisRotation)as GameObject;
temp.transform.parent=father.transform;
temp.transform.localPosition=Vector3.zero;
temp.transform.localPosition=terrianPosition;
temp.transform.localEulerAngles=Vector3.zero;
Terrian.Enqueue(temp);
terrianPosition.z+=12.0f;
count++;
在道路初始化方面,通過Instantiate方法實(shí)例化出道路模型,同時把道路加到一個父節(jié)點(diǎn)上,方便進(jìn)行場景的管理,設(shè)置改模型的方向和旋轉(zhuǎn)為默認(rèn)值,把模型壓入隊(duì)列中,同時改變實(shí)例化坐標(biāo)為下一個點(diǎn)。到達(dá)一定的節(jié)點(diǎn),就生成彎道的模型,同時改變從此以后所有直道模型的旋轉(zhuǎn)屬性。向左轉(zhuǎn)時,角度加上90°,向右轉(zhuǎn)時,角度加上180°,角度變化的規(guī)律取決于道路模型是創(chuàng)建的規(guī)格。
terrianR.y+=180.0f;
terrianRotation.eulerAngles=terrianR;
temp=(GameObject)Instantiate(Terrian_Turn,terrianPosition,terrianRotation);
道路的更新依據(jù)隊(duì)列的性質(zhì),先進(jìn)后出,在需要更新道路時,只需將隊(duì)尾的物體調(diào)用到隊(duì)首即可。代碼如下:
Destroy(Terrian.Dequeue());做相應(yīng)的變換之后,再將物體入隊(duì):
Terrian.Enqueue(temp);無限場景的處理就是基于隊(duì)列這個結(jié)構(gòu),不斷的出隊(duì)入隊(duì),不斷的拼接地圖來達(dá)到這個效果。
2.4 NGUI插件的使用
2.4.1 NGUI介紹及其創(chuàng)建UI
在Unity3D中,創(chuàng)建并且管理UI的解決法案大部分是使用NGUI插件。NGUI是嚴(yán)格遵循KISS原則并用C#編寫的Unity(適用于專業(yè)版和免費(fèi)版)插件,提供強(qiáng)大的UI系統(tǒng)和事件通知框架[4]。其代碼簡潔,這意味著程序員可以很容易地?cái)U(kuò)展NGUI的功能或調(diào)節(jié)已有功能。對所有其他用戶而言,則是更高的性能、更低的學(xué)習(xí)難度和更加有趣。在NGUI中,通過Widget Tool來創(chuàng)建所需要的UI。
2.4.2 NGUI圖集工具
在游戲開發(fā)的過程中,往往需要很多的圖片素材。隨著圖片素材的增多,圖片漸漸的變得難以管理,而且占的空間越來越多,會產(chǎn)生很多的冗余。這時,使用圖集工具是最好的選擇。將圖片打包成圖集,方面管理,減少圖片所占空間冗余[5]。選擇NGUI>OPEN>ALTASMAKER選項(xiàng),選擇圖集打包工具,選擇相應(yīng)的圖片進(jìn)行打包,NGUI會自動生成相關(guān)的材質(zhì)球和貼圖文件,方便快捷,見圖2~3。
圖2創(chuàng)建的圖集材質(zhì)球
圖3 NGUI圖集打包工具
2.4.3 NGUI事件監(jiān)聽機(jī)制
NGUI的監(jiān)聽事件我們通過C#委托機(jī)制來實(shí)現(xiàn)監(jiān)聽。
GameObject button=GameObject.Find("UIRoot(2D)/Camera/Anchor/Panel/LoadUI/Main-Common/Button");
UIEventListener.Get(button).onClick=ButtonClick;
獲取需要監(jiān)聽的對像,通過UIEventListener中的代理來監(jiān)聽事件。上述代碼中把ButtonClick這個方法賦予onClick這個事件。當(dāng)UIEventListener接收到信息時,則會自動調(diào)用該事件。
在Unity3D中創(chuàng)建一個新的工程并導(dǎo)入KinectForUnity插件包,完成Kinect對Unity3D的支持。同時導(dǎo)入NGUI插件包,以便基于NGUI進(jìn)行UI的開發(fā)。在菜單欄中選擇BuildSettings,將保存好的場景文件拖拽到對話框里,完成游戲的導(dǎo)出,見圖4~5。
圖4資源列表
圖5游戲編輯視窗
本文主要研究基于Unity3D的Kinect體感游戲開發(fā),深入剖析體感識別的基礎(chǔ)數(shù)學(xué)思想,巧妙利用場景自由變換技術(shù)完成跑酷游戲的基本設(shè)計(jì)思路和NGUI的監(jiān)聽事件及其用法,對體感游戲的開發(fā)具有一定參考價值。
[1]MICHELLE MENARD.Game d evelopment with Unity[M].史曉明,李強(qiáng),譯.北京:機(jī)械工業(yè)出版社,2012.
[2]張帆.Unity3D游戲開發(fā)基礎(chǔ)[M].杭州:浙江工商大學(xué)出版社,2013.
[3]宣雨松.Unity3D游戲開發(fā)[M].北京:人民郵電出版社,2012.
[4]劉明昆.三維游戲設(shè)計(jì)師寶典[M].成都:四川電子音像出版中心,2005.
[5]wILLIAM R SHERMAN,ALAN B C RAIG.Understanding v irtual r eality:i nterface,a pplication and d esign[M].San Fransisco:Morgan Kaufmann,2002.
(責(zé)任編輯:朱聯(lián)九)
The Research and Implementation of the Key Technology of the Somatosensory of Parkour Games Based on Unity3D and Kinect
ZHANG Shuai,ZHOU Heng-jie,ZHANG Lin-tao
(Insititule of Information Engineering,Sanming University,Sanming 365004,China)
According to the problems of the virtual reality game in the funny,interactivity and themanipulation of the virtual reality games,design game based on Kinect somatosensory equipment and Unity3D game engine,analyzed the captured data from the Kinect somatosensory equipment,making the character in the game consisted with our expectations.To meet the game's interactivity,funny and game authenticity,researched the key technologies such as the Real-time and dynam ics loaded the scene,the scene optimization and NGUIand so on to meet the game’s interactivity,funny and game authenticity,for the certain?reference value of the future developmentof somatosensory game.
Unity3D;Kinect;somatosensory;recognition;NGUI
TP311.52
A
1673-4343(2015)06-0032-05
10.14098/j.cn35-1288/z.2015.06.007
2015-05-19
福建省大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練項(xiàng)目(201411311061);福建省教育廳科技項(xiàng)目(JA13295))
張帥,女,山西交城人,講師。主要研究方向:虛擬現(xiàn)實(shí)與游戲開發(fā)。