劉晉鋼 劉云萍 周曉青
摘要:本文將Kinect作為游戲的控制器,以Unity作為FTG游戲的引擎,在Visual Studio 2013平臺(tái)下,使用WPF和KinectSDK作為的開發(fā)工具,在虛擬格斗類游戲中的數(shù)據(jù)傳輸采用UDP和TCP協(xié)議。功能測(cè)試和性能測(cè)試表明骨骼數(shù)據(jù)驅(qū)動(dòng)模型合理,Kinect成為游戲的控制器這種方案可行。
關(guān)鍵詞:體感設(shè)備;格斗類游戲;Unity
中圖分類號(hào):TP391.41 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2018)09-0149-03
1 引言
Kinect設(shè)計(jì)之初是作為XBOX360的體感設(shè)備,針對(duì)游戲領(lǐng)域而開發(fā)的。但是在2011年Kinect for Windows的推出和代碼的開源使得程序員可以選擇C#、C++、VB.NET等多種語(yǔ)言進(jìn)行開發(fā)。因此吸引了大批的程序開發(fā)人員針對(duì)Kinect開發(fā)。也正因?yàn)槿绱?,使它不再局限于游戲領(lǐng)域,而延伸到工業(yè)設(shè)計(jì)、電子商務(wù)、醫(yī)療保健、物聯(lián)網(wǎng)、智能家庭、教育和照顧老人等各個(gè)領(lǐng)域[1]。
Kinect的核心技術(shù)和創(chuàng)新技術(shù)是能夠獲取目標(biāo)物體的深度數(shù)據(jù)和人體的骨骼數(shù)據(jù),如今Kinect主要被用于識(shí)別手勢(shì)、四肢動(dòng)作、人體檢測(cè)等方面,在國(guó)內(nèi)很多大學(xué)實(shí)驗(yàn)室和一些交互公司也在很多領(lǐng)域做了不少Kinect的應(yīng)用開發(fā)和研究。比如在市場(chǎng)上已經(jīng)應(yīng)用的虛擬試衣鏡,就是應(yīng)用了的體感技術(shù)和增強(qiáng)現(xiàn)實(shí)技術(shù),需要買衣服的顧客不需要實(shí)體試穿和換裝,只需站在試衣鏡前通過(guò)手勢(shì)操作就能看到虛擬的衣服穿在身上的效果。體感虛擬試衣間操作更方便、交互更加自然,從而能給用戶帶來(lái)全新的購(gòu)衣體驗(yàn)[2]。
在明尼蘇達(dá)大學(xué)兒童發(fā)展研究所,研究人員借Kinect收集和追蹤兒童的語(yǔ)音和行為特征,開展自閉癥譜系障礙(ASD)研究。日本知名的機(jī)器人制造商安川機(jī)電(Yaskawa),在服務(wù)機(jī)器人Smartpal上安裝Kinect,成功研制出Smartpal VII機(jī)器人。華南理工大學(xué)的金連文教授也利用體感技術(shù)開發(fā)了虛擬手寫識(shí)別系統(tǒng),用戶只要在空間中用手指自由的移動(dòng),系統(tǒng)就能識(shí)別出書寫的字符。隨著Kinect的應(yīng)用越廣泛,加上無(wú)數(shù)開發(fā)者的智慧,在不久的將來(lái)Kinect必定會(huì)與我們的學(xué)習(xí)、生活更密切相關(guān),在越來(lái)越多的領(lǐng)域也會(huì)出現(xiàn)Kinect的身影[3-4]。
FTG指格斗類游戲。FTG類游戲是從ACT動(dòng)作類游戲脫胎分化出來(lái)的,由玩家操縱各種角色與電腦或另一玩家所控制的角色進(jìn)行一對(duì)一決斗的游戲。一直以來(lái),由于輸入設(shè)備發(fā)展的緩慢,使得市面上的幾乎所有FTG游戲都使用鍵盤加鼠標(biāo)的方式進(jìn)行游戲,例如著名的《街霸》系列、《侍魂》系列、《拳皇》系列等;3D格斗游戲如《鐵拳》、《VR戰(zhàn)士》等。由于Kinect設(shè)備的種種特性,使得其就像是為FTG游戲量身定做的一樣,可以使游戲的操作更方便交互、更自然,從而能給用戶帶來(lái)全新的游戲體驗(yàn)。
2 關(guān)鍵技術(shù)
2.1 Kinect與Unity3D集成原理
Kinect的設(shè)計(jì)思想是將人視為控制器。在Kinect For Windows面世后,基于它的游戲和應(yīng)用在發(fā)布會(huì)上出現(xiàn),已引起人們廣泛關(guān)注。人們體會(huì)到自然交互語(yǔ)言的強(qiáng)大震撼力。隨著游戲的升級(jí),高效的游戲開發(fā)工具也成為開發(fā)者的期盼,而Unity3D高效率的開發(fā)模塊、強(qiáng)大的渲染效果及可擴(kuò)展的能力,使Unity3D贏得了開發(fā)者的青睞,在2012年成為最受歡迎的游戲開發(fā)引擎,尤其在處理三維場(chǎng)景的編輯和交互方面,使用基于腳本的開發(fā)方式簡(jiǎn)單又方便。但是Unity3D這種高效開發(fā)與體感硬件Kinect并不兼容。因?yàn)镵inect SDK對(duì)開發(fā)者開放的接口調(diào)用方式有兩種,一種是基于C++的頭文件和靜態(tài)鏈接庫(kù)的方式,另一種是程序集的方式。這兩種方式在Unity3D中均無(wú)法直接調(diào)用。盡管如此,在C# Mono平臺(tái)中提供與非托管程序的使用方式,導(dǎo)入Dll文件,用戶可通過(guò)自定義數(shù)據(jù)結(jié)構(gòu)和算法,能夠?qū)崿F(xiàn)對(duì)Kinect中獲得的數(shù)據(jù)重新組織,即可以在Unity 3D中使用,在開發(fā)時(shí),編寫中間件來(lái)請(qǐng)求Kinect服務(wù),并將數(shù)據(jù)傳輸給Unity實(shí)例[5]。
2.2 骨骼數(shù)據(jù)驅(qū)動(dòng)模型
Kinect與Unity運(yùn)行平臺(tái)的差異性,Kinect需要的運(yùn)行環(huán)境最低.NET4.0,而Unity腳本支持的運(yùn)行環(huán)境最高是.NET3.5。又因?yàn)镵inect數(shù)據(jù)是一幀一幀的傳輸過(guò)來(lái)的,而且數(shù)據(jù)具有時(shí)效性,因此使用效率較高的UDP協(xié)議傳送Kinect數(shù)據(jù)。由于Kinect骨骼數(shù)據(jù)是關(guān)節(jié)的坐標(biāo)數(shù)據(jù),而且在Kinect1.0版本下并不能使用關(guān)節(jié)角度信息,因此需要建立骨骼數(shù)據(jù)驅(qū)動(dòng)模型,使用骨骼位置直接驅(qū)動(dòng)骨骼數(shù)據(jù)。再動(dòng)態(tài)計(jì)算部分角度,使用模型驅(qū)動(dòng)方式。
3 系統(tǒng)分析與設(shè)計(jì)
3.1 系統(tǒng)分析
該系統(tǒng)將使用Unity游戲引擎設(shè)計(jì)并實(shí)現(xiàn)一個(gè)簡(jiǎn)易FTG游戲。該游戲?qū)⒂辛己玫慕换ソ缑?,有明確的邏輯順序,可以雙人對(duì)戰(zhàn)。
另外,該系統(tǒng)使用Kinect SDK與WPF開發(fā)Kinect數(shù)據(jù)接收器,將數(shù)據(jù)通過(guò)UDP,TCP發(fā)送到FTG游戲,使得FTG游戲可以利用Kinect的骨骼數(shù)據(jù),以通過(guò)肢體動(dòng)作控制游戲。
本系統(tǒng)可由游戲核心模塊、Kinect管理器和網(wǎng)絡(luò)輸入服務(wù)器三大部分組成。用戶作為客戶端調(diào)用Kinect管理器,從而頁(yè)獲取Kinect設(shè)備中的顏色數(shù)據(jù),場(chǎng)景深度數(shù)據(jù),骨骼數(shù)據(jù);還需要使用ROC遠(yuǎn)程對(duì)象傳輸協(xié)議將數(shù)據(jù)發(fā)送到游戲模塊。游戲模塊通過(guò)ROC遠(yuǎn)程對(duì)象傳輸協(xié)議接收數(shù)據(jù),并應(yīng)用于游戲模塊的對(duì)戰(zhàn)邏輯。
系統(tǒng)由三大部分組成。但作為一款格斗類游戲,又可以將其分為網(wǎng)絡(luò)輸入客戶端和游戲端。在網(wǎng)絡(luò)輸入客戶端的功能:首先,使用UDP、TCP協(xié)議與FTG游戲建立連接,以傳輸數(shù)據(jù)。接下來(lái),Kinect SDK獲取Kinect設(shè)備的顏色數(shù)據(jù),深度數(shù)據(jù),骨骼數(shù)據(jù)。最后,將采集來(lái)的骨骼數(shù)據(jù)發(fā)送到游戲,以驅(qū)動(dòng)游戲的角色動(dòng)作,游戲更新。在游戲端部分實(shí)現(xiàn)的功能有:接收并處理來(lái)自輸入客戶端和網(wǎng)絡(luò)端來(lái)的輸入消息;分類轉(zhuǎn)發(fā)骨骼幀數(shù)據(jù);驅(qū)動(dòng)角色模型運(yùn)動(dòng)(包適坐標(biāo)轉(zhuǎn)化、平移轉(zhuǎn)化、鏡像轉(zhuǎn)化等處理)和關(guān)聯(lián)游戲模型運(yùn)動(dòng),實(shí)現(xiàn)戰(zhàn)斗功能。系統(tǒng)中格斗角色具有生命、怒氣和技能三種屬性。其中,生命為零,該角色死亡,玩家被告知格斗失敗。怒氣與技能相聯(lián)系。若怒氣達(dá)到設(shè)定某值后,其釋放技能。反之,怒氣不夠,不足于釋放其技能。技能是一些效果酷炫,游戲中用傷害報(bào)表來(lái)體現(xiàn),若怒氣值滿足條件,可以使用技能。
3.2 數(shù)據(jù)采集
3.2.1 Kinect設(shè)備擺放位置
由于游戲需要人體的全身骨骼數(shù)據(jù)作為輸入數(shù)據(jù),因此需要對(duì)Kinect擺放位置以及Player活動(dòng)區(qū)域進(jìn)行控制,經(jīng)過(guò)反復(fù)計(jì)算和多角度測(cè)試,獲知Kinect擺放到Player正前方1米高度處。Player的活動(dòng)范圍距離Kinect設(shè)備2米到4米處,在距Kinect左右各一米處,一個(gè)Player站左邊,一個(gè)站右邊。如圖1所示。圖中地形塊為4*4(米)的區(qū)域,黃色區(qū)域和藍(lán)色區(qū)域分別為2玩家的活動(dòng)區(qū)域,中心紅點(diǎn)為參考中心點(diǎn)。
3.2.2 Kinect數(shù)據(jù)采集
Kinect for Windows SDK支持主動(dòng)獲取和被動(dòng)獲取兩種數(shù)據(jù)獲取方式。主動(dòng)獲取方式是不斷查詢有沒有新數(shù)據(jù)到來(lái)。如果有新數(shù)據(jù),則可以取出數(shù)據(jù),否則返回空。通過(guò)這種方式需要主動(dòng)以輪詢的方式去控制。獲取數(shù)據(jù)更自由,但可能會(huì)額外消耗資源。被動(dòng)獲取是事件觸發(fā)式,當(dāng)有數(shù)據(jù)到來(lái)的時(shí)候調(diào)用相應(yīng)回調(diào)函數(shù),無(wú)數(shù)據(jù)的時(shí)候沒有任何操作。通過(guò)實(shí)驗(yàn)驗(yàn)證兩種數(shù)據(jù)獲取方式,當(dāng)選擇被動(dòng)獲取數(shù)據(jù),用事件觸發(fā)式時(shí),游戲性能降低,由于無(wú)法處理龐大的數(shù)據(jù)。因此設(shè)計(jì)師選用主動(dòng)獲取的方式,需要的時(shí)候去獲取,因?yàn)橄到y(tǒng)默認(rèn)的30幀數(shù)據(jù),經(jīng)過(guò)測(cè)試,每秒5幀基本可以使用,每秒10幀已經(jīng)可以平滑過(guò)度,完全不需要多余的處理。系統(tǒng)采用主動(dòng)獲取數(shù)據(jù)方式比被動(dòng)獲取輪詢方式,降低了系統(tǒng)壓力,減少網(wǎng)絡(luò)占用,更合理、更高效。
3.2.3 數(shù)據(jù)通信
由于Unity的.net平臺(tái)與Kinect的兼容性問(wèn)題,設(shè)計(jì)采用了跨進(jìn)程的網(wǎng)絡(luò)通信。數(shù)據(jù)發(fā)送時(shí),將采集到的數(shù)據(jù)分裝成NetInput Message的子類對(duì)象,再將該對(duì)象序列化為二進(jìn)制數(shù)據(jù)。如果數(shù)據(jù)較大,超出了UDP所能攜帶的數(shù)據(jù)長(zhǎng)度,就拆分成多個(gè)DataWrap對(duì)象,否則包裝成一個(gè)DataWrap對(duì)象,將這些DataWrap對(duì)象分別序列化為二進(jìn)制數(shù)據(jù),并通過(guò)UDP或者TCP發(fā)送出去。在在接收端,不斷的接收數(shù)據(jù)報(bào),并將接收到的數(shù)據(jù)報(bào)數(shù)據(jù)反序列化為DataWrap對(duì)象,將這些對(duì)象收集起來(lái),并進(jìn)行合成處理,將提取出來(lái)的完整的數(shù)據(jù)反序列化為NetInputMessage的子類對(duì)象,觸發(fā)相應(yīng)事件,通知應(yīng)用程序相關(guān)模塊處理這些消息數(shù)據(jù)。其中,DataWrap分包主要涉及2個(gè)類,一個(gè)是DataWrap類,主要用于分裝數(shù)據(jù),拆分?jǐn)?shù)據(jù)。另一個(gè)是DataWrapsCollector類,主要用于將DataWrap對(duì)象進(jìn)行組裝,還原數(shù)據(jù)。
3.3 游戲設(shè)計(jì)
3.3.1 游戲輸入消息
游戲輸入消息分為兩大類。一類是以Kinect數(shù)據(jù)為主,另一類以語(yǔ)音數(shù)據(jù)為主。Kinect部分?jǐn)?shù)據(jù)包括了Kinect的彩色攝像頭采集的色彩數(shù)據(jù),深度攝像頭采集的景深數(shù)據(jù),還有通過(guò)引擎對(duì)深度數(shù)據(jù)分析,計(jì)算出的骨骼數(shù)據(jù)。而語(yǔ)音數(shù)據(jù)部分包括識(shí)別出的語(yǔ)音命令,語(yǔ)音字符,以及語(yǔ)音識(shí)別相關(guān)參數(shù)。在本次系統(tǒng)開發(fā)時(shí),語(yǔ)音識(shí)別數(shù)據(jù)未啟用,在以后的繼續(xù)開發(fā)設(shè)計(jì)中會(huì)使用到這些數(shù)據(jù)消息,故此保留語(yǔ)音數(shù)據(jù)類。在客戶端接收到相應(yīng)的消息之后,就會(huì)產(chǎn)生相應(yīng)的事件,觸發(fā)對(duì)應(yīng)的功能模塊去處理相應(yīng)的消息,達(dá)到控制游戲運(yùn)作的功能。
3.3.2 骨骼驅(qū)動(dòng)
在3D動(dòng)畫的世界中,動(dòng)畫的驅(qū)動(dòng)就是改變位置和方向。Kinect可以獲取骨骼的位置坐標(biāo)。使用骨骼坐標(biāo)驅(qū)動(dòng)游戲的模型是一種最簡(jiǎn)單有效的方案。如圖2所示,每個(gè)基本對(duì)象都對(duì)應(yīng)Kinect的一個(gè)骨骼位置,共20個(gè)。
本設(shè)計(jì)直接使用骨骼位置驅(qū)動(dòng)關(guān)鍵坐標(biāo),同時(shí)使用腳本計(jì)算出其他相關(guān)部分的位置、方向和大小。如圖3所示,每個(gè)關(guān)節(jié)位置(圓球)之間的圓柱通過(guò)2個(gè)相關(guān)關(guān)節(jié)位置計(jì)算出方向和位置。
將模型塊安置到骨骼點(diǎn)上,實(shí)現(xiàn)模型驅(qū)動(dòng)。取一個(gè)模型,使用三維建模工具將模型的頭、身體、手和腿等部位分割為單個(gè)模型,將這些單獨(dú)的模型分別提取出來(lái),導(dǎo)入到Unity游戲引擎中。再取出模型,將其安置到圓柱體上,進(jìn)行一定的位置平移,角度旋轉(zhuǎn)的調(diào)整,這樣,就做好隨著骨骼關(guān)節(jié)運(yùn)動(dòng)的人物模型。
3.3.3 游戲?qū)?zhàn)設(shè)計(jì)
在系統(tǒng)分析時(shí),提到格斗角色生命、怒氣和技能三種屬性,當(dāng)進(jìn)入游戲?qū)?zhàn)時(shí),再為角色加入打擊點(diǎn)和承受點(diǎn),如圖4玩家戰(zhàn)斗系統(tǒng)所示。圖4左邊4個(gè)紅色的小球分別是綁定到該角色四肢末端的4個(gè)打擊點(diǎn),右邊的綠色的球體是角色頭部的承受點(diǎn),而綠色立方體是角色身體部位的承受點(diǎn)。當(dāng)游戲運(yùn)行起來(lái)以后,這些碰撞球就將與其相應(yīng)部位保持位置相同。
4 測(cè)試
本系統(tǒng)設(shè)計(jì)硬件依賴度高,故選取Serialization和DataWrap兩個(gè)較獨(dú)立的類進(jìn)行功能測(cè)試,選用數(shù)組、字符串,長(zhǎng)數(shù)據(jù)、布爾類型數(shù)據(jù)作為輸入,實(shí)驗(yàn)結(jié)果與期望結(jié)果完全吻合,功能實(shí)現(xiàn)正常。
在性能測(cè)試時(shí),還是選用Serialization和DataWrap兩個(gè)類進(jìn)行測(cè)試。選用數(shù)組和長(zhǎng)數(shù)組類型數(shù)據(jù),采用序列化和反序列化操作時(shí),實(shí)測(cè)性能都不足1毫秒,比期望性能的2毫秒提高了很多,性能極高。完全可以滿足游戲需要。
5 結(jié)語(yǔ)
系統(tǒng)實(shí)現(xiàn)了Kinect體感設(shè)備采集數(shù)據(jù)、ROC數(shù)據(jù)傳輸、骨關(guān)節(jié)三維模型驅(qū)動(dòng)重要模塊。通過(guò)這些模塊,實(shí)現(xiàn)FTG(格斗類游戲)的人體體感控制,針對(duì)格斗類游戲特征分析,為游戲角色引入生命、怒氣、技能三種重要屬性。當(dāng)游戲角色進(jìn)入戰(zhàn)斗時(shí),明確身體的承受點(diǎn)。用不同類型的數(shù)據(jù),通過(guò)功能測(cè)試,實(shí)驗(yàn)結(jié)果與期望結(jié)果完全吻合。在性能測(cè)試時(shí),采用序列化和反序列化操作時(shí),實(shí)測(cè)性能遠(yuǎn)遠(yuǎn)高于期望性能。本課題達(dá)到了預(yù)期效果,人機(jī)交互界面良好,在用于體感游戲開發(fā),可降低開發(fā)成本,具有一定的社會(huì)推廣價(jià)值。
參考文獻(xiàn)
[1]朱濤,金國(guó)棟,蘆利斌.Kinect應(yīng)用概述及發(fā)展前[J].現(xiàn)代計(jì)算機(jī),2013,(6):8-11.
[2]況鷹.基于Kinect運(yùn)動(dòng)捕獲的三維虛擬試衣[D].廣州:華南理工大學(xué),2012.
[3]馬建榮,章蘇靜,李鳳.基于體感技術(shù)的親子互動(dòng)游戲設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)電化教育,2012,09:85-88.
[4]馬薈.連接未來(lái)的人機(jī)交互[J].互聯(lián)網(wǎng)周刊,2010,(7):64-66.
[5]劉晉鋼,劉衛(wèi)斌,劉晉霞. Kinect 與Unity3D 數(shù)據(jù)整合技術(shù)在體感游戲中的應(yīng)用研究[J]電腦開發(fā)與應(yīng)用,2014,(11):7-11.