XR_EXT_spatial_image_tracking
Name String
XR_EXT_spatial_image_tracking
拡張機能の種類
インスタンス拡張
登録済みの内線番号
783
リビジョン
1
承認ステータス
未批准
拡張機能とバージョンの依存関係
XR_EXT_spatial_entity
寄与者
Daniel Guttenberg、Qualcomm
Nihav Jain、Google
Jared Finder、Google
Zhipeng Liu、ByteDance
概要
この拡張機能は、XR_EXT_spatial_entity 拡張機能に画像トラッキング機能を提供します。これにより、アプリケーションは、入力参照画像のセットで指定された特定の平面画像を検出して追跡できます。
トラッキングされた画像は、次のコンポーネントを持つ空間エンティティとして表されます。
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
アプリケーションは通常、次のパターンで空間画像トラッキング拡張機能を使用します。
- アプリケーションはまず、プリロードされた参照画像データのセットに基づいて 1 つ以上の XrSpatialImageTrackingDatabaseEXT ハンドルを作成します。
- 次に、アプリケーションは、以前に作成した XrSpatialImageTrackingDatabaseEXT ハンドルに基づいて XrSpatialContextEXT ハンドルを作成します。
- その後、アプリケーションは参照画像データを解放してメモリ消費量を削減します。
- アプリケーションは、空間エンティティのアクセス パターンに従って画像を検出してクエリします。
- アプリケーションは、参照画像の追加セットを読み込み、追加の XrSpatialImageTrackingDatabaseEXT を作成し、その後、それらから XrSpatialContextEXT を作成して、実行時に検出可能および追跡可能な画像のセットを動的に拡張できます。
- アプリケーションは、XrSpatialImageTrackingDatabaseEXT ハンドルを破棄して、実行時に検出可能および追跡可能な画像のセットを動的に減らすことができます。
- アプリケーションは、XrSpatialContextEXT ハンドルを破棄して、実行時に検出可能および追跡可能な画像のセットを動的に減らすことができます。
ランタイム サポート
ランタイムは、xrEnumerateSpatialCapabilitiesEXT を使用して、次の機能をリストすることで、画像トラッキング機能のサポートをアドバタイズしなければなりません。
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
構成
平面画像の検出とトラッキングを有効にするには、アプリケーションは、xrCreateSpatialContextAsyncEXT 関数を呼び出すときに、XrSpatialContextCreateInfoEXT :: capabilityConfigs で XrSpatialCapabilityConfigurationImageTrackingEXT 構造体を渡すことができます。また、各 XrSpatialCapabilityConfigurationImageTrackingEXT :: imageTrackingDatabases で XrSpatialImageTrackingDatabaseEXT 構造体の配列を渡すことができます。
入力画像セットの作成
検出および追跡する参照画像を指定するには、アプリで少なくとも 1 セットの入力参照画像を作成する必要があります。入力参照画像のセットは XrSpatialImageTrackingDatabaseEXT ハンドルで表され、少なくとも 1 つの画像が含まれます。
XR_DEFINE_HANDLE(XrSpatialImageTrackingDatabaseEXT)
XrSpatialImageTrackingDatabaseEXT ハンドルは、ユーザーの環境でいくつかの空間画像を検出して更新するためのリソースを表します。アプリケーションは、このハンドルを使用して、この拡張機能の他の関数を使用して空間画像を検出して更新できます。
空間画像トラッキング データベースを作成する
xrCreateSpatialImageTrackingDatabaseAsyncEXT 関数は次のように定義されます。
XrResult xrCreateSpatialImageTrackingDatabaseAsyncEXT(
XrSession session,
const XrSpatialImageTrackingDatabaseCreateInfoEXT* createInfo,
XrFutureEXT* future);
パラメータの説明
sessionは、空間画像トラッキング データベースがアクティブになる XrSession です。createInfoは、空間画像トラッキング データベースのパラメータを指定するために使用される XrSpatialImageTrackingDatabaseCreateInfoEXT です。futureはXrFutureEXTへのポインタです。
アプリは、xrCreateSpatialImageTrackingDatabaseAsyncEXT 関数を使用して XrSpatialImageTrackingDatabaseEXT ハンドルを作成し、createInfo を使用して画像トラッキング データベースの入力参照画像のセットを構成できます。
入力参照画像の XrSpatialReferenceImageEXT :: format が xrEnumerateSpatialReferenceImageFormatsEXT によって列挙されていない場合、ランタイムは XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXT を返さなければなりません。
XrSpatialReferenceImageEXT の参照画像メタデータに従って、入力参照画像の XrSpatialReferenceImageEXT :: planes 配列を評価できない場合、ランタイムは XR_ERROR_SPATIAL_IMAGE_INVALID_EXT を返さなければなりません。
ランタイムは、入力参照画像の XrSpatialReferenceImageEXT :: planes 配列が XrSpatialReferenceImageEXT :: format のカラー チャンネルと同じ数の平面を提供しない場合、XR_ERROR_SPATIAL_IMAGE_INVALID_EXT を返さなければなりません。
ランタイムが権限システムを適用して、画像トラッキング機能へのアプリケーション アクセスを制御する場合、ランタイムは、それらの権限がこのアプリケーションに付与されていない場合、XR_ERROR_PERMISSION_INSUFFICIENT を返さなければなりません。
この関数は非同期オペレーションを開始し、対応する XrFutureEXT を作成します。これは xrPollFutureEXT および関連する関数で使用できます。この関数の戻り値は、パラメータが非同期オペレーションのスケジュール設定に許容されるかどうかのみを示します。対応する完了関数は xrCreateSpatialImageTrackingDatabaseCompleteEXT です。この関数からのフューチャーが READY 状態のときに使用でき、その関数によって出力が完了構造 XrCreateSpatialImageTrackingDatabaseCompletionEXT に入力されます。
有効な使用方法(暗黙的)
-
XR_EXT_spatial_image_tracking拡張機能は、xrCreateSpatialImageTrackingDatabaseAsyncEXT を呼び出す前に有効にする必要があります。 -
sessionは、有効な XrSession ハンドルでなければなりません。 -
createInfoは、有効な XrSpatialImageTrackingDatabaseCreateInfoEXT 構造体へのポインタでなければなりません -
futureはXrFutureEXT値へのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialImageTrackingDatabaseCreateInfoEXT 構造体は次のように定義されます。
typedef struct XrSpatialImageTrackingDatabaseCreateInfoEXT {
XrStructureType type;
const void* next;
uint32_t spatialReferenceImageCount;
const XrSpatialReferenceImageEXT* spatialReferenceImages;
} XrSpatialImageTrackingDatabaseCreateInfoEXT;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。spatialReferenceImageCountは、spatialReferenceImages配列内の要素数です。spatialReferenceImagesは XrSpatialReferenceImageEXT の配列です。
XrSpatialImageTrackingDatabaseCreateInfoEXT 構造体は、XrSpatialImageTrackingDatabaseEXT ハンドルを作成するための情報を記述します。
各 XrSpatialImageTrackingDatabaseEXT は、XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages 配列に少なくとも 1 つの XrSpatialReferenceImageEXT を含めて作成しなければなりません。
有効な使用方法(暗黙的)
- XrSpatialImageTrackingDatabaseCreateInfoEXT を使用する前に、
XR_EXT_spatial_image_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタである必要があります。関連情報: XrSpatialImageSizeEXT、XrSpatialImageStaticOptimizationEXT -
spatialReferenceImagesは、spatialReferenceImageCount個の有効な XrSpatialReferenceImageEXT 構造体の配列へのポインタでなければなりません -
spatialReferenceImageCountパラメータは0より大きい値にする必要があります。
xrCreateSpatialImageTrackingDatabaseCompleteEXT 関数は次のように定義されます。
XrResult xrCreateSpatialImageTrackingDatabaseCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialImageTrackingDatabaseCompletionEXT* completion);
パラメータの説明
sessionは、以前に xrCreateSpatialContextAsyncEXT ::sessionに渡された XrSession です。futureは、xrCreateSpatialContextAsyncEXT から受け取ったXrFutureEXTです。completionは XrCreateSpatialImageTrackingDatabaseCompletionEXT へのポインタです。
xrCreateSpatialImageTrackingDatabaseCompleteEXT は、xrCreateSpatialImageTrackingDatabaseAsyncEXT によって開始された非同期オペレーションを完了します。
ランタイムは、この xrCreateSpatialImageTrackingDatabaseAsyncEXT 呼び出しの XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages 入力配列によって提供された XrSpatialReferenceImagePlaneEXT :: buffer ポインタに、呼び出しの完了後にアクセスしてはなりません。アプリケーションは、xrCreateSpatialImageTrackingDatabaseAsyncEXT の完了後に XrSpatialReferenceImagePlaneEXT :: buffer データを解放して、メモリ使用量を削減できます。
future が準備完了状態でない場合、ランタイムは XR_ERROR_FUTURE_PENDING_EXT を返さなければなりません。future がすでに完了またはキャンセルされている場合、ランタイムは XR_ERROR_FUTURE_INVALID_EXT を返さなければなりません。
有効な使用方法(暗黙的)
-
XR_EXT_spatial_image_tracking拡張機能は、xrCreateSpatialImageTrackingDatabaseCompleteEXT を呼び出す前に有効にする必要があります。 -
sessionは、有効な XrSession ハンドルでなければなりません。 -
completionは、XrCreateSpatialImageTrackingDatabaseCompletionEXT 構造体へのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
XrCreateSpatialImageTrackingDatabaseCompletionEXT 構造体は次のように定義されます。
typedef struct XrCreateSpatialImageTrackingDatabaseCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialImageTrackingDatabaseEXT database;
} XrCreateSpatialImageTrackingDatabaseCompletionEXT;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。futureResultは、空間画像トラッキング データベース作成オペレーションの XrResult です。databaseは、xrCreateSpatialImageTrackingDatabaseAsyncEXT ::createInfoのデータと構成を使用して作成された XrSpatialImageTrackingDatabaseEXT です。
今後の返品コード
futureResult の値:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXT
futureResult が成功コードの場合、database は有効なハンドルである必要があります。database が有効な場合、xrCreateSpatialImageTrackingDatabaseAsyncEXT :: session のライフサイクル内、またはアプリが xrDestroySpatialImageTrackingDatabaseEXT で database を破棄するまで(いずれか早い方)のみ有効です。
有効な使用方法(暗黙的)
- XrCreateSpatialImageTrackingDatabaseCompletionEXT を使用する前に、
XR_EXT_spatial_image_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
futureResultは有効な XrResult 値でなければなりません。 -
databaseは、有効な XrSpatialImageTrackingDatabaseEXT ハンドルでなければなりません
空間画像トラッキング データベースを破棄する
xrDestroySpatialImageTrackingDatabaseEXT 関数は次のように定義されます。
XrResult xrDestroySpatialImageTrackingDatabaseEXT(
XrSpatialImageTrackingDatabaseEXT database);
パラメータの説明
databaseは、以前に xrCreateSpatialImageTrackingDatabaseAsyncEXT によって作成された XrSpatialImageTrackingDatabaseEXT です。
アプリは、空間画像の検出と更新のタスクが完了したときに、xrDestroySpatialImageTrackingDatabaseEXT 関数を呼び出して database ハンドルと基盤となるリソースを解放できます。
アプリは、xrDestroySpatialContextEXT を呼び出す前に xrDestroySpatialImageTrackingDatabaseEXT 関数を呼び出すことができます。ランタイムは、この破棄された XrSpatialImageTrackingDatabaseEXT によって管理されている画像を報告してはなりません。ランタイムは、他のデータベースによって管理されているイメージを引き続き報告しなければなりません。
ランタイムは、xrCreateSpatialDiscoverySnapshotCompleteEXT によって返される検出スナップショットに、破棄された、または無効な XrSpatialImageTrackingDatabaseEXT ハンドルに関連する画像が含まれないようにしなければなりません。これは、アプリケーションが xrCreateSpatialDiscoverySnapshotAsyncEXT を呼び出した後にハンドルが破棄された場合でも同様です。空間スナップショット内のデータは不変であるため、アプリは database を破棄する前に作成された XrSpatialSnapshotEXT ハンドルを破棄すべきです。そうしないと、アプリは xrQuerySpatialComponentDataEXT を使用するときに無効な XrSpatialImageTrackingDatabaseEXT ハンドルを受け取る可能性があります。
アプリケーションは、xrDestroySpatialContextEXT 関数を呼び出して XrSpatialContextEXT ハンドルを解放してから、XrSpatialContextEXT の作成に使用された XrSpatialImageTrackingDatabaseEXT ハンドルを破棄できます。ランタイムは、XrSpatialContextEXT が破棄されたときに、これらの XrSpatialImageTrackingDatabaseEXT ハンドルを暗黙的に破棄してはなりません。
XrSpatialContextEXT と XrSpatialImageTrackingDatabaseEXT のライフタイムを個別に管理することで、アプリは、コストのかかる作成手順を再度実行することなく、以前に作成した XrSpatialImageTrackingDatabaseEXT ハンドルを再利用できます。
たとえば、XrSpatialContextEXT を破棄し、その後、同じ XrSpatialImageTrackingDatabaseEXT を使用して別の XrSpatialContextEXT を再作成すると、別の初期化手順を実行することなく、画像トラッキングの一時停止と再開が可能になります。
有効な使用方法(暗黙的)
-
XR_EXT_spatial_image_tracking拡張機能は、xrDestroySpatialImageTrackingDatabaseEXT を呼び出す前に有効にする必要があります。 -
databaseは、有効な XrSpatialImageTrackingDatabaseEXT ハンドルでなければなりません
スレッドセーフ
databaseとその子ハンドルへのアクセスは、外部で同期する必要があります。
戻りコード
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
入力画像形式のサポート
アプリは、xrEnumerateSpatialReferenceImageFormatsEXT を呼び出して、サポートされている入力参照画像形式のリストを取得すべきです。
xrEnumerateSpatialReferenceImageFormatsEXT 関数は次のように定義されます。
XrResult xrEnumerateSpatialReferenceImageFormatsEXT(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t formatCapacityInput,
uint32_t* formatCountOutput,
XrSpatialReferenceImageFormatEXT* formats);
パラメータの説明
instanceは XrInstance のハンドルです。systemIdは、入力参照画像形式が列挙されるXrSystemIdです。capabilityは、入力参照画像形式が列挙される XrSpatialCapabilityEXT です。formatCapacityInputはformats配列の容量です。0 の場合は、必要な容量を取得するリクエストであることを示します。formatCountOutputは、フォーマットの数、またはformatCapacityInputが不十分な場合に必要となる容量です。formatsは XrSpatialReferenceImageFormatEXT の配列です。formatCapacityInputが 0 の場合、NULLになることがあります。- 必要な
formatsサイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。
アプリは、xrEnumerateSpatialReferenceImageFormatsEXT を使用して、特定の XrSpatialCapabilityEXT に対して特定の XrSystemId でサポートされている入力参照画像形式のリストを列挙できます。
ランタイムは、instance で有効になっていない拡張機能の形式を列挙してはなりません。
有効な使用方法(暗黙的)
- xrEnumerateSpatialReferenceImageFormatsEXT を呼び出す前に、
XR_EXT_spatial_image_tracking拡張機能を有効にする必要があります。 -
instanceは、有効な XrInstance ハンドルでなければなりません。 -
capabilityは、有効な XrSpatialCapabilityEXT 値でなければなりません -
formatCountOutputはuint32_t値へのポインタでなければなりません -
formatCapacityInputが0でない場合、formatsはformatCapacityInputXrSpatialReferenceImageFormatEXT 値の配列へのポインタでなければなりません。
戻りコード
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
拡張機能でサポートされているすべての参照画像形式の一覧については、XrSpatialReferenceImageFormatEXT をご覧ください。
typedef enum XrSpatialReferenceImageFormatEXT {
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT = 1,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT = 2,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT = 3,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialReferenceImageFormatEXT;
XrSpatialReferenceImageFormatEXT 列挙型は、ランタイムがサポートする可能性のある入力参照画像形式を識別します。
少なくとも XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT 値と XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT 値をサポートしなければなりません。
列挙子の意味は次のとおりです。
列挙子の説明
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT- RGBA バッファ。この形式では、メモリ内のピクセルデータのレイアウトは保証されません。ピクセルには、対応する XrSpatialReferenceImagePlaneEXT 構造体によって提供されるメタデータを使用してアクセスしなければなりません。各ピクセルのカラー チャンネルのサイズは 8 ビットで、各ピクセルのサイズは 32 ビットです。XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT- RGB バッファ。この形式では、メモリ内のピクセルデータのレイアウトは保証されません。ピクセルには、対応する XrSpatialReferenceImagePlaneEXT 構造体によって提供されるメタデータを使用してアクセスしなければなりません。各ピクセルのカラー チャンネルは 8 ビットサイズで、各ピクセルのサイズは 24 ビットです。XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT- 4:2:0 パターンのクロマ サブサンプリングが適用された YUV バッファ。この形式では、メモリ内のピクセルデータのレイアウトは保証されません。ピクセルには、対応する XrSpatialReferenceImagePlaneEXT 構造体によって提供されるメタデータを使用してアクセスしなければなりません。デコードされた RGB ピクセルの各カラー チャンネルは 8 ビットサイズで、各ピクセルは 24 ビットサイズになります。
空間画像トラッキングの設定
この拡張機能には、アプリケーションが画像トラッキング機能を構成するために使用できるオプションの構造体が用意されています。
静止画像の最適化
XrSpatialImageStaticOptimizationEXT 構造体は次のように定義されます。
typedef struct XrSpatialImageStaticOptimizationEXT {
XrStructureType type;
const void* next;
XrBool32 optimizeForStaticImage;
} XrSpatialImageStaticOptimizationEXT;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。optimizeForStaticImageは、画像が移動するかどうかを示すXrBool32です。値XR_TRUEは、画像が移動しないことを示します。
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT が XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT 機能の xrEnumerateSpatialCapabilityFeaturesEXT によって列挙されている場合、アプリは XrSpatialImageStaticOptimizationEXT を XrSpatialImageTrackingDatabaseCreateInfoEXT :: next チェーンまたは XrSpatialReferenceImageEXT :: next にチェーンできます。
アプリが XrSpatialImageStaticOptimizationEXT を XrSpatialImageTrackingDatabaseCreateInfoEXT 構造にチェーンする場合、optimizeForStaticImage が XR_TRUE に設定されている場合、ランタイムは、その XrSpatialImageTrackingDatabaseEXT のすべての画像が静的であると想定しなければなりません。これに対応して、optimizeForStaticImage が XR_FALSE に設定されている場合、ランタイムは、その XrSpatialImageTrackingDatabaseEXT のすべての画像が静的ではないと想定しなければなりません。
アプリケーションが XrSpatialImageStaticOptimizationEXT を XrSpatialReferenceImageEXT 構造体にチェーンする場合、optimizeForStaticImage が XR_TRUE に設定されている場合、ランタイムは、この参照画像が静的であると想定しなければなりません。これに対応して、optimizeForStaticImage が XR_FALSE に設定されている場合、ランタイムは、この参照画像が静的でないと想定しなければなりません。XrSpatialImageStaticOptimizationEXT 構造体を XrSpatialReferenceImageEXT 構造体にチェーンすることは、XrSpatialImageTrackingDatabaseCreateInfoEXT 構造体にチェーンすることよりも優先されます。
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT が XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT 機能の xrEnumerateSpatialCapabilityFeaturesEXT によって列挙されず、アプリが XrSpatialImageStaticOptimizationEXT 構造体を該当する次のチェーンのいずれかにチェーンする場合、ランタイムは xrCreateSpatialImageTrackingDatabaseAsyncEXT から XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
これにより、ランタイムがより正確なポーズとサイズを生成できる可能性があります。
これにより、ランタイムの消費電力を削減できる可能性があります。
有効な使用方法(暗黙的)
-
XR_EXT_spatial_image_tracking拡張機能は、XrSpatialImageStaticOptimizationEXT を使用する前に有効にしなければなりません。 -
typeはXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
参照画像の幅
XrSpatialImageSizeEXT 構造体は次のように定義されます。
typedef struct XrSpatialImageSizeEXT {
XrStructureType type;
const void* next;
float physicalWidth;
} XrSpatialImageSizeEXT;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。physicalWidthは、設定する物理的な幅(メートル単位)を表すfloat値です。
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT 機能に対して xrEnumerateSpatialCapabilityFeaturesEXT によって XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT が列挙されている場合、アプリは XrSpatialImageSizeEXT を XrSpatialImageTrackingDatabaseCreateInfoEXT :: next または XrSpatialReferenceImageEXT :: next にチェーンできます。
アプリケーションが XrSpatialImageSizeEXT を XrSpatialImageTrackingDatabaseCreateInfoEXT 構造体にチェーンする場合、ランタイムは、その XrSpatialImageTrackingDatabaseEXT のすべての画像の幅が physicalWidth メートルで、高さが XrSpatialReferenceImageEXT :: width と XrSpatialReferenceImageEXT :: height を通じて暗黙的に提供されるアスペクト比に従っていると想定しなければなりません。
アプリが XrSpatialImageSizeEXT を XrSpatialReferenceImageEXT 構造体にチェーンする場合、ランタイムは、この参照画像の幅が physicalWidth メートルで、高さが XrSpatialReferenceImageEXT :: width と XrSpatialReferenceImageEXT :: height を介して暗黙的に提供されるアスペクト比に従っていると想定しなければなりません。XrSpatialImageSizeEXT 構造体を XrSpatialReferenceImageEXT 構造体にチェーンすることは、XrSpatialImageTrackingDatabaseCreateInfoEXT 構造体にチェーンすることよりも優先されます。
これにより、ランタイムがより正確なポーズとサイズを返す可能性があります。
ランタイムは、XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT または XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT、あるいはその両方を列挙しなければなりません。
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT が xrEnumerateSpatialCapabilityFeaturesEXT によって列挙される場合、ランタイムは、アプリケーションが該当する次のチェーンの一部として XrSpatialImageSizeEXT 構造を提供しなかった画像に対して、画像サイズを自動的に提供しなければなりません。
ランタイムが画像サイズを自動的かつ正確に生成できるようにするには、特定のデバイス機能と前提条件が必要になる場合があります。たとえば、ステレオ カメラ、正確に調整されたカメラの外部パラメータと内部パラメータなどです。
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT が xrEnumerateSpatialCapabilityFeaturesEXT によって列挙されない場合、アプリは XrSpatialImageSizeEXT 構造体を該当する次のチェーンにリンクして、すべての画像に明示的なサイズが指定されるようにしなければなりません。そうしない場合、ランタイムは xrCreateSpatialImageTrackingDatabaseAsyncEXT から XR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT を返さなければなりません。
有効な使用方法(暗黙的)
- XrSpatialImageSizeEXT を使用する前に、
XR_EXT_spatial_image_tracking拡張機能を有効にしなければなりません。 -
typeはXR_TYPE_SPATIAL_IMAGE_SIZE_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
XrSpatialCapabilityConfigurationImageTrackingEXT 構造体は次のように定義されます。
typedef struct XrSpatialCapabilityConfigurationImageTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
uint32_t imageTrackingDatabaseCount;
const XrSpatialImageTrackingDatabaseEXT* imageTrackingDatabases;
} XrSpatialCapabilityConfigurationImageTrackingEXT;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。capabilityは XrSpatialCapabilityEXT であり、XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXTでなければなりません。enabledComponentCountは、enabledComponentsの要素数を指定するuint32_tです。enabledComponentsは、この機能で有効にするコンポーネントを指定する XrSpatialComponentTypeEXT の配列です。imageTrackingDatabaseCountは、imageTrackingDatabasesの要素数を指定するunint32_tです。imageTrackingDatabasesは、空間コンテキストで有効にする画像トラッキング データベースを指定する XrSpatialImageTrackingDatabaseEXT ハンドルの配列です。
画像トラッキングがサポートされている場合、xrCreateSpatialContextAsyncEXT の呼び出し時に XrSpatialContextCreateInfoEXT :: capabilityConfigs で XrSpatialCapabilityConfigurationImageTrackingEXT 構造体が渡されると、ランタイムは画像トラッキングを有効にしなければなりません。
XrSpatialCapabilityConfigurationImageTrackingEXT 構造により、アプリは imageTrackingDatabases の XrSpatialImageTrackingDatabaseEXT ハンドルで表される参照画像を検出できます。
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT が xrEnumerateSpatialCapabilitiesEXT によって列挙されていない場合、ランタイムは XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT を返さなければなりません。
有効な使用方法(暗黙的)
- XrSpatialCapabilityConfigurationImageTrackingEXT を使用する前に、
XR_EXT_spatial_image_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
capabilityは、有効な XrSpatialCapabilityEXT 値でなければなりません -
enabledComponentsは、enabledComponentCount個の有効な XrSpatialComponentTypeEXT 値の配列へのポインタでなければなりません。 -
imageTrackingDatabasesは、imageTrackingDatabaseCount個の有効な XrSpatialImageTrackingDatabaseEXT ハンドルの配列へのポインタでなければなりません -
enabledComponentCountパラメータは0より大きい値にする必要があります。 -
imageTrackingDatabaseCountパラメータは0より大きい値にする必要があります。
空間参照画像
XrSpatialReferenceImagePlaneEXT 構造体は次のように定義されます。
typedef struct XrSpatialReferenceImagePlaneEXT {
uint32_t bufferSize;
uint8_t* buffer;
uint32_t rowStride;
uint32_t pixelStride;
} XrSpatialReferenceImagePlaneEXT;
パラメータの説明
bufferSizeはbuffer配列のサイズです。bufferは、平面データを表すuint8_tデータの配列です。rowStrideは、連続するピクセルデータ行の 2 つの開始位置間のバイト距離です。pixelStrideは、連続する 2 つのピクセル間のバイト距離です。
ランタイムは、rowStride パラメータと pixelStride パラメータが提供するパターンに従って buffer にアクセスする必要があります。
アプリケーションは、この XrSpatialReferenceImagePlaneEXT の意味のあるピクセルのみがランタイムによって抽出されるように、rowStride と pixelStride を設定しなければなりません。
有効な使用方法(暗黙的)
- XrSpatialReferenceImagePlaneEXT を使用する前に、
XR_EXT_spatial_image_tracking拡張機能を有効にしなければなりません。 -
bufferは、bufferSizeuint8_t値の配列へのポインタでなければなりません -
bufferSizeパラメータは0より大きい値にする必要があります。
XrSpatialReferenceImageEXT 構造体は次のように定義されます。
typedef struct XrSpatialReferenceImageEXT {
XrStructureType type;
const void* next;
uint32_t width;
uint32_t height;
XrSpatialReferenceImageFormatEXT format;
uint32_t planeCount;
const XrSpatialReferenceImagePlaneEXT* planes;
} XrSpatialReferenceImageEXT;
パラメータの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。widthは、参照画像のピクセル幅です。heightは、参照画像のピクセル単位の高さです。formatは、画像の形式を表す XrSpatialReferenceImageFormatEXT です。planeCountは、planes配列内の要素数です。planesは、画像データの平面を表す XrSpatialReferenceImagePlaneEXT 構造体の配列です。
アプリは、XrSpatialImageTrackingDatabaseEXT ハンドルの作成時に、XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages を介して xrCreateSpatialImageTrackingDatabaseAsyncEXT 関数に渡される単一の入力参照画像を表す 1 つ以上の XrSpatialReferenceImageEXT 構造体を作成できます。
XrSpatialReferenceImagePlaneEXT :: buffer データは、アプリケーションによって左から右、上から下のピクセル順序で提供しなければなりません。
アプリケーションは、XrSpatialReferenceImageEXT :: format の各カラー チャンネルに対して、XrSpatialReferenceImageEXT :: planes 配列に XrSpatialReferenceImagePlaneEXT 構造体を指定しなければなりません。
有効な使用方法(暗黙的)
- XrSpatialReferenceImageEXT を使用する前に、
XR_EXT_spatial_image_tracking拡張機能を有効にしなければなりません。 -
typeはXR_TYPE_SPATIAL_REFERENCE_IMAGE_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタである必要があります。関連情報: XrSpatialAnnotationQuadReferenceANDROID、XrSpatialImageSizeEXT、XrSpatialImageStaticOptimizationEXT -
formatは、有効な XrSpatialReferenceImageFormatEXT 値でなければなりません -
planesは、planeCount個の有効な XrSpatialReferenceImagePlaneEXT 構造体の配列へのポインタでなければなりません。 -
planeCountパラメータは0より大きい値にする必要があります。
保証対象の部品
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT をサポートするランタイムは、それらの機能によって検出されたすべてのエンティティの保証されたコンポーネントとして、次の空間コンポーネントを提供しなければならず、xrEnumerateSpatialCapabilityComponentTypesEXT でそれらを列挙しなければなりません。
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
画像 2D コンポーネント
クエリデータへのコンポーネント リスト構造体
XrSpatialComponentImage2DListEXT 構造体は次のように定義されます。
typedef struct XrSpatialComponentImage2DListEXT {
XrStructureType type;
const void* next;
uint32_t imageCount;
XrSpatialImage2DDataEXT* images;
} XrSpatialComponentImage2DListEXT;
パラメータの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。imageCountは、images配列内の要素数です。imagesは XrSpatialImage2DDataEXT の配列です。
XrSpatialComponentImage2DListEXT が XrSpatialComponentDataQueryResultEXT :: next チェーンに含まれているが、XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT が XrSpatialComponentDataQueryConditionEXT :: componentTypes に含まれていない場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
imageCount が XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput より小さい場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_SIZE_INSUFFICIENT を返さなければなりません。
有効な使用方法(暗黙的)
- XrSpatialComponentImage2DListEXT を使用する前に、
XR_EXT_spatial_image_tracking拡張機能を有効にしなければなりません。 -
typeはXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
imagesは、imageCount個の XrSpatialImage2DDataEXT 構造体の配列へのポインタでなければなりません -
imageCountパラメータは0より大きい値にする必要があります。
コンポーネント データ
XrSpatialImage2DDataEXT 構造体は次のように定義されます。
typedef struct XrSpatialImage2DDataEXT {
XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase;
uint32_t referenceImageIndex;
} XrSpatialImage2DDataEXT;
パラメータの説明
imageTrackingDatabaseは、画像を検出または追跡した XrSpatialImageTrackingDatabaseEXT です。referenceImageIndexは、imageTrackingDatabaseの作成に使用された入力参照画像の XrSpatialImageTrackingDatabaseCreateInfoEXT ::spatialReferenceImages配列にマッピングされるインデックスです。
アプリケーションは、imageTrackingDatabase を使用して、以前に作成された XrSpatialImageTrackingDatabaseEXT のうち、この XrSpatialImage2DDataEXT 構造体の参照画像を含むものを特定できます。その XrSpatialImageTrackingDatabaseEXT の場合、アプリケーションは referenceImageIndex を使用して、XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages 配列の入力順序と一致させることで、この XrSpatialImage2DDataEXT 構造の XrSpatialReferenceImageEXT を識別できます。
すべてのアクティブなデータベースのセットによって定義される参照画像のセットに、重複する画像を含めるべきではありません。重複する画像を含めると、検出やトラッキングの動作に悪影響を及ぼす可能性があります。たとえば、一貫性のないインデックスや複数のインデックスが返されることがあります。
有効な使用方法(暗黙的)
-
XR_EXT_spatial_image_tracking拡張機能は、XrSpatialImage2DDataEXT を使用する前に有効にしなければなりません。 -
imageTrackingDatabaseは、有効な XrSpatialImageTrackingDatabaseEXT ハンドルでなければなりません
構成
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT が、ある機能の XrSpatialCapabilityComponentTypesEXT :: componentTypes で列挙されている場合、アプリは、XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents リストに列挙値を含めることで、その機能を有効にできます。このコンポーネントでは、XrSpatialCapabilityConfigurationBaseHeaderEXT の次のチェーンに含めるための特別な構成は必要ありません。
境界付き 2D コンポーネント
境界付き 2D コンポーネントは、それが配置されているエンティティによって表される空間画像の中心と範囲を提供します。境界付き 2D コンポーネントの詳細については、境界付き 2D をご覧ください。
コード例
空間画像とクエリ コンポーネント データを検出する
次のサンプルコードは、画像トラッキング機能の空間エンティティを検出し、そのコンポーネント データをクエリする方法を示しています。
XrInstance instance; // Previously initialized
XrSystemId systemId; // Previously initialized
XrSession session; // Previously initialized
uint32_t capabilityCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCountOutput, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCountOutput);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilities.size(), &capabilityCountOutput, capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT) == capabilities.end()) {
// Image tracking not supported
}
XrSpatialCapabilityComponentTypesEXT imageTrackingComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));
std::vector<XrSpatialComponentTypeEXT> imageTrackingCapabilityComponents(imageTrackingComponents.componentTypeCountOutput);
imageTrackingComponents.componentTypes = imageTrackingCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));
if (std::find(imageTrackingCapabilityComponents.begin(), imageTrackingCapabilityComponents.end(), XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT) == imageTrackingCapabilityComponents.end()) {
// The image2d component is not supported
}
uint32_t capabilityFeatureCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &capabilityFeatureCountOutput, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> capabilityFeatures(capabilityFeatureCountOutput);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, capabilityFeatures.size(), &capabilityFeatureCountOutput, capabilityFeatures.data()));
// Helper function to query optional feature support
const auto supportsFeature = [&capabilityFeatures](XrSpatialCapabilityFeatureEXT feature) {
return std::find(capabilityFeatures.begin(), capabilityFeatures.end(), feature) != capabilityFeatures.end();
};
// supported state for optional features
const bool supportsAutomaticScaleEstimation = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT);
const bool supportsStaticImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT);
const bool supportsFixedSizeImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT);
uint32_t formatCountOutput = 0;
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT) == formats.end()) {
// The desired format is not supported
}
// Helper function to wait for XrFutureEXT completion
auto waitUntilReady = [&](XrFutureEXT future) {
XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
pollInfo.future = future;
do {
// sleep(1);
CHK_XR(xrPollFutureEXT(instance, &pollInfo, &pollResult));
} while (pollResult.state != XR_FUTURE_STATE_READY_EXT);
};
// Data/metadata about reference images (identifiers, 3D models, trigger functions, etc.)
std::vector<std::string> referenceImageIdentifiers;
XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase{};
{
uint32_t imgSize; // preloaded interleaved RGBA buffer size
uint8_t* img; // preloaded interleaved RGBA buffer data
// interleaved RGBA buffer memory layout and buffer positions
// first row of pixels
// img[0] | img[1] | img[2] | img[3] | img[0]+pStride | img[1]+pStride | ...
// R0 | G0 | B0 | A0 | R1 | G1 | ...
// second row of pixels
// img[0]+rStride | img[1]+rStride | img[2]+rStride | img[3]+rStride | img[0]+rStride+pStride | ...
// R640 | G640 | B640 | A640 | R641 | ...
XrSpatialReferenceImagePlaneEXT spatialReferenceImagePlanes[4];
for (int i = 0; i < 4; ++i) { // for each plane (0=R, 1=G, 2=B, 3=A)
spatialReferenceImagePlanes[i].buffer = img + i; // set each plane buffer pointer to the first pixel of the plane
spatialReferenceImagePlanes[i].bufferSize = imgSize - i; // adjust remeinaing buffer size according to offset applied
spatialReferenceImagePlanes[i].rowStride = 640 * 4; // set byte offset to start of next row for this plane
spatialReferenceImagePlanes[i].pixelStride = 4; // set byte offset to next pixel for this plane
}
XrSpatialReferenceImageEXT spatialReferenceImage{XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
spatialReferenceImage.width = 640;
spatialReferenceImage.height = 480;
spatialReferenceImage.format = XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT;
spatialReferenceImage.planeCount = 4;
spatialReferenceImage.planes = spatialReferenceImagePlanes;
referenceImageIdentifiers.emplace_back("MyReferenceImage");
// Helper function to append to the next chain
XrBaseOutStructure* appendTo = reinterpret_cast<XrBaseOutStructure*>(&spatialReferenceImage);
const auto appendToNextChain = [&appendTo](XrBaseOutStructure* toAppend) {
appendTo->next = toAppend;
appendTo = toAppend;
};
XrSpatialImageSizeEXT imageSize{XR_TYPE_SPATIAL_IMAGE_SIZE_EXT};
imageSize.physicalWidth = 0.1f;
if (!supportsAutomaticScaleEstimation) {
if (supportsFixedSizeImages) {
appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageSize));
}
}
XrSpatialImageStaticOptimizationEXT imageStaticOptimization{XR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXT};
imageStaticOptimization.optimizeForStaticImage = XR_TRUE;
if (supportsStaticImages) {
appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageStaticOptimization));
}
XrSpatialImageTrackingDatabaseCreateInfoEXT spatialImageTrackingDatabaseCreateInfo{XR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXT};
spatialImageTrackingDatabaseCreateInfo.spatialReferenceImages = &spatialReferenceImage;
spatialImageTrackingDatabaseCreateInfo.spatialReferenceImageCount = 1;
XrFutureEXT createImageTrackingDatabaseFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialImageTrackingDatabaseAsyncEXT(session, &spatialImageTrackingDatabaseCreateInfo, &createImageTrackingDatabaseFuture));
waitUntilReady(createImageTrackingDatabaseFuture);
XrCreateSpatialImageTrackingDatabaseCompletionEXT imageTrackingCompletion{XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXT};
CHK_XR(xrCreateSpatialImageTrackingDatabaseCompleteEXT(session, createImageTrackingDatabaseFuture, &imageTrackingCompletion));
if (imageTrackingCompletion.futureResult != XR_SUCCESS) {
// Error, image tracking database creation failed
}
imageTrackingDatabase = imageTrackingCompletion.database;
}
XrSpatialContextEXT spatialContext{};
{
const std::array<XrSpatialComponentTypeEXT, 2> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
};
// Configure the image tracking capability for the spatial context
XrSpatialCapabilityConfigurationImageTrackingEXT imageTrackingCapabilityConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXT};
imageTrackingCapabilityConfig.capability = XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT;
imageTrackingCapabilityConfig.enabledComponentCount = enabledComponents.size();
imageTrackingCapabilityConfig.enabledComponents = enabledComponents.data();
imageTrackingCapabilityConfig.imageTrackingDatabaseCount = 1;
imageTrackingCapabilityConfig.imageTrackingDatabases = &imageTrackingDatabase;
std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&imageTrackingCapabilityConfig));
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
// Error, spatial context creation failed
}
spatialContext = completion.spatialContext;
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
// We want to look for entities that have the following components
std::array<XrSpatialComponentTypeEXT, 2> snapshotComponents {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
XrFutureEXT discoveryFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &discoveryFuture));
waitUntilReady(discoveryFuture);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = discoveryFuture;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the bounded2d component data
XrSpatialComponentTypeEXT componentsToQuery[] = {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypes = componentsToQuery;
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityStateCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialBounded2DDataEXT> bounded2d(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT boundsList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
boundsList.boundCount = bounded2d.size();
boundsList.bounds = bounded2d.data();
queryResult.next = &boundsList;
std::vector<XrSpatialImage2DDataEXT> image2d(queryResult.entityIdCountOutput);
XrSpatialComponentImage2DListEXT imagesList{XR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXT};
imagesList.imageCount = image2d.size();
imagesList.images = image2d.data();
queryResult.next = &imagesList;
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
const XrSpatialImage2DDataEXT& currentImage2d = image2d[i];
const std::string& currentReferenceImageIdentifier = referenceImageIdentifiers[currentImage2d.referenceImageIndex];
std::cout << currentReferenceImageIdentifier << std::endl; // Outputs the "MyReferenceImage" string the app defined previously; could be any other assocatied data or action.
// Access bounded2d[i] for image bounds
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// For every frame in frame loop
XrFrameState frameState; // Previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata = *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
// Discover spatial entities for the context that we received the "discovery
// recommended" event for
discoverSpatialEntities(eventdata.spatialContext, time);
break;
}
}
}
// Finish frame loop
}
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
// Unload spatial image tracking resources internally
CHK_XR(xrDestroySpatialImageTrackingDatabaseEXT(imageTrackingDatabase));
新しいオブジェクト タイプ
新しいコマンド
- xrCreateSpatialImageTrackingDatabaseAsyncEXT
- xrCreateSpatialImageTrackingDatabaseCompleteEXT
- xrDestroySpatialImageTrackingDatabaseEXT
- xrEnumerateSpatialReferenceImageFormatsEXT
新しい構造
- XrCreateSpatialImageTrackingDatabaseCompletionEXT
- XrSpatialCapabilityConfigurationImageTrackingEXT
- XrSpatialImage2DDataEXT
- XrSpatialImageTrackingDatabaseCreateInfoEXT
- XrSpatialReferenceImageEXT
- XrSpatialReferenceImagePlaneEXT
XrSpatialReferenceImageEXT、XrSpatialImageTrackingDatabaseCreateInfoEXT を拡張します。
新しい列挙型
新しい列挙型定数
XR_EXT_SPATIAL_IMAGE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_image_tracking_SPEC_VERSIONXrObjectType の拡張:
XR_OBJECT_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_EXT
XrResult の拡張:
XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT
-
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
XrSpatialCapabilityFeatureEXT の拡張:
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXTXR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXTXR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT
XrSpatialComponentTypeEXT の拡張:
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
XrStructureType の拡張:
XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXTXR_TYPE_SPATIAL_IMAGE_SIZE_EXTXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXTXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXTXR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT
問題
変更履歴
リビジョン 1、2025-04-22(Daniel Guttenberg、Qualcomm)
- 拡張機能の初期説明