MRが楽しい

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

HoloLens2でホロモンアプリを作る その108(QRコードによる位置合わせの実装)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。

QRコードによる位置合わせの実装

AR デバイス同士でシェアリングするに当たって、共通の空間の原点座標をどう設定するかという問題があります。
今回は QR コードを使って位置合わせを行うことにしました。

QR コードによる位置合わせは認識精度が高いほか、AndroidiOS のプラットフォームでも利用可能なメリットがあります。
一方で QR コードを準備する必要があるデメリットがあります。

Microsoft.MixedReality.QR パッケージ

QR コードを利用するパッケージには Microsoft.MixedReality.QR パッケージを利用します。
bluebirdofoz.hatenablog.com

空間を示すゲームオブジェクトを作成し、その配下にアプリ内の全てのモデルを含めます。
QR コードを認識した位置にこのゲームオブジェクトを移動すれば、全てのデバイスで現実世界における共通の原点座標(QRコード位置)が利用できます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace SharingMarker.HologramCollection
{
    public class HologramCollectionTracker : MonoBehaviour
    {
        /// <summary>
        /// 共通座標トランスフォーム
        /// </summary>
        private Transform p_SharedWorldAnchorTransform;


        void Awake()
        {
            // 共通座標トランスフォームを取得する
            p_SharedWorldAnchorTransform = SharedCollectionForXR.Instance.gameObject.transform;
        }

        void Update()
        {
        }

        /// <summary>
        /// 指定のトランスフォームに追従する
        /// </summary>
        /// <param name="a_TargetTransform"></param>
        public void TrackTransform(Transform a_TargetTransform)
        {
            TrackSharedTransform(a_TargetTransform);
        }

        /// <summary>
        /// 共有座標をリセットする
        /// </summary>
        public void ResetTransform()
        {
            ResetSharedTransform();
        }

        /// <summary>
        /// 追跡対象トランスフォームの位置に共有座標を移動する
        /// </summary>
        private void TrackSharedTransform(Transform a_TargetTransform)
        {
            if (p_SharedWorldAnchorTransform != null)
            {
                // 追従対象オブジェクトの現在位置に共通座標トランスフォームの位置を移動する
                p_SharedWorldAnchorTransform.transform.position = a_TargetTransform.position;
                p_SharedWorldAnchorTransform.transform.rotation = a_TargetTransform.rotation;
            }
        }

        /// <summary>
        /// 共有座標をリセットする
        /// </summary>
        private void ResetSharedTransform()
        {
            if (p_SharedWorldAnchorTransform != null)
            {
                // 共通座標トランスフォームの位置をリセットする
                p_SharedWorldAnchorTransform.transform.position = new Vector3();
                p_SharedWorldAnchorTransform.transform.rotation = new Quaternion();
            }
        }
    }
}