画像トラッキング
このサンプルでは、現実世界の画像を検出し、その画像の位置と向きをトラッキングする方法を紹介します。
画像トラッキングの基本的な情報や、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);
...
}
}