OpenNI結合Unity3D進行體感遊戲開發



1. 下載安裝Unity3D(目前版本爲3.4)

2. 下載OpenNI的Unity3D wrapper(目前版本爲0.9.2): 

    a. 地址:http://www.openni.org/Downloads/OpenNIModules.aspx

    b. 按如下選擇:

     c. 下載完解壓後有2個.unitypackage文件 3. 創建新的U3D(Unity3D)工程,導入載好的unitypackage文件,先導入OpenNIUnityToolkit_0.9.2.unitypackage,再導入NITEExtensions.unitypackage     這時在工程視圖裏能看到導入的所有文件 4. 開始熟悉wrapper(資源都在工程視圖)     a. 示例遊戲:OpenNI-->Sample Scenes-->SingleSkeleton.,運行後能獲得一個感性的認識。     b. 手冊:OpenNI-->Documentation-->OpenNIPackageDocumentation,這個手冊很重要,此後的學習都可以根據這個手冊來。     c. 創建新的Scene,然後按照手冊上的例子自己從零開始創建示例遊戲。

這篇手冊需要通讀的是第一部分:Unity OpenNI Unity Toolkit Overview---> OpenNI Package Overview,包括以下內容:

1. OpenNI Module Main Capabilities  

2. Samples Overview

3. Additional Topics

第一節包含了所有需要理解的東西,第二節是例程講解,第三節是附加話題。

可以先從第二節開始,邊照着創建例程邊查閱第一節的相關內容:

a. Single Skeleton Sample

這個例程介紹怎麼創建單一角色,包括怎麼讓Sensor運行起來,怎麼讓玩家用自己的軀體去控制遊戲角色的骨架。

* Single Skeleton Sample

1. 在Unity中創建一個空的scene

2. 往scene裏添加object (如果不知道怎麼添加:在Project視圖中搜索object的名字,然後直接將object拖到Hierarchy視圖)

a. 第一個就是OpenNISettings。加了這個後點擊運行,正常的話應該可以看到sensor亮了。這個object實現的是驅動sensor,封裝了OpenNI相應的函數。

該obejct有3個子項,我們目前只關心"OpenNI configuration", 選中後在Inspector窗口能看到不同的選項:

Mirror behavior  // 表示是否要將深度數據進行左右鏡像。勾上。

XML file // 通過XML 文件來定製一些參數,比如分辨率,幀率,Production Node等;也可以通過XML文件來導入錄製好的深度視頻,在需要識別特定動作的時候可以用來調試。

Use image generator? // 表示是否需要產生RGB圖像。不勾。

Use user and skeleton? // 表示是否需要識別用戶和骨骼。勾上。

Smoothing factor  // 濾波參數,暫時用默認值0.5

如果想深入瞭解這個object,

1)閱讀手冊裏相應的解釋:在OpenNI Module Main Capabilities-->Centralized Initialization and Configuration-->OpenNISettings Prefab

2)看腳本代碼,有2個腳本:OpenNISettingsManager,NIOpenNISettingsManagerInspector

OpenNISettingsManager - 主要是接受上面解釋的參數,進行初始化和銷燬的工作。這裏關鍵的是NIContext,這是一個singleton,在腳本NIContext裏。實際上NIContext就是對OpenNI的context的封裝。如果不瞭解什麼是context,可以參閱OpenNI的文檔。

NIOpenNISettingsManagerInspector - 主要是實現在Inspector顯示相關選項。需要做擴展的時候可以看看。

b. 接着添加NIDepthViewer,這時候運行,就能看到右上角多了一個視窗,裏面顯示的是深度視頻。(注:視頻里人的動作是反的,你往左,視頻裏的自己往右。如果不勾上上一個object的"Mirror behavior",就不會反了,這裏先不理會)有了這個,就能清楚地看到鏡頭能看到的範圍。

c. 再添加NIRadarViewer, 運行,在遊戲的左上角能看到"User Radar", 當有用戶被檢測到的時候,會出現一個紅色的方塊,方塊裏面有數字(比如1)代表用戶號。

d. 添加角色。這個比較有趣。添加ConstructionWorkerPrefab,然後在Hierarchy中選中這個object,再將鼠標移到Scene窗口,按”F“鍵,這時候就可以看到工人模型了。運行,會看到工人模型以校正姿勢站在屏幕中間(看起來比較小,以後可以調整)。這時候自己做校正動作,會看到左上角RadarViewer裏的小方塊會從紅色變成黃色最後變成綠色,綠色就表示校正成功了,但工人模型卻沒有動起來,因爲我們還缺少一個object,看下一步:

e. 添加NISkeletonPrefab,運行,校正,工人模型驅動起來了!這個object的功能就是實現用戶驅動角色。裏面包含了2個腳本:

1) NIUsers To Player Mapper: 用來管理user和player之間的映射,實際上很簡單,先識別出來的user給分配一個小的player ID。

2) NISkeleton Users Manager: 用來連接player和skeleton controller。默認會自動搜索Skeleton controller,也可以手動指定(在多玩家的場合用得上,比如player1映射到skeleton controller1,player2映射到skeleton controller2)。skeleton controller:是用來驅動character的,比如工人模型,你可以在ConstructionWorkerPrefab裏找到這個腳本。

總結起來,NISkeletonPrefab實現了user(玩家)到player(遊戲裏的玩家)到skeleton controller(可以control不同的模型)的連接。會有user,player和skeleton controller的原因:每個use可以驅動不同的player,比如你和朋友一起玩遊戲,你和朋友都是user,各自驅動自己的player,而每個player又可以有不同的外觀,就象賽車遊戲,你可以選擇不同的車型。

想深入瞭解這個object,同樣有2種方法:

1. 看手冊:OpenNI Module Main Capabilities-->Skeleton Control-->NISKeletonPrefab

