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