MRが楽しい

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

MagicLeap2のコントローラの座標をMRTKから取得する

本日は MagicLeap2 の小ネタ枠です。
MagicLeap2 のコントローラの座標をMRTKから取得する方法について記事にします。

前提条件

本記事では MagicLeap2 向け MRTK パッケージを利用してコントローラの座標を取得します。
以下の記事を参考に、MagicLeap2 向け MRTK のインポートを実施してください。
bluebirdofoz.hatenablog.com

コントローラの入力情報

MagicLeap2 向け MRTK ではコントローラのポーズ情報が CoreService の Interactions[0] に常に登録されています。
・MagicLeapMRTKController.cs

        public void UpdatePoses()
        {
            bool isPositionAvailable = mlController.TryGetFeatureValue(UnityEngine.XR.CommonUsages.devicePosition, out Vector3 position);
            bool isRotationAvailable = mlController.TryGetFeatureValue(CommonUsages.deviceRotation, out Quaternion rotation);

            MixedRealityPose pointerPose = new MixedRealityPose(MixedRealityPlayspace.TransformPoint(position),
                MixedRealityPlayspace.Rotation * rotation);

            Interactions[0].PoseData = pointerPose;
            CoreServices.InputSystem?.RaiseSourcePoseChanged(InputSource, this, pointerPose);
            CoreServices.InputSystem?.RaisePoseInputChanged(InputSource, ControllerHandedness, Interactions[0].MixedRealityInputAction, pointerPose);

            TrackingState = isPositionAvailable && isRotationAvailable ? TrackingState.Tracked: TrackingState.NotTracked;

            IsPositionAvailable = isPositionAvailable;
            IsRotationAvailable = isRotationAvailable;
        }

バンパーボタンを押下したときのコントローラ位置に、指定オブジェクトを移動するサンプルスクリプトを作成しました。
以下のようにスクリプトから CoreServices にアクセスすることでコントローラのポーズ情報を取得できます。
・ControllerPoseTest.cs

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

public class ControllerPoseTest : MonoBehaviour, IMixedRealityInputActionHandler
{
    [SerializeField]
    private GameObject _targetObject;
    
    private void OnEnable()
    {
        // ハンドラーを登録する
        CoreServices.InputSystem?.RegisterHandler<IMixedRealityInputActionHandler>(this);
    }

    private void OnDisable()
    {
        // ハンドラーの登録を解除する
        CoreServices.InputSystem?.UnregisterHandler<IMixedRealityInputActionHandler>(this);
    }
    
    public void OnActionStarted(BaseInputEventData eventData)
    {
        // バンパーボタン押下時のイベントのみ通す
        if (eventData.MixedRealityInputAction.Description != "Bumper Press") return;

        // 現在のコントローラのポーズ情報を取得する
        MixedRealityPose currentControllerPose = CoreServices.InputSystem.
            DetectedControllers.FirstOrDefault().Interactions[0].PoseData;
        
        // 指定オブジェクトをコントローラの位置に移動する
        Pose spawnPose = new Pose(
            currentControllerPose.Position + currentControllerPose.Forward * 0.2f,
            currentControllerPose.Rotation);
        _targetObject.transform.position = spawnPose.position;
        _targetObject.transform.rotation = spawnPose.rotation;
    }

    public void OnActionEnded(BaseInputEventData eventData){}
}

スクリプトは MagicLeap2 向けプロファイルで定義されている[Bumper Press]の入力アクションをチェックしています。