NtKinectDLL and NtUnity: Tutorial

Kinect V2 で骨格と顔を認識してUnityの人型キャラクタをリアルタイムで動かす


2017.08.23: created by
Japanese English

本トピックスは、一部の Humanoid モデル(Standard Assets の "Ethan" など)には対応していません。(2017/08/25)

UnityChan には対応しました。こちらをご覧下さい。(2017/09/09)

目次へ


前提として理解しておくべき知識


Kinect V2 で骨格と顔を認識してUnityの人型キャラクタをリアルタイムで動かす

  1. UnityでNtKinectDLLを使う (基本設定)」で作成した Unityのプロジェクトを使います。UnityDLL01.zip をダウンロードして展開して下さい。 さらに、展開したフォルダの名前を UnityDLL02/ と変更して下さい。
  2. 新しいシーンを作成して、Assets/Scenes/ に Sample02.unity という名前で保存します。
  3. File -> New Scene
    
    File -> Save Scene as ... -> Sample02.unity
    
  4. Humanoid (人型キャラクタ)を置くフォルダをアセットに作ります。
  5. Projectウィンドウのアセットを右クリック -> Create -> Folder -> 名前を"Models"に変更する
    
  6. Assets/Models/ に Humanoid (人型キャラクタ)のデータを import します。
  7. ここでは 「 MakeHuman: Unity5 で使用する人型モデルを作成する 」 で作成したデータ makehuman2.zip を用います。

    上記のzipファイルを展開すると、exports/の下に AsianBoy.fbx, AsianGirl.fbx, AfricanBoy.fbx, AfricanGirl.fbx, CaucasianBoy.fbx, CaucasianGirl.fbx と textures/ があるはずです。 これを Assets/Models/ の下にimportします。




    [注意]上の操作は

    Assets -> Import New Asset... -> AsianBody.fbx
    から行なってもよいのですが、これだとAsianBoy.fbx に必要なtextureが 自動ではimportされず、モデルが真っ白になってしまいます。 この場合は Assets/Models/Materials/に生成された白いMaterialに対応する Textureを手動でimportしなくてはいけません。




  8. Projectウィンドウで 人型キャラクタのモデル (fbx)を選択をして、 Inspectorウィンドウで "Rig" で Animation Type を "Humanoid" に変更し、 Avatar Definition を "Create From This Model" のままとして、 "Apply"ボタンをクリックします。 このとき"Configure"ボタンの前にチェックが表示されると、 Humanoid の Bone が正しく割り当てられたことがわかります。 万一、チェックが表示されない場合は "Configure"ボタンをクリックして 手動で割り当てを行う必要があります。
  9. 図では AsianBoy.fbx をHumanoid に変換する例を示しています。 6個のfbx全てについて Humanoid に変換する作業を行って下さい。







  10. Assets/Models/AsianBody.fbx を Hierarchy にドラッグします。Hierarchy で AsianBoyを選択した状態で、Inspector の Transform からSettings を"Reset" をクリックしておきます。






  11. ProjectのAssets/Scripts/の下に C# のスクリプトを生成する。
  12. 上部のメニューから「Assets」-> 「Create」 -> 「C# Script」 -> ファイル名は Sample02

    Sample02.cs
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Sample02 : MonoBehaviour {
      public GameObject humanoid;
      public bool mirror = true;
      public bool move = true;
    
      NtUnity.Kinect nt;
      NtUnity.HumanoidSkeleton hs;
    
      void Start () {
        nt = new NtUnity.Kinect();
        hs = new NtUnity.HumanoidSkeleton(humanoid);
      }
    
      void Update () {
        nt.setRGB();
        nt.setSkeleton();
        nt.setFace();
        nt.imshowBlack();
        int n = nt.getSkeleton();
        if (n > 0) {
          hs.set(nt,0,mirror,move);
        }
      }
    
      void OnApplicationQuit() {
        nt.stopKinect();
      }
    }
    
  13. 空のオプジェクトをHierarchy に配置して、名前を GameController に変更します。 Sample02.cs を GameController のComponentとして付加します。



  14. Hierarchy ウィンドウで GameController を選択すると Inspector ウィンドウに "Sample 02 (Scripts)" コンポーネントが表示されます。 その "Humanoid" に Hierarchy のAsianBody を設定します。



  15. Hierarchy で Main Camera を選択して Transform の Position を (x,y,z)=(0,1,-1) に変更します。
  16. 実行すると、Kinect V2 による骨格認識状況と顔認識状況が別ウィンドウに表示されます。 Unityの画面では、Humanoid が人間の動作に追随して動きます。 mirror がチェックされていると鏡像が対面形式で表示されます。 また move がチェックされていると、人間の位置の変更に追随します。
  17. 人間の顔の向きがHumanoidの顔の向きに反映されます。

    [注意] 骨格の認識状態を表示するためにDLL内でOpenCVのウィンドウを生成しています。 後から生成されたこのウィンドウにフォーカスがあるときは (= Unityのウィンドウにフォーカスがない場合は) Unityの画面は変化しないので注意して下さい。 Unityのウィンドウの上部をクリックしてUnityのウィンドウにフォーカスが ある状態で動作を試して下さい。

    Runtime Video UnityDLL02.mp4





  18. Unity のサンプルプロジェクトはこちら UnityDLL02.zip
  19. 上記のzipファイルには必ずしも最新の "NtKinectDLL.dll" と "NtUnity.cs" が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。


