MRが楽しい

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

MRTKv2.xとQuestDisplayAccessDemoを使ってQuest3でQRコードトラッキングを行う その2(シーンにQRコードトラッキングの機能を組み込む)

本日はMetaQuest3の技術調査枠です。
MRTKv2.xとQuestDisplayAccessDemoを使ってQuest3でQRコードラッキングを行う手順を記事にします。
今回はシーンにQRコードラッキングの機能を組み込む手順です。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

ビデオキャプチャスクリプト構成を取り込む

デモシーンに設定されているビデオキャプチャスクリプト構成をMRTKのシーンに取り込みます。
デモシーンを開き、Screen Capture Texture ManagerゲームオブジェクトをProjectフォルダにドラッグしてプレハブを作成します。

以下の記事で作成したMRTKシーンを開きます。
bluebirdofoz.hatenablog.com

先ほど作成したプレハブをHierarchyにドラッグしてシーンに配置します。

ビデオキャプチャの開始トリガーを設定する

ビデオキャプチャを開始するためのトグルボタンをシーンに配置します。
今回はMRTKのPressableButtonHoloLens2Toggleプレハブを利用しました。

トグルボタンの選択イベントにプレハブの参照を設定し、以下のビデオキャプチャの開始メソッドを設定します。
・DisplayCaptureManager.StartScreenCapture
トグルボタンの選択解除イベントには以下のビデオキャプチャの停止メソッドを設定します。
・DisplayCaptureManager.StartScreenCapture

キャプチャのイベントを設定する

QRコードラッキングの実行には必須ではないですが、キャプチャの開始/終了時などの発生イベントを設定することもできます。
プレハブのDisplayCaptureManagerコンポーネントでそれぞれ以下のイベントを設定できます。
・OnTextureInitialized:ビデオキャプチャのストリーム受け渡しイベント
・OnStarted:ビデオキャプチャ開始時のイベント
・OnPermissionDenied:ビデオキャプチャ権限エラー時のイベント
・OnStopped:ビデオキャプチャ終了時のイベント

OnTextureInitializedでビデオキャプチャのストリーム受け渡したい場合はRawImageコンポーネントを持つオブジェクトを作成してイベントに設定します。


EnvironmentDepthManagerコンポーネントの設定

プレハブにはQuestの深度推定を参照するためにEnvironmentDepthManagerコンポーネントが設定されています。

今回自分が利用したMRTKシーンには前回設定したEnvironmentDepthManagerコンポーネントが重複して存在していたため、削除を行いました。

TrackingSpaceの設定

プレハブにはQRコードラッキングの座標を推定するため、CameraRigのトラッキングスペースの参照を設定する必要があります。

MRTKv2.xを用いたシーンではCameraRigオブジェクトは動的に生成されるため、シーン内であらかじめ参照を設定しておくことができません。

今回は以下の2つのスクリプトを作成してシーン再生時にトラッキングスペースの参照を取得するようにしました。
ラッキングスペース側には以下のスクリプトを設定します。
・TrackingSpaceSingleton.cs

using UnityEngine;

public class TrackingSpaceSingleton : MonoBehaviour
{
    // 本クラスにはシングルトンパターンを適用する
    private static TrackingSpaceSingleton instance;
    
    // TrackingSpaceのTransformを保持する変数
    private Transform trackingSpaceTransform;
    
    // シングルトンパターンを適用するためのプロパティ
    public static TrackingSpaceSingleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<TrackingSpaceSingleton>();
            }
            return instance;
        }
    }
    
    // TrackingSpaceのTransformを取得するためのプロパティ
    public Transform TrackingSpaceTransform
    {
        get
        {
            if (trackingSpaceTransform == null)
            {
                trackingSpaceTransform = transform;
            }
            return trackingSpaceTransform;
        }
    }
}

CameraRig配下のTrackingSpaceオブジェクトにスクリプトを設定します。

次にプレハブ側には以下のスクリプトを設定します。
・ScreenCaptureTextureManagerSetup.cs

using Anaglyph.XRTemplate.DepthKit;
using UnityEngine;

[RequireComponent(typeof(DepthKitDriver))]
public class ScreenCaptureTextureManagerSetup : MonoBehaviour
{
    void Awake()
    {
        // DepthKitDriverの参照を取得する
        DepthKitDriver depthKitDriver = GetComponent<DepthKitDriver>();
        // DepthKitDriverのTrackingSpaceにTrackingSpaceSingleton(CameraRig配下)のTransformを設定
        if (TrackingSpaceSingleton.Instance == null)
        {
            Debug.LogError("TrackingSpaceSingleton is not found.");
            return;
        }
        depthKitDriver.trackingSpace = TrackingSpaceSingleton.Instance.TrackingSpaceTransform;
    }
}

プレハブにスクリプトを設定します。
スクリプトは同オブジェクトのDepthKitDriverコンポーネントを参照し、起動時にTrackingSpaceの参照を受け渡します。

ビルドと動作確認

これで設定は完了です。
以下の記事を参考にプロジェクトのビルドとQuest3へのデプロイを実行してください。
bluebirdofoz.hatenablog.com

MetaQuest3でデプロイしたアプリを起動します。
シーン内のトグルボタンをタップするとビデオキャプチャが開始され、キャプチャ結果がRawImageオブジェクトに再生されます。


キャプチャ中に現実空間のQRコードを確認します。
以下の通りQRコードのテキストが読み取り表示され、その座標がトラッキングされて緑枠で表示されます。