takataka430’s blog

.NET系を中心に勉強したことのまとめを書きます

MRTKで手の動きを記録して再生する

MRTKのドキュメントを眺めていたらこんな機能を見つけました。

docs.microsoft.com

頭と手の動きを記録して再生できるらしいです。これは面白そう!
早速試してみましょう。

開発環境

Unity 2020.3.0f1
MRTK 2.7.2

スクリプトの作成

記録用のスクリプトは「InputRecordingControls」がMRTKに含まれています。

再生用のスクリプトは以下のようになります。

using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Input;
using System.IO;
using System.Linq;
using UnityEngine;

public class LoadAnimation : MonoBehaviour
{

    //記録したアニメーションを再生するためのフィールドを取得
    private InputPlaybackService playbackService = null;
    private InputPlaybackService PlaybackService
    {
        get
        {
            if (playbackService == null)
            {
                playbackService = CoreServices.GetInputSystemDataProvider<IMixedRealityInputPlaybackService>() as InputPlaybackService;
            }

            return playbackService;
        }
    }

    //再生したファイルを保存したフォルダの最新のファイルを取得して再生
    public void PlayUserInput()
    {
        if (PlaybackService != null)
        {
            var dirInfo = new DirectoryInfo("[記録したアニメーションファイルの保存フォルダ]");
            string filePath = dirInfo.GetFiles().OrderByDescending(f => f.LastWriteTime).FirstOrDefault().FullName;
            PlaybackService.LoadInputAnimation(filePath);
            PlaybackService.Play();
        }
        
    }

    void Start()
    {
        
    }

    void Update()
    {
        
    }
}

InputRecordingControlsで記録したファイルは、PCで実行した場合はC:\Users\[ユーザー名]\AppData\LocalLow\DefaultCompany\[アプリケーション名]という場所のフォルダに保存されます。これをnew DirectoryInfoの引数に指定します。

UIの作成

記録用と再生用の2つのボタン(PressableButtonHoloLens2)を作ります。 それぞれButton_RecordButton_Loadに名前を変えています。
次にそれぞれのボタンにスクリプトを張り付けて設定を行います。

記録用のボタン

Add Componentから「InputRecordingControls」を探して追加します。
On Recording Stopped()で+ボタンを押してイベントを追加します。左下の空欄にはこのボタンを挿入します。右上のNo Functionと書いてあるところにはInputRecordingControls→SaveRecordedInputを選択します。
以上の操作によって記録が終了したときにファイルが保存されます。
f:id:takataka430:20210904145622p:plain

次にInteractableのOnClick()を設定します。左下のNone(Object)のこのボタンを挿入します。右上のNo Functionと書いてあるところにはInputRecordingControls→ToggleRecordingを選択します。こうすると、ボタンを押すごとに記録の開始、終了の操作をすることができます。 f:id:takataka430:20210904145646p:plain

再生用のボタン

Add Componentから先ほど作成した再生用のスクリプトを挿入します。(今回はLoadAnimationという名前にしています)
次にInteractableのOnClick()を設定します。左下のNone(Object)のこのボタンを挿入します。右上のNo Functionと書いてあるところにはLoadAnimation→PlayUserInputを選択します。 f:id:takataka430:20210904145715p:plain

Unityのエディタ上で実行

f:id:takataka430:20210904145025g:plain 左のボタンを押すと記録が開始され、もう一度押すと記録終了です。右側のボタンを押すと記録された手の動きが再生されます。