MagicLeapToolKitを利用したハンドジェスチャの検出方法
Tags: csharp, magicleap
Published: 2020-08-21 21:08:09

[以前の記事](https://dev.to/matsumotokaka11/magicleap-17pa)で紹介したジェスチャの取得方法はMagicLeapUnityPackageのコアシステムを利用したジェスチャの取得方法

それとは別にMagicLeapToolKitを利用したハンドジェスチャの取得方法を紹介します( かなりお手軽なのでおすすめです )

## 環境
LuminOS : 0.98.11
LuminSDK : 0.24.1
MagicLeapUnityPackage : 0.24.2
Unity : 2019.3.7.f1
MagicLeapToolKit : 特にバージョンが設定されていないので[こちら](https://github.com/magicleap/Magic-Leap-Toolkit-Unity)から最新版をDL


## 出来上がり
以下のようにジェスチャを取得できる機能を作成します

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">技術記事投稿用動画<br>MagicLeapのハンドジェスチャを取得するだけ<br>ログの表示はRuntimeConsole <a href="https://t.co/RJDyHbkOyZ">pic.twitter.com/RJDyHbkOyZ</a></p>&mdash; 松本隆介 (@matsumotokaka11) <a href="https://twitter.com/matsumotokaka11/status/1296893081086652416?ref_src=twsrc%5Etfw">August 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## シーンの作成 ( 下準備 )

[こちらの記事](https://dev.to/matsumotokaka11/magicleap-17pa)で作成したCameraRigまたは自前で作成したCameraをシーンに配置しておいてください
こちらは最低限の準備でよいと思います

次にシーンにGameObjectを作成( とりあえずHandInputとします )を作成し、MagicLeap-Tools > Code > Input > Hands ディレクトリにあるHandInputをアタッチします
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/pxw63ja5brfv7232m72y.JPG)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/7jb6cg7rq9au7c34f1vv.JPG)

次に受け取ったジェスチャイベントをログに出力したいので MagicLeap-Tools > Examples > RuntimeConsole > Scenes にあるRuntimeConsoleシーンをHierarchy上にドラッグ&ドロップし、その中からRuntimeConsoleオブジェクトを自分のテスト用シーンに移動します

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/qgvn8yw7brypxq7pkchx.JPG)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bi6tuxa5b8jaqm8a1eip.JPG)

これで下準備が完了しました。


## スクリプトの作成

ここからがメインになります、といってもやることは簡単でHandInputにジェスチャを取得するためのイベントを登録するだけです

```csharp
using MagicLeapTools;
using UnityEngine;
using UnityEngine.XR.MagicLeap;


/// <summary>
/// MLTKの手のジェスチャ取得.
/// </summary>
public class Sample : MonoBehaviour
{

    void Start()
    {
        HandInput.OnReady += () =>
        {
            HandInput.Right.Gesture.OnKeyPoseChanged += OnHandGesturePoseChanged;
            HandInput.Left.Gesture.OnKeyPoseChanged += OnHandGesturePoseChanged;
        };
    }


    private void OnHandGesturePoseChanged(
        ManagedHand hand,
        MLHandTracking.HandKeyPose pose)
    {
        // 左右の判定はこんな感じ.
        string lr = hand.Hand.Type == MLHandTracking.HandType.Left ? "left" : "right";
        Debug.Log($"{pose} {lr}");

        // 取得されたジェスチャ.
        switch (pose)
        {
            case MLHandTracking.HandKeyPose.C: break;
            case MLHandTracking.HandKeyPose.Finger: break;
            case MLHandTracking.HandKeyPose.Fist: break;
            case MLHandTracking.HandKeyPose.L: break;
            case MLHandTracking.HandKeyPose.Ok: break;
            case MLHandTracking.HandKeyPose.Pinch: break;
            case MLHandTracking.HandKeyPose.Thumb: break;
            case MLHandTracking.HandKeyPose.NoHand: break;
            case MLHandTracking.HandKeyPose.NoPose: break;
            case MLHandTracking.HandKeyPose.OpenHand: break;
        }
    }


}


```

↑のスクリプトで問題なくジェスチャを取得することが出来ると思います

このスクリプトを先ほど作成したHandInputにアタッチすれば稼働します
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/5v939tmgxstzu1z460d6.JPG)

### スクリプトの解説

まずStart()でHandInput.OnReadyのイベント発火時にHandInput.Right, Left双方のOnKeyPoseChangedイベントへのリスナーの登録をします
リスナーは ManagedHand型とMLHandTracking.HandKeyPose型を引数に持つメソッドです

## あとがき

UniRx等を利用して複数のジェスチャを組み合わせての一連のコマンドなどを作ってみるとジェスチャの幅が広がるかも

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MagicLeapのジェスチャで何かするを作ってみた<br>動画は右手Fist -&gt; (1秒以内に)右手OpenHandで弾を飛ばす動作、途中二回はわざと1秒よりも長くインターバルを作りイベントが発火されないことの確認<br>これでジェスチャの幅が広がった <a href="https://t.co/Ha3Vo9IXMd">pic.twitter.com/Ha3Vo9IXMd</a></p>&mdash; 松本隆介 (@matsumotokaka11) <a href="https://twitter.com/matsumotokaka11/status/1296882887552188419?ref_src=twsrc%5Etfw">August 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>