Kinect結合Unity3D引擎開發體感遊戲(一) 頂 原

   最近公司項目需要做科技館的體感遊戲,以前也沒接觸過遊戲,雖然以前自己也是想做遊戲,我想大部分都是學編程出來來做遊戲,哈哈(請允許我淫笑一下,終於可以做這方面)。雖然以前沒接觸過體感遊戲,看到的體驗也是大部分看到的視頻,幸好現在網絡還是比較發達,上網大概了體感遊戲開發,目前比較好的是Unity3D和Kinect結合交互進行開發。現在心裏的感覺用句話說:哥現在也走在世界技術最前言,TMD碉堡了!
  9月7號開始查閱網上的資料,一直沒有找到詳盡而又簡單的方案。網上目前我看到就三種方法,說是三種方法說白了就一種:中間件。形散而神不散--散文的最高境界(其實我語文不好,對不起祖國氣我的期望,嗚嗚、、、)三種方法如下:

1.卡耐基梅隆的kinectWrapper.unitypackage;

2.OpenNI官方提供的OpenNI_Unity_Toolkit-0.9.7.4.unitypackage(現在官方不提供更新與支持了,支持的版本unity3.4,在往上版本會出現很多問題,需要修改很多地方,比較麻煩);

3.自己寫的交互的中間件,我在網上看見高手自己的寫的中間件,封裝爲DLL,現在通過這段時間動手實現,發現自己寫一個這樣的中間件其實也不難,後期也自己準備寫一個。 我在採用的第一種方法,原因上面三點大概說來了,第二點以後考慮支持的版本和官方的態度,所以暫時不考慮;第三種目前自己還沒寫,目前來說也不太現實,也暫時不考慮考慮。所以目前情況就暫時考慮第一種;

 廢話說了那麼多,相信各位機油們早就寂寞難耐了,現在就切入正題:

一、Unity和Kinect交互的環境配置 我目前所使用的Unity3D的版本是Unity3.5; 使用的Kinect SDK版本是SDK1.6; Kinect和Unity交互的卡耐基梅隆的kinectWrapper.unitypackage方法是使用CMU的封裝,這個方法支持的Kinect SDK版本是SDK1.0,要想使用1.6版本以上的kinect SDK,就要做一些相應的修改。完整的方案如下(這個也爲什麼上面說後期打算自己封裝一個類似這樣組件DLL):

1、安裝Uinty3D我使用的Unity3D版本是3.5,上官網下載(需要註冊,才能用,我推薦大家去付點錢,我是自己找的破解碼,聲明不支持這樣的行爲,大家懂就好)。

2、安裝Kinect SDK我使用的SDK版本是1.6,可以在Kinect for Windows官方網站上下載。

3、在Unity3D工程中,如果需要使用和kinect交互,那麼就需要在這個工程中導入卡耐基梅隆的kinectWrapper.unitypackage。百度怎麼用大家都懂吧(需要用kinect SDK版本是1.6以上版本(1,7以上版本還沒試過替換是否可以,理論上應該也可以),就要下載KinectWrapperPackage替換文件並替換導入包中的KinectInterop.cs和KinectSensor.cs這兩個文件即可) 好啦!目前準備工作都ok了!

二、簡單Kinect Wrapper Package for Unity3D包含了所有我們開發unity+kinect需要用到的腳本。

1.導入包之後,所有我們需要的資源都會出現在project面板中,具體來說是以下的一些資源: 在此輸入圖片描述

2.Scenes KinectExample - 示例場景,這個例子向你展示瞭如何通過在每一個kinect 可以追蹤的骨骼點上放置小球來產生骨骼運動。

Prefabs Kinect_Prefab- 包含了我們開發unity+kinect程序所必需的所有腳本。但是它並沒有包含你需要的用於控制模型的控制器(controller)。 KinectPointMan - KinectPointController這個控制器(controller)是怎樣使用的。

Kinect KinectModelControllerV2 - 需要將這個腳本拖放到你想要應用kinect控制的模型上。爲了讓模型能夠跟上人的節奏,你需要將模型上控制模型動作的關鍵骨骼拖放到這個腳本暴漏的合適的變量中 ,也就是將模型中的骨骼與kincet識別到的人的骨骼綁定起來。另外這個腳本暴漏的變量中,還有一個變量時標識模型是受哪個玩家控制。 KinectPointController - 需要將這個腳本拖放到場景中的遊戲物體上。但是這個遊戲物體不是模型,而是由一系列分別代表頭部、肩部、手等人體部位的點組成。你需要將遊戲物體中的這些關鍵點都拖放到這個腳本暴漏的外部變量中。這樣就可以使用kinect控制遊戲物體了

