王 濤,高賢強
(1.西安航空學院 教務處,陜西 西安 710077;2.塔里木大學 信息工程學院,新疆 阿拉爾 843300)
基于U3D和kinect1.0月光下舞蹈互動游戲的設計與實現
王 濤1,高賢強2
(1.西安航空學院 教務處,陜西 西安 710077;2.塔里木大學 信息工程學院,新疆 阿拉爾 843300)
傳統的游戲設備缺乏軀體活動,體感設備kinect的出現解決了這一問題。通過kinect1.0制作體感識別模塊KinectSuperMario;通過untiy3D中U2D制作“月光下舞蹈的游戲”模塊MoonLight;通過體感識別模塊發送系統鍵盤和鼠標消息對游戲進行控制,闡釋了“月光下舞蹈的游戲”模塊功能、環境需求、游戲的開發流程、測試結果等。
體感設備;kinect;unity3D;月光下舞蹈的游戲
Unity3D是由Unity Technologies開發的一個讓玩家輕松創建諸如三維視頻游戲、建筑可視化、實時三維動畫等類型互動內容的多平臺的綜合型游戲開發工具[1],是一個全面整合的專業游戲引擎,開發游戲簡單快捷,效果逼真。微軟推出的體感設備kinect則打破了游戲中人和電腦交互的傳統模式,僅通過肢體語言和聲音就可以實現用戶的輸入。
本文將兩者結合開發的游戲“月光下的舞蹈”介紹給讀者,并從游戲的原理、功能、流程等方面做了闡釋。
1.1 游戲的原理
該系統將海豚、鯨魚、鯊魚、企鵝、海豹這五種海洋動物的捕食、嬉戲、沖浪、賣萌等高清視頻畫面投影到墻上,通過kinect 1.0傳感器采集人物的各種動作,以人的控制動作為指令控制游戲,互動程序采用VS2012 C#開發[2-3]。原理見圖1。
1.2 游戲的功能需求
從海豚、鯨魚、鯊魚、企鵝、海豹五種海洋動物相關高清視頻中提取它們捕食、嬉戲、沖浪、賣萌等精彩畫面,制作體感互動操作界面,體感者可根據操作界面提示選擇調取相關精彩畫面。如果30秒內無人物被kinect檢測到,返回到游戲主界面,開始隨機播放各種動物動畫。游戲界面設置:月光下舞蹈之窗制作成動態界面作為游戲主界面,二級界面分海豚、鯨魚、鯊魚、企鵝、海豹五個動態界面,互動過程中由二級界面進入相關視頻動態(動畫幀調取)界面,并匹配合適背景音樂。游戲交互動作的設定:通過程序識別人體簡單動作,如擺左手或擺右手等,實現一級、二級到視頻幀序列的切換。
啟動游戲后,進入游戲主界面并開始播放動畫。當kinect檢測到有人時,游戲停止播放動畫,返回游戲主界面。當人物做動作一:胸前揮動右手,游戲界面向“左方向”切換游戲主題;當人物做動作二:胸前揮動左手,游戲界面向“右方向”切換游戲主題;當人物做動作三:抬起右手超過頭頂時,游戲根據當前選擇的游戲主題隨機播放相關的視頻;當人物做動作四:抬起左手超過頭頂時,由當前的游戲主題視頻返回游戲主界面,整個游戲流程如圖2所示。

