MRが楽しい

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

MRTKでコントローラの座標を取得する

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

IMixedRealityInputHandler

MRTK を使って入力のポーズ情報を取得するには IMixedRealityInputHandler を利用します。
頭部追従やハンドトラッキング、コントローラなど、プロバイダーを通して入力ソースのポーズ情報を受け取ることができます。
learn.microsoft.com
learn.microsoft.com

サンプルコード

ハンドトラッキングとコントローラのポーズ情報を取得するサンプルスクリプトを作成しました。
・MixedRealityPoseTest.cs

using System;
using System.Collections;
using System.Collections.Generic;
using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;
using UnityEngine;

public class MixedRealityPoseTest : MonoBehaviour, IMixedRealityInputHandler<MixedRealityPose>
{
    [SerializeField]
    private Pose _controllerPose;

    [SerializeField]
    private Pose _handPose;

    private void OnEnable()
    {
        CoreServices.InputSystem?.RegisterHandler<IMixedRealityInputHandler<MixedRealityPose>>(this);
    }

    private void OnDisable()
    {
        CoreServices.InputSystem?.UnregisterHandler<IMixedRealityInputHandler<MixedRealityPose>>(this);
    }
 
    public void OnInputChanged(InputEventData<MixedRealityPose> eventData)
    {
        switch (eventData.InputSource.SourceType)
        {
            case InputSourceType.Hand:
                _handPose.position = eventData.InputData.Position;
                _handPose.rotation = eventData.InputData.Rotation;
                break;
            case InputSourceType.Controller:
                _controllerPose.position = eventData.InputData.Position;
                _controllerPose.rotation = eventData.InputData.Rotation;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}

以下の通り、入力ソースの種別ごとにポーズ情報を取得できます。