最近公司項目須要作科技館的體感遊戲,之前也沒接觸過遊戲,雖然之前本身也是想作遊戲,我想大部分都是學編程出來來作遊戲,哈哈(請容許我淫笑一下,終於能夠作這方面)。雖然之前沒接觸過體感遊戲,看到的體驗也是大部分看到的視頻,幸虧如今網絡仍是比較發達,上網大概了體感遊戲開發,目前比較好的是Unity3D和Kinect結合交互進行開發。如今內心的感受用句話說:哥如今也走在世界技術最前言,TMD碉堡了! 9月7號開始查閱網上的資料,一直沒有找到詳盡而又簡單的方案。網上目前我看到就三種方法,說是三種方法說白了就一種:中間件。形散而神不散--散文的最高境界(其實我語文很差,對不起祖國氣個人指望,嗚嗚、、、)三種方法以下:
1.卡耐基梅隆的kinectWrapper.unitypackage;c++
2.OpenNI官方提供的OpenNI_Unity_Toolkit-0.9.7.4.unitypackage(如今官方不提供更新與支持了,支持的版本unity3.4,在往上版本會出現不少問題,須要修改不少地方,比較麻煩);編程
3.本身寫的交互的中間件,我在網上看見高手本身的寫的中間件,封裝爲DLL,如今經過這段時間動手實現,發現本身寫一個這樣的中間件其實也不難,後期也本身準備寫一個。 我在採用的第一種方法,緣由上面三點大概說來了,第二點之後考慮支持的版本和官方的態度,因此暫時不考慮;第三種目前本身還沒寫,目前來講也不太現實,也暫時不考慮考慮。因此目前狀況就暫時考慮第一種;c#
廢話說了那麼多,相信各位機油們早就寂寞難耐了,如今就切入正題:
1、Unity和Kinect交互的環境配置 我目前所使用的Unity3D的版本是Unity3.5; 使用的Kinect SDK版本是SDK1.6; Kinect和Unity交互的卡耐基梅隆的kinectWrapper.unitypackage方法是使用CMU的封裝,這個方法支持的Kinect SDK版本是SDK1.0,要想使用1.6版本以上的kinect SDK,就要作一些相應的修改。完整的方案以下(這個也爲何上面說後期打算本身封裝一個相似這樣組件DLL):網絡
一、安裝Uinty3D我使用的Unity3D版本是3.5,上官網下載(須要註冊,才能用,我推薦你們去付點錢,我是本身找的破解碼,聲明不支持這樣的行爲,你們懂就好)。app
二、安裝Kinect SDK我使用的SDK版本是1.6,能夠在Kinect for Windows官方網站上下載。動畫
三、在Unity3D工程中,若是須要使用和kinect交互,那麼就須要在這個工程中導入卡耐基梅隆的kinectWrapper.unitypackage。百度怎麼用你們都懂吧(須要用kinect SDK版本是1.6以上版本(1,7以上版本還沒試過替換是否能夠,理論上應該也能夠),就要下載KinectWrapperPackage替換文件並替換導入包中的KinectInterop.cs和KinectSensor.cs這兩個文件便可) 好啦!目前準備工做都ok了!網站
2、簡單Kinect Wrapper Package for Unity3D包含了全部咱們開發unity+kinect須要用到的腳本。code
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中抓取數據.
3、使用KinectWrapperPackage包要想在本身的工程中 首先須要用unity3D建立一個空工程,而後將kinectWrapper.unitypackage導入這個包到unity中,而後通過下面的步驟完成交互。
一、設置Kinect_Prefab前面提到過了,若是在Unity中和Kinect交互,Kinect_Prefab這個遊戲物體是必不可少的。 這個物體須要存在於你的場景中的某處。因此當你切換場景時,它仍舊存在着,所以你沒必要在每一個場景中都實例一個Kinect_Prefab。 在Unity3D中,找到project面板中的Kinect_Prefab直接拖拽到Hierarchy面板就能夠了。
二、控制遊戲中的角色爲了控制場景中的角色的移動,你須要將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之間。
4、運行KinectWrapperPackage包中事例 保證Kinect設備鏈接成功指示燈爲綠色,上面安裝包安裝配置好,最後運行事例 注意圖片的左下角的數字,證實鏈接成功 ,鏈接成功的時候Kinect設備還會本身調整角度(最左邊的指示燈會有紅色)而且模型會隨着你動而動
歡迎你們期待第二篇,將寫一個3D人物模型,隨着身體指示,產生轉身和前進與跑步 先上一張圖(第二篇會上相關的腳本代碼,因爲unity腳本主要是c#和js,因此我採用c#寫的腳本,9月7號才接觸到unity和kinect,原來工做一直用c/c++,c#都是現學現買因此有不當之處,還請你們使勁拍磚): 在此感謝歡樂OSC羣 感謝那些機油的鼓勵 @鉑金小豬 @鉑金小狼 等