圖2 游戲的流程圖
本游戲開發分為兩個部分:基于WPF的kinect1.0體感識別程序KinectSuperMario的開發和基于U3D游戲MoonLight的開發,兩個模塊通過在KinectSuperMario中增加鍵盤模擬消息進行交互控制。本文所寫的KinectSuperMario是一個萬能的模塊,只需要增加新的動作識別函數和模擬鍵盤消息,就可以體感控制windows上的所有應用程序。
3.1 基于WPF的kinect1.0體感識別程序KinectSuperMario
3.1.1 該模塊整體開發的流程
該程序模塊使用WPF框架,整個交互系統的流程為:先完成Kinect的初始化工作并啟動設備,然后獲取骨骼和語音數據[4-5];其次,在空間位置中持續追蹤游戲玩家的動作,并根據產生的數據來判斷玩家是否滿足四種動作中的一種。如果滿足則模擬鍵盤發送對應的鍵盤消息,該消息會被U3D程序的接口捕獲,并進行相應處理。
3.1.2 程序之間消息接口
此處以“胸前擺左手”消息交互為例,其代碼為:
if(!isBackGestureActive &&!isForwardGestureActive){isBackGestureActive=true;
System.Threading.Thread.Sleep(300);//停秒調節動作識別的頻率單位毫秒
Counttime3=0;Counttime4=0;System.Windows.Forms.SendKeys.SendWait(“{A}”);}}。其中函數System.Windows.Forms.SendKeys.SendWait(“{A}”)為模擬人按下鍵盤中的“A”鍵,用于和U3D游戲模塊預留“接口”進行通信來完成游戲功能。該“體感識別程序”的效果見圖3。
3.1.3 體感識別KinectSuperMario中的體感識別代碼
在KinectGestures中實現四個動作的識別,在程序中定義了四個枚舉變量(isWaveRightHand,isWaveLeftHand,isRaiseRightHand和isRaiseLeftHand)來表示四個動作,此處以游戲中“胸前揮動右手”為例,其代碼如下:
if(s.Joints[JointType.HandRight].Position.Y>s.Joints[JointType.ElbowRight].Position.Y){
if(s.Joints[JointType.HandRight].Position.X>s.Joints[JointType.ElbowRight].Position.X)
{GestureStepRight=1;}}
mygest=Gestures.WaveRightHand;}}}

