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

画像トラッキング

この機能は、AR Foundationの画像トラッキングに基づいています。

画像トラッキングの基本的な情報と、AR FoundationのAR Tracked Image Managerコンポーネントが何をするかについては、Unityのドキュメントを参照してください。

画像ターゲットは、XR Reference Image Libraryを通して基礎となるXRプラグインに供給されます。
追加された画像には、後でトラッキングされたターゲットを特定するのに便利な名前と、trueに設定する必要がある重要なKeep Texture at Runtimeフラグがあります。これにより、サブシステムはトラッキングのためにテクスチャデータをSnapdragon Spaces Servicesに渡すことができます。

機能の有効化

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

機能の設定

この機能の設定は、OpenXRのプロジェクト設定のImage Trackingの項目内の右横の歯車アイコンをクリックすると表示されます。

alt text
画像トラッキング機能には2つの設定があります。

  • Extended Range Mode:広範囲に最適化されたトラッキングを行います。
  • Low Power Mode:低消費電力に最適化されたトラッキングを行います。

Spaces Reference Image Configurator

alt text オプションのSpaces Reference Image Configuratorコンポーネントは、ARTrackedImageManagerと同じGameObjectに追加することができます。このコンポーネントでは、トラッキング画像の追加設定を行えます。

トラッキングモード

Tracking Modeのフィールドでは、画像ごとに異なるトラッキングモードを設定できます。

  • Dynamic (Default):Dynamicモードは、トラッキングされた画像の位置がフレームごとに更新され、移動中のターゲットと静止したターゲットの両方で機能します。トラッキングされた画像が見つからない場合、位置や姿勢は報告されません。このモードでは、他のトラッキングモードに比べて消費電力が高くなります。Spaces Reference Image Configuratorコンポーネントが見つからない場合、全てのトラッキング画像はデフォルトでこのトラッキングモードを使用します。
  • Static:Staticモードは、静止した画像をトラッキングするのに役立ち、消費電力の削減とパフォーマンスの向上につながります。たとえば、床や壁に貼り付けられた画像がこれに該当します。このモードは、画像が見えなくなった後も、引き続き表示される必要があるARオブジェクトを表示し続けるのに便利です。Staticモードでトラッキングされた画像の位置は、画像が移動したか視界から外れたかに関係なく、更新されることはありません。
  • Adaptive:Adaptiveモードは静止した画像で動作しますが、トラッキングされた画像が動いた場合は、およそ5フレームごとに定期的に画像の位置を更新します。HMDが移動した場合、画像の位置はディスプレイのリフレッシュレートに合わせて更新されます。視界から外れた画像のトラッキングは最終的に失われます。このモードは、消費電力とトラッキング精度のバランスをとります。
トラッキングモードトラッキングの開始タイミング画像位置の更新間隔トラッキングの終了タイミング
Dynamic (default)画像がカメラ画角内に入った時全てのフレーム画像がカメラ画角外に出た時
Static画像がカメラ画角内に入った時更新無し新しい画像がトラッキングされた場合
Adaptive画像がカメラ画角内に入った時5フレームごと画像がカメラ画角外に出た時

アプリを起動すると、トラッキングされた画像は Spaces Reference Image Configuratorコンポーネントで定義されたトラッキングモードを使用します。

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

string referenceImageName = ...; // referenceImageName to change Tracking Mode for
TrackableId trackableId = ...; // a TrackableId for an existing tracked instance of this image
...

// first, stop tracking any instances of the tracked image for which the Tracking Mode should be updated.
// if tracking is not stopped, the instance can (but is not guaranteed to) continue to be tracked using the old Tracking Mode for some time
referenceImageConfigurator.StopTrackingImageInstance(referenceImageName, trackableId);
...

// then, set the desired tracking mode for all future instances of the tracked image with that referenceImageName
referenceImageConfigurator.SetTrackingModeForReferenceImage(referenceImageName, SpacesImageTrackingMode.DYNAMIC);
referenceImageConfigurator.SetTrackingModeForReferenceImage(referenceImageName, SpacesImageTrackingMode.STATIC);
referenceImageConfigurator.SetTrackingModeForReferenceImage(referenceImageName, SpacesImageTrackingMode.ADAPTIVE);

実行時にトラッキング画像を変更する

シーンを切り替えることなく、AR Tracked Image Managerが使用する参照画像ライブラリ(トラッキングする画像)を実行時に変更することが可能です。そのためには、以下の点について考慮する必要があります。

  • ライブラリの変更を有効にするには、Image Tracking subsystemを再起動する必要があります。これは、AR Tracked Image Managerコンポーネントを再び有効にすることで実現できます。
  • コンポーネントのSyncTrackingModes関数を使用して、新しいライブラリ用にSpaces Reference Image Configuratorでトラッキングモードを再同期する必要があります。引数として、参照画像名と最初のトラッキングモードのDictionary<string, SpacesImageTrackingMode>を指定します。
WARNING

ライブラリを交換する際、Spaces Reference Image Configuratorでトラッキングモードの再適用を行なわず、前のライブラリに参照イメージ名が見つからない場合、SetTrackingModeForReferenceImage関数が失敗します。
このような場合、Dynamicモードが参照画像のデフォルトのトラッキングモードになります。

以下のサンプルコードでは、実行時に異なる参照画像ライブラリにスワップする関数 SwapTargetLibraryを実装しています。まず、Tracked Image Managerコンポーネントを無効にし、Spaces Reference Image ConfiguratorコンポーネントのSyncTrackingModes関数でトラッキングモードを再同期します。参照画像名と最初のトラッキングモードのDictionary<string, SpacesImageTrackingMode>は、補助関数CreateTrackingModesDictionaryによって提供されます。最後に、新しい参照ライブラリがAR Tracked Image Managerコンポーネントに適用され、後者が再度有効になります。

public ARTrackedImageManager TrackedImageManager;
public SpacesReferenceImageConfigurator ReferenceImageConfigurator;

void SwapTargetLibrary(XRReferenceImageLibrary library)
{
TrackedImageManager.enabled = false;
ReferenceImageConfigurator.SyncTrackingModes(CreateTrackingModesDictionary(library));
TrackedImageManager.referenceLibrary = library;
TrackedImageManager.enabled = true;
}

Dictionary<string, SpacesImageTrackingMode> CreateTrackingModesDictionary(XRReferenceImageLibrary library)
{
Dictionary<string, SpacesImageTrackingMode> trackingModes = new Dictionary<string, SpacesImageTrackingMode>();
foreach (var referenceImage in library)
{
trackingModes[referenceImage.name] = SpacesImageTrackingMode.DYNAMIC;
}

return trackingModes;
}