天天看點

KinectSDK + Unity3D學習總結Kinect結合Unity3D引擎開發體感遊戲(一)KinectSDK 1.6 + Unity3D體感應用

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

http://my.oschina.net/klttl/blog/161694

    最近公司項目需要做科技館的體感遊戲,以前也沒接觸過遊戲,雖然以前自己也是想做遊戲,我想大部分都是學程式設計出來來做遊戲,哈哈(請允許我淫笑一下,終于可以做這方面)。雖

然以前沒接觸過體感遊戲,看到的體驗也是大部分看到的視訊,幸好現在網絡還是比較發達,上網大概了體感遊戲開發,目前比較好的是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#都是現學現買是以有不當之處,還請大家使勁拍磚): 

========

KinectSDK 1.6 + Unity3D體感應用

http://blog.csdn.net/yuanchunfa/article/details/8107628

    最近買了個Kinect中國版,加上新出的KinectSDK 1.6,于是開始嘗試起來,先是給同僚的一個朋友幫忙,為Flash提供骨骼資料,之前早就給了這個朋友網上一套KinectHtml5源碼,這個

代碼很早我編譯過的,能夠在支援Html5上浏覽器使用,這個朋友說編譯失敗,當時還是很疑惑為什麼, 隻是當時沒條件編譯, 現在條件具備,就自己再用起這套源碼,發現是KinectSDK 

1.0的版本的Demo,怪不得我以前能直接編譯通過,而這位朋友編譯通不過,因為他采用的是KinectSDK 1.5。這次我采用Kinect SDK 1.6,看看ToolkitBrowser上示例,沒多久就把這份代碼

修改并編譯通過了。後面就嘗試在Unity3D上使用,網上查找了些方案,其中這篇文章不錯,Kinect+Unity3D 體感遊戲開發 — Kinect SDK v1.5,給出幾種方案,我做了相應嘗試,現在也進

行一下總結:

1、Zigfu的ZDK

    以前用OpenNI的時候用過,沒想到能夠支援Kinect,于是很高興的下好了trial版本,果然能用,不過發現一下子能打開Kinect裝置,一下子不能打開Kinect裝置,很是困惑,後面發現

360安全衛士及360殺毒把Kinect服務當木馬的提示,果斷設定為信任,也把360安全衛士和360殺毒退出,在測試打開Kinect裝置成功率高的多,但依然會有失敗的。

2、CMU的封裝

    這套在看這篇文章是先下到,隻支援Kinect SDK 1.0,本想修改一下用起來,但是懶的基因沒有馬上動手,而是再Google下,找到了這邊文章,下載下傳替換檔案,看了一下,Kinect SDK 

1.5跟Kinect SDK 1.6還是有差別,用了一下果然也是用不起來。

3、adevine1618開發的插件

    缺點有說不在維護,是以就沒有去試了。

4、根據Zigfu自己寫一套C#類庫

    前面說到Zigfu的打開不穩定,于是想自己寫一套能夠同時支援Kinect和OpenNI的封裝。沒花多長時間,總結了一下需要各抽象層就動手寫了骨骼資料方面,于是放到Unity進行測試。發

現MonoDevelop編譯沒有問題,在Editor下确提示編譯出錯。這篇文章有提到:Unity3.5 隻支援到.Net 3.5, 而Kinect SDK v1.5 最低要求是.Net 4.0. 是以直接在Unity中使用v1.5的

assembly是不行的。不過我嘗試才真正體會到真的是不行,在VS2012中改成.Net 3.5的話,編譯又通不過,改成.Net 4.0編譯通過,在Unity中又通不過,預設是.Net 4.5。很好奇Zigfu是如

何做到的,ZDK下有Kinect10.dll及OpenNI.Net的引用,也是用C#寫的一套類庫啊,難道是Kinect SDK 1.5,而且用的是.Net 3.5?用Kinect SDK 1.5的話,為何CMU的封裝(替換檔案了)有

如何跑不起來?

5、Unity Plugin方式,用C++寫DLL

    這個動手寫以前就肯定是可行的,但還是動手寫了一下做了測試,發現Kinect 紅外燈能夠點亮了。這樣比CMU封裝更有好處,按更自然的C++方式來實作,僅導出需要的接口就好了。

    這麼多方案下,最希望是能夠把Zigfu實作能夠把Kinect面部識别等更多功能放進去,當然是需要Unity能夠支援.Net 4.5了,目前方案是Unity Plugin方式了,把需求放到C++中去完成好

了。

========

資源

http://www.manew.com/labe/plus796.html

體感相關資源,unity3d 體感插件等;

https://pan.baidu.com/s/1hs8t0US

motion-sdk-latest.zip

KinectSDK + Unity3D學習總結Kinect結合Unity3D引擎開發體感遊戲(一)KinectSDK 1.6 + Unity3D體感應用