メインコンテンツまでスキップ
バージョン: 1.0.1

画像トラッキング

このサンプルでは、現実世界の画像を検出し、その画像の位置と向きをトラッキングする方法を紹介します。

画像トラッキングの基本的な情報や、AR FoundationAR Tracked Image Managerコンポーネントの機能については、Unityのドキュメントを参照してください。

機能の有効化

この機能を使用するには、以下のOpenXRのプロジェクト設定でImage Trackingにチェックする必要があります。
Project Settings > XR Plug-in Management > OpenXR (Androidタブ) > OpenXR Feature Groups > Snapdragon Spaces > Image Tracking
alt text

サンプルのインポート

まだサンプルをインポートしていない場合は、以下の手順でインポートすることができます。

  1. 基本パッケージのインポート
  2. 基本サンプルのインポート

サンプルシーンは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/1.X.X/Core Samples/Scenes/Image Tracking Sample/Image Tracking Sample.unity

使用方法

画像ターゲットは、XR Reference Image Libraryを通して、基盤となる XRプラグインに供給されます。

TIP

参考画像は、テスト用の画像ターゲットの項目にあります。

Reference Image Libraryでは以下の設定項目があります。

  • Name:トラッキングする画像を識別するための名前
  • Specify Size:画像のサイズ
  • Keep Texture at Runtime:実行時にテクスチャを保持する(Trueに設定する必要がある)

これにより、画像トラッキングのための画像データをOpenXRのアプリケーションに渡すことができます。

サンプルでは画像ターゲットの高さは26cmです。正確なトラッキングを行うには正しいサイズを指定する必要があります。Specify Sizeを有効にすることで、サイズを指定できます。 alt text

WARNING

画像ターゲットに使用している画像のImport Settingsでは、FormatをRGB 24 bitに設定する必要があります。別のFormatの場合、画像トラッキングは動作しません。 alt text

TIP

画像ターゲットは紙に印刷することをおすすめします。
スマートフォン等の画面に画像ターゲットを表示する場合、画面輝度が明るすぎてARグラスのカメラ側では白飛びして認識できない可能性があります。

TIP

TR Castのような画面共有や録画アプリを使用する場合、画像トラッキングのようなカメラ映像を必要とする機能は動作しない可能性があります。

XROriginゲームオブジェクトにARTrackedImageManagerを追加すると、Snapdragon Spacesパッケージに含まれるImage Tracking Subsystemが有効になります。このコンポーネントは以下の項目を設定できます。

  • Serialized Library:上記で作成した RuntimeReferenceimageLibrary
  • Max Number Of Moving Images:トラッキングする最大の画像枚数
  • Tracked Image Prefab:トラッキングされた画像の検出時にスポーンするプレハブを指定します。例として、プレハブにはトラッキングされた画像の向きを示すギズモの3Dモデルが指定されています。 alt text

トラッキング画像の変更を検知するために、ARTrackedImageManagerのメソッドをサブスクライブすることで、以下の簡略化したコード例にあるようにトラッキングの状態とトラッキング画像の位置に対して適切なUI情報が設定されます。

WARNING

このサンプルを動作させるには、XR Reference Image Libraryに設定されている参照画像名が一意である必要があります。同じ名前があると、Dictionary型の_trackedImagesでハッシュコードの衝突が発生します。

    ...

private Dictionary<TrackableId, ...> _trackedImages = new Dictionary<TrackableId, ...>();

public override void OnEnable() {
...
FindObjectOfType<ARTrackedImageManager>().trackedImagesChanged += OnTrackedImagesChanged;
}

public override void OnDisable() {
...
FindObjectOfType<ARTrackedImageManager>().trackedImagesChanged -= OnTrackedImagesChanged;
}

private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs args) {
foreach (var trackedImage in args.added) {
if (trackedImage.referenceImage.name == "Spaces Town") {
_trackedImages.Add(trackedImage.trackableId, ...);
...
}
}

foreach (var trackedImage in args.updated) {
var info = _trackedImages[trackedImage.trackableId];
...
}

foreach (var trackedImage in args.removed) {
_trackedImages.Remove(trackedImage.trackableId);
...
}
}