2. 讀腳本:NIUsersToPlayerMapper, NISkeletonUsersManager
-------------------------------------------------------------------------------------------

本篇基於最新的wrapper v0.9.7.4(該版本已經不需要做校準姿勢)介紹怎麼從零開始把自己的人物模型驅動起來,目的是給讀者一個能運行的示例,在這過程中不會對概念做過多的解釋,詳細請參照wrapper的幫助文檔。

 

1. 安裝Unity3.4

2. 下載v0.9.7.4的wrapper (解壓得到的是一個文件:OpenNI_Unity_Toolkit-0.9.7.4.unitypackage)

3. 打開Unity創建一個空的工程

4. 導入OpenNI_Unity_Toolkit-0.9.7.4.unitypackage 

 

  • 按默認的,導入全部文件
  • 導入後看到如下圖所示文件結構

 

 

 

5. 導入你自己的人物模型,這裏以asset store上的戰士模型爲例

 

  • 進入asset store(Unity裏Ctril+9),當然前提是你註冊了賬戶(免費)
  • Asset Store頁面的Categories裏選擇3D Models-->Characters-->Humanoids-->Humans,然後在左側的列表裏選擇Soldier Character Pack(免費的)
  • 導入Soldier Character Pack
  • 導入後看到多瞭如下文件

6. 加入人物模型

 

 

  • 將上圖文件目錄裏的soldier直接拖到Hierarchy窗口
  • 這時在scene窗口看不到戰士模型,先在Hierarchy窗口選中soldier,然後將鼠標移到Scene窗口,按F鍵,便可看到。
  • 這時如果運行遊戲,看到的只是靜止的戰士,攝像頭也不會亮

7. 驅動3D攝像頭(Kinect或ASUS Xtion Pro,看你用的是什麼設備)

 

  • 將Project窗口的OpenNI-->OpenNISettings(如下左圖)拖動到Hierarchy窗口(如下右圖)
  •      
  • 這時運行遊戲,你會看到3D攝像頭亮了,說明設備已經驅動起來了(當然,這一步你必須先插好3D攝像頭)
  • 爲了對設備運行狀態有個更直觀的認識,這裏加入一些輔助的東西
    • 將Project窗口的NIIDepthViewer和NIRadarViewer拖到Hierarchy窗口
    •      
    • 運行遊戲,會看到窗口的左上角和右上角分別多了一個小窗
    •          
    • 左邊的是NIRadarViewer,顯示的是當前是否有人進入攝像頭的視野並被識別出來;右邊的是NIDepthViewer,顯示的是攝像頭看到的實際場景。這時如果你站在攝像頭的視野範圍內稍微動一下,就可以被識別出來,同時在Users Radar上面多了一個紅色的小方格,方格里面顯示數字1. 小方格顯示紅色表示用戶僅僅是被識別出來了,但還沒有開始骨架跟蹤;而數字1表示當前用戶的ID。當你走動的時候,紅色方格也會相應地動。
    • 那怎樣開始骨架跟蹤呢?
      • 創建一個空的game object(Unity的菜單GameObject-->Create Empty),然後在Inspector窗口將其重命名爲player manager。
      • 然後將腳本NIPlayerManagerCOMSelection拖到player manager
      • 在Inspector窗口將Max allowed players改成1
      • 這時運行遊戲,當你站在攝像頭的視野範圍內稍微走動的時候,就可以看到Users Radar窗口的小方格是綠色的,這表明算法已經開始跟蹤你的骨架了因爲這個版本的wrapper封裝了比較新的OpenNI,所以這裏你不再需要做校準姿勢就可以自動跟蹤骨架

8. 一切準備工作做好了,現在可以開始驅動人物模型了

 

 

  • 在Hierarchy窗口選中soldier,將Project窗口的腳本NISkeletonController拖到Inspector
  • 拖動過去後會看到彈出一個提示,選continue。
  • 這時Inspector窗口是這樣的
  • 現在開始骨架匹配
    • 在Inspector(如上圖)的“Joints to control”裏選擇Head,然後點擊最右邊的小圓圈,在彈出的“Select Transform”對話框裏選擇“Head”      
    • 選好後的情形如下
    • 這時點擊,會在Hierarchy窗口看到其所在的位置
    • 這樣戰士模型的頭就和OpenNI算法識別出來的玩家骨架的頭匹配起來了,其它骨架的匹配方法類同,下面是全部匹配好的“Joints to control”截圖,可對照其骨架的名字一一匹配。
    • 這裏要說明的是,不同的人物模型對骨架各關節的命名可能不一樣,怎麼命名無所謂,關鍵是要找對關節。以這個戰士模型爲例,見下面兩張圖,第一張是Left Shoulder的位置,第二張是Left Arm的位置,很明顯,我們必須選擇的肩關節應該是Left Arm而不是Left Shoulder。
  • 骨架匹配好了,現在運行遊戲,你會看到在初始狀態戰士的雙手是舉起來的
  • 這時如果你出現在攝像頭的可見範圍內,你會發現戰士模型的手腳會跟着你的手腳在動,你轉身,戰士模型也會轉身。這時,你的人物模型已經驅動起來了!
  • 此時你可能會發現一個問題:你走動的時候戰士模型並沒有跟着移動,請在soldier的Inspector窗口將Update Root Position?勾上,再運行遊戲,這時戰士模型就會跟着你走動了

9. 現在模型已經完全驅動起來了,爲了好看,你可以加入燈光,同時把戰士模型放大一些。

 

 

 

建議初學者對本篇的每一步爲什麼能工作思考一下,然後從文檔OpenNIPackageDocumentation中找答案。

 原文鏈接:http://xinaction.iteye.com/blog/1514564

發佈了27 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章