DisplayDepth - 得到深度圖像。

DisplayColor - 得到RGB圖像。

KinectRecorder - 用於記錄你的動作,併爲kinect模擬器(emulator)產生回放文件。

KinectEmulator - 模擬kinect設備.和KinectRecorder產生的回放文件一起工作。

KinectSensor - 從Kinect設備中取得數據。需要替換這個文件使用特用版本的SDK.

DeviceOrEmulator - 設置使用kinect物理設備還是kinect模擬設備.

SkeletonWrapper - 腳本抓取骨骼數據.

DepthWrapper - 腳本抓取深度圖像數據.

KinectInterop - 從Microsoft Kinect SDK中抓取數據.

三、使用KinectWrapperPackage包要想在自己的工程中 首先需要用unity3D創建一個空工程,然後將kinectWrapper.unitypackage導入這個包到unity中,然後經過下面的步驟完成交互。

1、設置Kinect_Prefab前面提到過了,如果在Unity中和Kinect交互,Kinect_Prefab這個遊戲物體是必不可少的。 這個物體需要存在於你的場景中的某處。所以當你切換場景時,它仍舊存在着,因此你不必在每個場景中都實例一個Kinect_Prefab。 在Unity3D中,找到project面板中的Kinect_Prefab直接拖拽到Hierarchy面板就可以了。

2、控制遊戲中的角色爲了控制場景中的角色的移動,你需要將KinectModelControllerV2這個腳本拖拽到場景中的模型上,並綁定骨骼; 當然你爲了控制一系列的遊戲物體,你需要將KinectPointController拖拽這些物體上。 下面分別說明這個腳本的使用(這兩個腳本需要自己更具情況去定製)。

控制器:KinectPointController: 在場景中創建一個空物體對象,作爲你想要控制的容器。 將其他的物體拖拽到剛剛創建的空物體中,並放置到相同的位置。使剛纔創建的空物體成爲這些物體的父節點。 拖拽KinectPointController腳本到這些物體的父節點上。 選中父節點,在Inspector面板中暴漏的變量中,找到Sw變量 (該變量表示Skeleton Wrapper).拖拽當前場景中Kinect_Prefab賦給這個變量。 拖拽你想利用Kinect控制的每一個物體到Inspector面板對應的合適的變量中。 設置Player變量(代表玩家)和Mask變量(代表哪些骨骼收到監控). 在此輸入圖片描述

控制器:KinectModelControllerV2: 拖拽腳本資源KinectModelControllerV2到場景中的模型中。 選擇場景中的模型。找到模型中的暴漏變量Sw(它代表Skeleton Wrapper). 並將當前場景中的Kinect_Prefab拖拽給Sw這個變量。 詳細展開你的模型,讓模型的每一塊骨骼在hierarchy面板中可見。 一個接一個地把模型中的骨骼拖拽到腳本中暴漏的對應的變量中.確保每一個骨骼都對應到了正確的變量上。 當模型中所有的骨骼都放置好了之後,改變暴漏的Player變量的值,這個變量表明該模型是受哪個玩家控制, 0代表第一個玩家,1 代表第二個玩家。 接下來要設置暴漏的Mask變量的值。設置合適的值,以決定是所有的骨骼都受Kinect控制,還是僅僅一部分骨骼受Kinect控制.如果這些受Kinect控制的骨骼都不是你想要的,你可以自己寫一個控制模型的腳本來代替KinectModelControllerV2。 當遊戲玩家在控制模型時,如果你想要該模型同時播放自帶的動畫,那麼你需要在暴漏的變量中選中animated選項,並設置BlendWeight變量的值,來決定模型受自帶模型動畫和Kinect驅動動作的最終混合效果。該變量取值範圍爲0到1之間。 在此輸入圖片描述

四、運行KinectWrapperPackage包中事例 保證Kinect設備連接成功指示燈爲綠色,上面安裝包安裝配置好,最後運行事例 在此輸入圖片描述 注意圖片的左下角的數字,證明連接成功 ,連接成功的時候Kinect設備還會自己調整角度(最左邊的指示燈會有紅色)並且模型會隨着你動而動

歡迎大家期待第二篇,將寫一個3D人物模型,隨着身體指示,產生轉身和前進與跑步 先上一張圖(第二篇會上相關的腳本代碼,由於unity腳本主要是c#和js,所以我採用c#寫的腳本,9月7號才接觸到unity和kinect,原來工作一直用c/c++,c#都是現學現買所以有不當之處,還請大家使勁拍磚): 在此輸入圖片描述 在此感謝歡樂OSC羣 感謝那些機油的鼓勵 @鉑金小豬 @鉑金小狼 等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章