以前の記事で紹介したジェスチャの取得方法はMagicLeapUnityPackageのコアシステムを利用したジェスチャの取得方法
それとはべつにMagicLeapToolKitを利用したハンドジェスチャの取得方法を紹介します( かなりお手軽なのでおすすめです )
環境
LuminOS : 0.98.11
LuminSDK : 0.24.1
MagicLeapUnityPackage : 0.24.2
Unity : 2019.3.7.f1
MagicLeapToolKit : 特にバージョンが設定されていないのでこちらから最新版をDL
出来上がり
以下のようにジェスチャを取得できる機能を作成します
技術記事投稿用動画
— 松本隆介 (@matsumotokaka11) August 21, 2020
MagicLeapのハンドジェスチャを取得するだけ
ログの表示はRuntimeConsole pic.twitter.com/RJDyHbkOyZ
シーンの作成 ( 下準備 )
こちらの記事で作成したCameraRigまたは自前で作成したCameraをシーンに配置しておいてください
こちらは最低限の準備でよいと思います
次にシーンにGameObjectを作成( とりあえずHandInputとします )を作成し、MagicLeap-Tools > Code > Input > Hands ディレクトリにあるHandInputをアタッチします
次に受け取ったジェスチャイベントをログに出力したいので MagicLeap-Tools > Examples > RuntimeConsole > Scenes にあるRuntimeConsoleシーンをHierarchy上にドラッグ&ドロップし、その中からRuntimeConsoleオブジェクトを自分のテスト用シーンに移動します
これで下準備が完了しました。
スクリプトの作成
ここからがメインになります、といってもやることは簡単で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;
}
}
}
↑のスクリプトで問題なくジェスチャを取得することが出来ると思います
スクリプトの解説
まずStart()でHandInput.OnReadyのイベント発火時にHandInput.Right, Left双方のOnKeyPoseChangedイベントへのリスナーの登録をします
リスナーは ManagedHand型とMLHandTracking.HandKeyPose型を引数に持つメソッドです
あとがき
UniRx等を利用して複数のジェスチャを組み合わせての一連のコマンドなどを作ってみるとジェスチャの幅が広がるかも
MagicLeapのジェスチャで何かするを作ってみた
— 松本隆介 (@matsumotokaka11) August 21, 2020
動画は右手Fist -> (1秒以内に)右手OpenHandで弾を飛ばす動作、途中二回はわざと1秒よりも長くインターバルを作りイベントが発火されないことの確認
これでジェスチャの幅が広がった pic.twitter.com/Ha3Vo9IXMd