複数の骨格を認識して Humanoid の動きに反映させる

6人までの Humanoid を同時に動かすプロジェクトを作成します。

  1. 上で作成したUnityのプロジェクト UnityDLL02.zip を展開します。フォルダ名を UnityDLL02b/ と変更したものとして以下の説明を行います。
  2. シーンを新しく名前をつけて保存します。
  3.   File -> Save Scence as -> Sample02b.unity
    
  4. Assets/Models/から 5つのモデルを Hierarchy にドラッグしてシーンに追加します。
  5. Hierarchy には Humanoid が合計で 6 体存在するようになりました。 それぞれの Position や Rotation をそれぞれ次のように設定します。 Position の Z 座標を -10 として、骨格が認識されていないときは Main Camera に写らなくしているだけです。

    Model NamePositionRotation
    XYZXYZ
    AsianBoy00-10000
    AsianGirl00-10000
    AfricanBoy00-10000
    AfricanGirl00-10000
    CaucasianBoy00-10000
    CaucasianGirl00-10000



  6. Assets/Scripts/Sample02b.cs を作成します。
  7. Sample02b.cs
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Sample02b : MonoBehaviour {
      public GameObject[] humanoid = new GameObject[] {null, null, null, null, null, null};
      public bool[] mirror = new bool[] {true, true, true, true, true, true};
      public bool[] move = new bool[] {true, true, true, true, true, true};
    
      NtUnity.Kinect nt;
      NtUnity.HumanoidSkeleton[] hs = new NtUnity.HumanoidSkeleton[] {null, null, null, null, null, null};
      
      void Start () {
        nt = new NtUnity.Kinect();
        for (int i=0; i< humanoid.Length; i++) {
          if (humanoid[i] != null) {
    	hs[i] = new NtUnity.HumanoidSkeleton(humanoid[i]);
          }
        }
      }
    
      void Update () {
        nt.setRGB();
        nt.setSkeleton();
        nt.setFace();
        nt.imshowBlack();
        for (int i=0; i<nt.skeleton.Count; i++) {
          if (hs[i] != null) {
    	hs[i].set(nt,i,mirror[i],move[i]);
          } else {
    	humanoid[i].transform.position = new Vector3(0,0,-10);
          }
        }
      }
    
      void OnApplicationQuit() {
        nt.stopKinect();
      }
    }
    
  8. Hierarchy で GameController を選択してから、 Inspector で Sample02 コンポーネントを Remove Component します。



  9. Assets/Scripts/Sample02b.cs を Hierarchy の GameController 上にドロップします。



  10. Hierarchy で GameControler を選択すると表示される、 Inspector の "Sample 03 (Script)" コンポーネント中の Humanoid に 6つのモデルをそれぞれ選択します。



  11. シーンを保存します。
  12. File -> Save Scenes
    
  13. 実行すると、6人まで同時認識して、Humanoid が動きます。
  14. Runtime Video UnityDLL02.mp4


  15. Unity のサンプルプロジェクトはこちら UnityDLL02b.zip
  16. 上記のzipファイルには必ずしも最新の "NtKinectDLL.dll" と "NtUnity.cs" が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。



http://nw.tsuda.ac.jp/