MRが楽しい

MRやVRについて学習したことを書き残す

MRTKでハンドトラッキングと頭部追従のポインターをスクリプトから動的に切り替える

本日は MRTK の小ネタ枠です。
MRTKでハンドトラッキングと頭部追従のポインタースクリプトから動的に切り替える方法を記事にします。

前提条件

MRTK を使った基本プロジェクトの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

今回はデフォルトの DefaultMixedRealityToolkitConfigurationProfile で作成したプロジェクトを利用します。

ポインターの切り替えスクリプト

ハンドトラッキングと頭部追従のポインターを切り替える以下のスクリプトを作成します。
・PointerModeController.cs

using UnityEngine;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;

public class PointerModeController : MonoBehaviour
{
    void Start()
    {
        // 初期状態は頭部追従のポインターを利用する
        SetHeadGazePointer();
    }

    /// <summary>
    /// 頭部追従のポインター設定を行う
    /// </summary>
    public void SetHeadGazePointer()
    {
        Debug.Log("HeadGazePointer");
        PointerUtils.SetHandPokePointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
        PointerUtils.SetHandGrabPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
        PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
        PointerUtils.SetMotionControllerRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
        PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOn);
    }

    /// <summary>
    /// ハンドトラッキングのポインター設定を行う
    /// </summary>
    public void SetHandTrackingPointer()
    {
        Debug.Log("HandTrackingPointer");
        PointerUtils.SetHandPokePointerBehavior(PointerBehavior.Default, Handedness.Any);
        PointerUtils.SetHandGrabPointerBehavior(PointerBehavior.Default, Handedness.Any);
        PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default, Handedness.Any);
        PointerUtils.SetMotionControllerRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
        PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOff);
    }
}

シーンの適当なオブジェクトにスクリプトを設定します。

次に、手の検出をトリガーに頭部追従からハンドトラッキングポインターに切り替える処理を呼び出します。
オブジェクトに[HandConstraint]コンポーネントを追加します。

合わせて[HandBounds],[SolverHandler]コンポーネントが自動で追加されます。

手の検出を行うため、[SolverHandler]コンポーネントの[TrackedTargetType]を[HandJoint]に、[TrackedHandedness]を[Both]に設定します。
これで手の検出が行えるようになります。

[HandConstraint]コンポーネントの[OnFirstHandDetected]は手の検出時、[OnLastHandLost]は手のロスト時に一回のみ発行されるイベントです。
それぞれ[OnFirstHandDetected]にハンドトラッキングポインターへの切り替え処理、[OnLastHandLost]に頭部追従のポインターへの切り替え処理を設定します。

これで切り替え処理の実装は完了です。

動作確認

本動作はシミュレータ上でも動作確認が可能です。