3.2 基于U3D的游戲程序
3.2.1 游戲邏輯的處理
以往游戲引擎是配合使用C++、C#或JAVA來進行開發,其在邏輯、聲音、視頻播放、UI界面的處理過于復雜,且效果不好,U3D的出現很好地解決了這個問題。本文為了簡化邏輯,將游戲分為6個子模塊(即6個場景),分別為:游戲主界面、海豚主題模塊、鯨魚主題模塊、鯊魚主題模塊、企鵝主題模塊和海豹主題模塊,讓各個主題模塊和游戲主界面調用交互,避免了在一個.C文件中復雜的完成整個游戲邏輯功能[6],U3D提供了場景切換函數為Application.LoadLevel(“three”),該函數的意思是加載一個新的場景“three”,并銷毀當前運行的場景。
3.2.2 游戲中視頻的播放
視頻播放的主函數為void OnGUI(){GetComponent
3.2.3 播放動畫幀
游戲主界面效果是采用播放動畫幀的方式來處理,為了靈活播放圖片幀,本程序中寫了一個播放動畫幀的類[7]:
class FrameAnimation {private float fps=15f;private Rect drawPos;private float time=0;
public void DrawFrameAnimation(Texture[]frameTex){}//默認方式播放圖片
public void DrawFrameAnimation1(Texture[]frameTex,int start,int end)//播放指定數目的圖片
public FrameAnimation(Rect drawPos,float fps)//加參數的構造函數}
3.2.4 體感識別程序KinectSuperMario和U3D游戲程序MoonLight接口
為了和kinect體感識別程序KinectSuperMario進行交互,在該程序中預留了6個鍵盤接收接口,分別為:按a鍵往前播放;按b鍵往后播放;按c鍵進入某個場景;按d鍵退出某個場景;按e鍵表示有人進入;按f表示人物離開。接收消息函數為Input.GetKeyDown (“a”),它的意思是接收用戶的鍵盤輸入值‘a’[8]。而kinect體感識別程序發送消息函數為:System.Windows.Forms.SendKeys.SendWait。
3.2.5 MoonLight中每個主題模塊的處理效果
對于每個主題,都精選了5個以上的720P視頻片段/2分鐘,并保證主界面進入每個主題時都不會播放相同的視頻(即隨機播放視頻),且每個視頻片段都配置不同的音效,采用聲音切片AudioClip類,播放函數為PlayClipAtPoint[9],該“U3D游戲程序MoonLight”的效果見圖4。
4.1 系統主要設備配置和技術參數
該系統主要設備的配置和參數:
(1)計算機:win7 旗艦版32位;處理器:i5 2.5-GHz或更快的處理器,4GB 內存以上,DX11圖形適配器,160G硬盤或以上。
(2)投影機:4500流明,分辨率1024*768,視現場環境亮度而定。
(3)游戲開發軟件為unity3D 4.6.3及以上版本。
(4)顯卡的顯存必須要1G以上。
(5)第一代Kinect for Windows v1和 Kinect SDK 1.8。
(6)輔材:包括USB 2.0信號放大器,視頻信號放大器,室外屏蔽網線等。
4.2 游戲的測試結果

表1 測試結果統計
*注:對該游戲進行24小時測試,功能正常無宕機
4.3 游戲的相關截圖
對于一個嶄新的環境,部署如下:
(1)首先確保WIN7系統所有的驅動都安裝成功[10],并安裝netframework4.5以上版本和KinectSDK-v1.8-Setup.exe;
(2)安裝QuickTime_7.79.exe以上版本,用于unity3d視頻播放解碼;
(3)安裝startup-delayer-v3.0b363.exe,之后把版本moonlight.exe和KinectSuperMario.exe制作為啟動快捷鍵方式,并將moonlight.exe和KinectSuperMario.exe的快捷鍵方式加入到startup-delayer-v3.0b363中,設置KinectSuperMario.exe延時啟動時間為1分30秒,moonlight.exe為2分10秒;
(4)安裝Silverlight.exe包,目的是kinect設備驅動自會發現。
至此,整個游戲的運行環境搭建完畢,現場的效果見圖8。
[1] 王濤. 人機交互多媒體教學系統淺析[J].西安航空學院學報,2015,33(1):43-44.
[2] 鄧見光,袁華強. 基于游戲引擎的三維虛擬漫游系統實現[J].計算機應用與軟件,2012,29(03):122-124.
[3] 胡興中,吳彬,郭雪峰,等.Unity 4.x從入門到精通[M]. 北京:中國鐵道出版社,2013:32-35.
[4] 杜釗君.基于體感傳感器的手勢識別及人機交互系統研究[D].武漢:武漢科技大學,2013:21-24.
[5] 晏浩. 基于kinect的三維多手指跟蹤算法及應用[D].杭州:浙江大學,2013:31-36.
[6] 翁穎明.卓越游戲的誕生:游戲設計內幕[M].北京:清華大學出版社,2010:55-60.
[7] CREIGHTON R H.Unity3D Game Development by Example Beginner's Guide[M].Birmingham:Packt Publishing,2010:12-43.
[8] 宣雨松.Unity3D游戲開發[M].北京:人民郵電出版社,2012:51-70.
[9] 吳志達.一個基于Unity3D游戲引擎的體感游戲研究與實現[D].廣州:中山大學,2012:38-56.
[10] 朱惠娟.基于Unity3D的虛擬漫游系統[J].計算機系統應用,2012,21(10):41-52.
[責任編輯、校對:東 艷]
Design and Implementation of Interactive Moonlight Dance Game Based on the U3D and Kinect1.0
WANGTao1,GAOXian-qiang2
(1.Office of Academic Affairs,Xi'an Aeronautical University,Xi'an 710077,China; 2.College of Information Engineering,Tarim University,Alar 843300,China)
Traditional game devices lack body movements,and the appearance kinect solves the problem.Somatosensory identification module KinectSuperMario is produced through kinect1.0,"Moonlight"produced through U2D of untiy3D,and game is controlled through somatosensory identification module by sending system keyboard and mouse messages.The paper expounds the design and development flow,module function, environment demand,and test result of the"interactive moonlight dance software".
somatosensory devices;kinect;unity3D;interactive moonlight dance
2016-12-21
王濤(1984-),男,陜西西安人,講師,主要從事圖形圖像處理研究和U3D游戲開發。
TP311.52
A
1008-9233(2017)01-0068-05