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