本日は 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]の入力アクションをチェックしています。