画像トラッキング
このサンプルでは、現実世界の画像を検出し、その画像の位置と向きをトラッキングする方法を紹介します。
画像トラッキングの基本的な情報や、AR FoundationのAR Tracked Image Managerコンポーネントの機能については、Unityのドキュメントを参照してください。
機能の有効化
この機能を使用するには、以下のOpenXRのプロジェクト設定でImage Trackingにチェックす る必要があります。
Project Settings > XR Plug-in Management > OpenXR (Androidタブ) > OpenXR Feature Groups > Snapdragon Spaces > Image Tracking

サンプルのインポート
まだサンプルをインポートしていない場合は、以下の手順でインポートすることができます。
サンプルシーンは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/1.X.X/Core Samples/Scenes/Image Tracking Sample/Image Tracking Sample.unity
使用方法
画像ターゲットは、XR Reference Image Libraryを通して、基盤となる XRプラグインに供給されます。
参考画像は、テスト用の画像ターゲットの項目にあります。
画像トラッキングで使用する画像を変更する場合は、画像トラッキングの「トラッキング画像を変更(追加)する」の項目を確認してください 。
Reference Image Libraryでは以下の設定項目があります。
Name:トラッキングする画像を識別するための名前Specify Size:画像のサイズKeep Texture at Runtime:実行時にテクスチャを保持する(Trueに設定する必要がある)
これにより、画像トラッキングのための画像データをOpenXRのアプリケーションに渡すことができます。
サンプルでは画像ターゲットの高さは26cmです。正確なトラッキングを行うには正しいサイズを指定する必要があります。Specify Sizeを有効にすることで、サイズを指定できます。

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

画像ターゲットは紙に印刷することをおすすめします。
スマートフォン等の画面に画像ターゲットを表示する場合、画面輝度が明るすぎてARグラスのカメラ側では白飛びして認識できない可能性があります。
TR Castのような画面共有や録画アプリを使用する場合、画像トラッキングのようなカメラ映像を必要とする機能は動作しない可能性がありま す。
XROriginゲームオブジェクトにARTrackedImageManagerを追加すると、Snapdragon Spacesパッケージに含まれるImage Tracking Subsystemが有効になります。このコンポーネントは以下の項目を設定できます。
Serialized Library:上記で作成した RuntimeReferenceimageLibraryMax Number Of Moving Images:トラッキングする最大の画像枚数Tracked Image Prefab:トラッキングされた画像の検出時にスポーンするプレハブを指定します。例として、プレハブにはトラッキングされた画像の向きを示すギズモの3Dモデルが指定されています。
トラッキング画像の変更を検知するために、ARTrackedImageManagerのメソッドをサブスクライブすることで、以下の簡略化したコード例にあるようにトラッキングの状態とトラッキング画像の位置に対して適切なUI情報が設定されます。
このサンプルを動作させるには、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);
...
}
}