本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
QRコードによる位置合わせの実装
AR デバイス同士でシェアリングするに当たって、共通の空間の原点座標をどう設定するかという問題があります。
今回は QR コードを使って位置合わせを行うことにしました。
QR コードによる位置合わせは認識精度が高いほか、Android や iOS のプラットフォームでも利用可能なメリットがあります。
一方で 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(); } } } }