できるだけ短時間で笑う門には福来るようにしてみた｜Unity, Realsense, Nuitrack

こちらはクソアプリ Advent Calendar 2018の14日目の記事です。
https://qiita.com/advent-calendar/2018/kuso-app

今年はインタラクティブな作品つくったるぞと意気込みつつ何も成し遂げられなかったので、せめてクソアプリでも・・・と思いエントリーしました。
が、皆さんガチヤバすぎて・・・本当にクソみたいなアプリしか作れず、エントリーしてすみません・・・

本作はタイトルの通り、笑顔で映ると周りから「福」がやってくるアプリです。
https://github.com/sadakitchen/nuitracktest
![コンポ-1_mini.gif](https://qiita-image-store.s3.amazonaws.com/0/100912/6518cbe8-26f3-4325-ddfd-5e046c0c0674.gif)


できるだけ楽に早く作りたい！ということで界隈で評判になっていた「Nuitrack」を選びました。
このエントリーはほぼNuitrackの導入記事です。

## Nuitrackを使ってみた

https://nuitrack.com/
NuitrackはいわゆるKinectのように人型スケルトンやジェスチャーに関する処理などを扱いやすくしてくれるSDKです。
有償のSDKで、対応プラットフォームがWindows・Android・Linuxとなり、センサーさえ持っていれば低価格で導入することができます。
ライセンス体系は、1PC・1センサーを結びつけるものになっています。

環境は以下の通り。

- Windows 10
- REALSENSE D435
- Unity 2018.2.19f1

購入後のメールに記載しているURLにアクセスし、「nuitrack-win64.zip」をダウンロード。
解凍後「OpenNI-Win64-1.5.7-Dev.msi」をインストール。
システム環境設定にて「NUITRACK_HOME」という名前で新規作成し、解凍後ファイルの「nuitrack」フォルダを指定。
また、Pathに解凍後ファイルの「nuitrack/bin」フォルダを指定。

次に、Unityで使うため、SDKをダウンロード。
解凍後ファイルの「Unity3D」フォルダに「NuitrackSDK.unitypackage」があるのでimportします。

import後、ExperimentalRecorder.csファイルでエラーが出てしまいました。
MonoBehaviourの継承が不足していると思われたので以下のように修正。

 ```
public class ExperimentalRecorder : IRecordable

↓

public class ExperimentalRecorder : MonoBehaviour, IRecordable
``` 

上記修正後、「Tutorials > First Project」のBasicSkeletonシーンを実行して動作確認し問題なく動くようになりました。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/100912/5e81e5cd-67fc-c32e-9fbc-f76e08a79608.png)



## activationについて

次にNuitrackのライセンスを買ったのでアクティベーションすることに。
センサーとPCをつないでいる必要があります。
詳しくは購入後のメールに記載してあるので概略だけ説明します。

「nuitrack-win64.zip」解凍後ファイルの「nuitrack > activation_tool」フォルダの「Nuitrack.exe」を実行。
「Compatibility test」を押下すると新しくウィンドウが開くので、センサーの前に立ってキャリブレーションを行います。
しばらく動いているとゲージが溜まっていくのでゲージが満たされるまで動きます。
(キャプチャを取り忘れたので認証後のテストの様子)
![capture2.png](https://qiita-image-store.s3.amazonaws.com/0/100912/74df5aad-1cae-2cbf-6054-a9db948aa06d.png)


テストが終わると自動的にウィンドウが閉じるので、 "Upgrade to Pro" か "Upgrade to Pro for 1 year" を選択。
これでアクティベーションが完了します。


## FaceTrackingを試してみる

いよいよ顔認証してみることにします。
顔認証は「Nuitrack Instance-based API[Beta]」を利用します。
このAPIの対応プラットフォームは2018/12/14時点では「Ubuntu amd64」「Windows x86/x86_64」とのことです。

http://download.3divi.com/Nuitrack/doc/UnityFaceTracking_page.html
このページに記載しているサンプル「FaceTracker」シーンを実行してみました。

顔が変化しないので、調べてみると `nuitrack.Nuitrack.GetInstancesJson()` の中身にfaceが入っていないことが判明。

ググってみると以下のページに
http://download.3divi.com/Nuitrack/doc/Instance_based_API.html

> Face modules are by default disabled. To enable face modules, open nuitrack.config file and set Faces.ToUse and DepthProvider.Depth2ColorRegistration to true.

デフォルトではFace modulesが無効になっているとのことなので、
「nuitrack > data」フォルダ内の「nuitrack.config」を開いて、以下のように変更＆保存。

 ```
// 72行目あたり ======================
    "DepthProvider": {
        "RotateAngle": "0", 
        "RGB": "Auto", 
        "Depth2ColorRegistration": false, 
    ↓
    "DepthProvider": {
        "RotateAngle": "0", 
        "RGB": "Auto", 
        "Depth2ColorRegistration": true, 


// 140行目あたり ======================
    "Faces": {
        "ToUse": false
    ↓
    "Faces": {
        "ToUse": true
``` 

上記でJSONのFace modulesが使用できるようになりました。
なお、出力されるJSONの例は以下のページを参照してください。
http://download.3divi.com/Nuitrack/doc/Instance_based_API.html

あとはJSONの「Instances[i].face.emotions.happy」を取得し、
数値に応じてParticleSystemで福をEmitしてという感じです。

## 所感

Nuitrack、非常に簡単に導入できます。
喜怒哀楽だけではなく、顔の向きや年齢、性別も取得できます。
ほかにもモーションキャプチャ、AR、ジェスチャーによるマルチタッチなどバリエーションも豊かです。
センサーも色んなものに対応しているので使っていないセンサーがあったらトライアルで遊んでみるといいかもしれません。