DEV Community

松本隆介
松本隆介

Posted on

MagicLeapToolKitを利用したハンドジェスチャの検出方法

以前の記事で紹介したジェスチャの取得方法はMagicLeapUnityPackageのコアシステムを利用したジェスチャの取得方法

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

環境

LuminOS : 0.98.11
LuminSDK : 0.24.1
MagicLeapUnityPackage : 0.24.2
Unity : 2019.3.7.f1
MagicLeapToolKit : 特にバージョンが設定されていないのでこちらから最新版をDL

出来上がり

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

技術記事投稿用動画
MagicLeapのハンドジェスチャを取得するだけ
ログの表示はRuntimeConsole pic.twitter.com/RJDyHbkOyZ

— 松本隆介 (@matsumotokaka11) August 21, 2020

シーンの作成 ( 下準備 )

こちらの記事で作成したCameraRigまたは自前で作成したCameraをシーンに配置しておいてください
こちらは最低限の準備でよいと思います

次にシーンにGameObjectを作成( とりあえずHandInputとします )を作成し、MagicLeap-Tools > Code > Input > Hands ディレクトリにあるHandInputをアタッチします
Alt Text
Alt Text

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

Alt Text
Alt Text

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

スクリプトの作成

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

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;
        }
    }


}


Enter fullscreen mode Exit fullscreen mode

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

このスクリプトを先ほど作成したHandInputにアタッチすれば稼働します
Alt Text

スクリプトの解説

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

あとがき

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


MagicLeapのジェスチャで何かするを作ってみた
動画は右手Fist -> (1秒以内に)右手OpenHandで弾を飛ばす動作、途中二回はわざと1秒よりも長くインターバルを作りイベントが発火されないことの確認
これでジェスチャの幅が広がった pic.twitter.com/Ha3Vo9IXMd

— 松本隆介 (@matsumotokaka11) August 21, 2020

Top comments (0)