NtKinectDLL and NtUnity: Tutorial

Kinect V2 で骨格と顔を認識してUnityで「ユニティちゃん」をリアルタイムで動かす


2017.09.09: created by
Japanese English

本トピックスの内容は、NtUnity.cs version 1.1 以降に対応します。

目次へ
顔の動きがない場合

顔の動きがある場合

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


Humanoid (人型キャラクター)の「ユニティちゃん」について

「Unityちゃん」パッケージのダウンロードサイトは http://unity-chan.com/ です。 このサイトから Download -> 「キャラクター利用のガイドライン」-> 「ユニティちゃんの3Dモデルデータ」を選択して、 UnityChan_1_2.nitypackage をダウンロードして下さい。

「ユニティちゃん」の3Dモデルデータ(unitychan.fbx) の内部の座標系は、 かなり特殊であるように私には思われます。 各ボーンの Transform.rotation には、まず座標系をリセットするために 「最初にz軸回りに-90°、次にy軸回りに90°」回転してから、 global座標系での本来の向きを設定する必要があります。 また、モデル全体の Transform.rotation も、まず座標系をリセットするために 「最初にz軸回りに-90°、次にy軸回りに-90°」回転してから、 global座標系での本来の向きを設定しなくてはいけません。

「ユニティちゃん」のモデルデータは頭から長いおさげ髪がでているので、 顔の向きが変化すると(= 頭が動くと)非常に目立ちます。 顔の向きの認識は失敗することがあり、また誤差のため細かく動くのですが、 それをそのまま「ユニティちゃん」の頭の動きに反映させると非常に目障りに感じます。 したがって、「ユニティちゃん」のモデルでは、認識した顔の向きの変化に 即追随するのではなく平均(移動平均)などを使って動かす方が適切のような気がします。

「Unityちゃん」のモデルデータは、Unityにimport してから Inspectorウィンドウの Rig で自動で Configure すると、 HumanBodyBones.Neck のボーンは割り当てられません。 UnityのHumanoidでは NeckはOptional なボーンとみなされています。 「ユニティちゃん」のデータにNeckを手動で割り当てることはできますが。 この例では敢えてNeckのBoneを使ってはいません。


Kinect V2 で骨格を認識して「ユニティちゃん」をリアルタイムで動かす

  1. UnityでNtKinectDLLを使う (基本設定)」で作成した Unityのプロジェクトを使います。UnityDLL01.zip をダウンロードして展開して下さい。 さらに、展開したフォルダの名前を UnityDLL05/ と変更して下さい。
  2. ダウンロードしたzipファイルは必ずしも最新のファイルを含んでいるとは限りません。 以下のファイルを新しいバーションに置き換えて下さい。

    Assets/Plugins/x86_64/NtKinectDLL.dll
    Assets/Scripts/NtUnity.cs
    
  3. 新しいシーンを作成して、Assets/Scenes/ に Sample05.unity という名前で保存します。
  4. File -> New Scene
    
    File -> Save Scene as ... -> Sample05.unity
    
  5. UnityChan の3Dモデルデータをimportします。
  6. import すると Assets/UnityChan/ として見えます。




  7. Projectウィンドウで Assets/UnityChan/Models/unitychan.fbx を選択すると、 Inspectorウィンドウに "Rig" の情報が表示されます。 Animation Type が "Humanoid" であることを確認して下さい。
  8. もしも値が"Humanoid" 以外の場合は、Humanoid に変換して下さい。




  9. UnityChan のモデルをhierarchy に置きます。
  10. Assets/UnityChan/Models/unitychan.fbx がモデルですので、これをhierarchyにドラッグします。 Hierarchy で unitychanを選択した状態で、Inspector の Transform からSettings を"Reset" をクリックしておきます。







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

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



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



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

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

    Runtime Video UnityDLL05a.mp4, UnityDLL05b.mp4


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



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