XR_ANDROID_spatial_annotation_tracking
Name String
XR_ANDROID_spatial_annotation_tracking
拡張機能のタイプ
インスタンス拡張機能
Registered Extension Number
795
リビジョン
1
Ratification Status(批准ステータス)
未批准
拡張機能とバージョンの依存関係
XR_EXT_spatial_entity
と
XR_EXT_spatial_image_tracking
最終更新日
2026-01-12
IP ステータス
既知の IP 申し立てはありません。
寄与者
Levana Chen、Google
Christopher Feil、Google
Martin Sundermeyer、Google
David Joseph Tan、Google
Jared Finder、Google
Nihav Jain、Google
概要
この拡張機能は、XR_EXT_spatial_entity 拡張機能にアノテーション トラッキング機能を提供し、シーン内のさまざまなアノテーションをトラッキングします。これにより、アプリケーションはランタイム参照で定義された物理オブジェクトまたは仮想オブジェクトにオーバーレイを配置できます。
この拡張機能は、基本的なアノテーション タイプ「Quad」を提供します。これは、実行時の参照内の一般的な 2D 境界ボックスを表す、4 つの辺を持つポリゴン(凸四角形)です。追跡された四角形アノテーションは、次のコンポーネントを持つ空間エンティティとして表されます。
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
通常、アプリケーションは次のパターンで空間アノテーション トラッキング拡張機能を使用できます。
- アプリケーションはまず XrSpatialReferenceCacheANDROID のハンドルを作成し、指定されたソースからのランタイム参照の記録を開始します。
- 次に、アプリケーションは XrSpatialReferenceImageEXT のランタイム参照を取得し、参照キャッシュの期間中に参照内で目的のアノテーションを定義します。
- 次に、アプリケーションは XrSpatialCapabilityConfigurationAnnotationTrackingANDROID によって提供される XrSpatialReferenceImageEXT に基づいて XrSpatialContextEXT ハンドルを作成します。
- アプリケーションは、XrSpatialReferenceCacheANDROID ハンドルを破棄してランタイム参照の記録を停止し、メモリ使用量を削減するか、
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDイベントを待って初期化の結果を確認できます。 - アプリケーションは
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDイベントをプルして、アノテーションの初期化結果を確認します。 - 初期化が成功すると、アプリケーションは
XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXTイベントをプルしてアノテーションをトラッキングできるようになります。 - 初期化に失敗した場合、アプリはイベントで返されたエラーコードを使用して失敗の理由を特定し、既存の XrSpatialContextEXT ハンドルを破棄して新しいアノテーションを開始できます。
- 初期化の結果に関係なく、アプリケーションはイベントを受信した後、メモリ使用量を減らすためにイメージ バッファを解放できます。
- アプリケーションは、空間エンティティのアクセス パターンに従ってアノテーションを検出してクエリします。
- アプリケーションは、有効な XrSpatialReferenceCacheANDROID の期間中に、新しい参照内のアノテーションをトラッキングするために、追加の XrSpatialContextEXT ハンドルを作成できます。
- アプリケーションは、XrSpatialContextEXT ハンドルを破棄して、実行時に検出可能で追跡可能なアノテーションのセットを動的に減らすことができます。
ランタイム サポート
ランタイムは、次の機能をリストすることで、xrEnumerateSpatialCapabilitiesEXT を使用してアノテーション トラッキング機能のサポートをアドバタイズしなければなりません。
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
ランタイムがアノテーション トラッキング機能をサポートしている場合:
- xrEnumerateSpatialCapabilityComponentTypesEXT を介してサポートされているアノテーション コンポーネントをリストすることで、少なくとも 1 つのアノテーション コンポーネントをサポートしなければなりません。
- XrSpatialReferenceImageFormatEXT の少なくとも 1 つをサポートし、
capabilityをXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDに設定して xrEnumerateSpatialReferenceImageFormatsEXT を介してサポートされている参照形式を列挙しなければなりません。 -
capabilityをXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDに設定して xrEnumerateSpatialAnnotationReferenceSourcesANDROID を介してサポートされている参照ソースをリストすることで、XrSpatialAnnotationReferenceSourceANDROID の少なくとも 1 つをサポートしなければなりません。
xrEnumerateSpatialAnnotationReferenceSourcesANDROID 関数は次のように定義されます。
XrResult xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t sourceCapacityInput,
uint32_t* sourceCountOutput,
XrSpatialAnnotationReferenceSourceANDROID* sources);
パラメータの説明
instanceは XrInstance のハンドルです。systemIdは、参照ソースが列挙されるXrSystemIdです。capabilityは、参照ソースが列挙される XrSpatialCapabilityEXT です。sourceCapacityInputはsources配列の容量です。必要な容量を取得するリクエストを示す場合は 0 です。sourceCountOutputは、ソースの数、またはsourceCapacityInputが不十分な場合に必要な容量です。sourcesは XrSpatialAnnotationReferenceSourceANDROID の配列です。sourceCapacityInputが 0 の場合、NULLになることがあります。- 必要な
sourcesサイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。
アプリケーションは、xrEnumerateSpatialAnnotationReferenceSourcesANDROID を使用して、特定の XrSystemId でサポートされている参照ソースのリストを列挙できます。
ランタイムは、instance で拡張機能が有効になっていない参照ソースを列挙してはなりません。
有効な使用方法(暗黙的)
- xrEnumerateSpatialAnnotationReferenceSourcesANDROID を呼び出す前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
instanceは、有効な XrInstance ハンドルでなければなりません。 -
capabilityは、有効な XrSpatialCapabilityEXT 値でなければなりません。 -
sourceCountOutputはuint32_t値へのポインタでなければなりません。 -
sourceCapacityInputが0でない場合、sourcesはsourceCapacityInputXrSpatialAnnotationReferenceSourceANDROID 値の配列へのポインタでなければなりません。
戻りコード
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
typedef enum XrSpatialAnnotationReferenceSourceANDROID {
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID = 0,
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID = 1,
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationReferenceSourceANDROID;
XrSpatialAnnotationReferenceSourceANDROID 列挙型は、アノテーションのメタデータを提供するリファレンスのソースを表します。
列挙型の意味は次のとおりです。
列挙型の説明
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID
参照画像は、Android カメラ API から出力された切り抜きなしの画像です。たとえば、Camera2 CameraDevice に関連付けられた ImageReader からの Image や、CameraX に関連付けられた ImageAnalysis からの ImageProxy などです。通常、これは前方に向いている RGB カメラの 1 つです。
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID
参照画像は、Android MediaProjection API から出力された切り抜きなしの画像です。たとえば、MediaProjection 仮想ディスプレイに関連付けられた ImageReader の画像などです。仮想コンテンツと現実のコンテンツを含めることができます。
XrSystemSpatialAnnotationPropertiesANDROID 構造体は次のように定義されます。
typedef struct XrSystemSpatialAnnotationPropertiesANDROID {
XrStructureType type;
void* next;
uint32_t referenceCacheTimespan;
uint32_t maxReferencePixelWidth;
uint32_t maxReferencePixelHeight;
uint32_t maxReferenceCount;
uint32_t maxAnnotationCount;
} XrSystemSpatialAnnotationPropertiesANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。referenceCacheTimespanは、有効な XrSpatialReferenceCacheANDROID ハンドルの期間(秒単位)を示します。maxReferencePixelWidthは、参照画像の端の最大幅をピクセル単位で示します。maxReferencePixelHeightは、参照画像の端の最大高さをピクセル単位で示します。maxReferenceCountは、同時に割り当てる参照画像の最大数を示します。maxAnnotationCountは、同時に追跡するアノテーションの最大数を示します。
ランタイムがアノテーション トラッキング機能をサポートしている場合、アプリは xrGetSystemProperties を呼び出すときに XrSystemSpatialAnnotationPropertiesANDROID 構造体を XrSystemProperties にチェーンすることで、関連するシステム プロパティを検査できます。
XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference からの XrSpatialReferenceImageEXT :: width が maxReferencePixelWidth を超える場合、ランタイムは xrCreateSpatialContextAsyncEXT を呼び出すときに XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference からの XrSpatialReferenceImageEXT :: height が maxReferencePixelHeight を超える場合、ランタイムは xrCreateSpatialContextAsyncEXT を呼び出すときに XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: time が XrSpatialReferenceCacheANDROID :: cache の期間外の場合、ランタイムは xrCreateSpatialContextAsyncEXT の呼び出し時に XR_ERROR_TIME_INVALID を返さなければなりません。アプリは、XrSpatialReferenceCacheANDROID の期間中に、新しい参照で XrSpatialContextEXT ハンドルを再作成できます。
割り当てられた参照画像の数が maxReferenceCount を超える場合、ランタイムは XR_ERROR_LIMIT_REACHED を返し、XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult を介して初期化の失敗を示す必要があります。アプリケーションは XrSpatialContextEXT ハンドルを破棄し、保留中の初期化が完了した後に再試行できます。
アクティブなアノテーションの数が maxAnnotationCount を超える場合、xrCreateSpatialContextAsyncEXT を呼び出すときに、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
有効な使用方法(暗黙的)
- XrSystemSpatialAnnotationPropertiesANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
ランタイム参照キャッシュ
XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)
XrSpatialReferenceCacheANDROID ハンドルは、特定のソースから記録されたランタイム参照のキャッシュを表します。
xrCreateSpatialReferenceCacheAsyncANDROID 関数は次のように定義されます。
XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
XrSession session,
const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
XrFutureEXT* future);
パラメータの説明
sessionは、参照キャッシュがアクティブになる XrSession です。createInfoは、参照キャッシュ パラメータを指定するために使用される XrSpatialReferenceCacheCreateInfoANDROID へのポインタです。futureはXrFutureEXTの出力ハンドルのポインタです。
アプリケーションは、xrCreateSpatialReferenceCacheAsyncANDROID を呼び出すことで、XrSpatialReferenceCacheANDROID ハンドルを作成できます。ランタイムがトラッキング サービスの初期化に時間を要することがあります。アプリケーションは、xrCreateSpatialReferenceCacheCompleteANDROID を繰り返し呼び出して、この非同期オペレーションの完了を確認できます。
ランタイムは、XrSpatialReferenceCacheCreateInfoANDROID :: capability が xrEnumerateSpatialCapabilitiesEXT によってリストされていない場合、XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT を返さなければなりません。
ランタイムは、指定されたケーパビリティに対して XrSpatialReferenceCacheCreateInfoANDROID :: source が xrEnumerateSpatialAnnotationReferenceSourcesANDROID によってリストされていない場合、XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。
アプリケーションは、特定のケーパビリティに対して、ソースごとに 1 つのハンドルしか作成できません。それ以外の場合、ランタイムは XR_ERROR_LIMIT_REACHED を返さなければなりません。
アプリケーションは、XrSpatialReferenceCacheANDROID ハンドルの期間中にランタイム参照をキャプチャして、新しい XrSpatialContextEXT ハンドルを構成できます。
有効な使用方法(暗黙的)
- xrCreateSpatialReferenceCacheAsyncANDROID を呼び出す前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
sessionは、有効な XrSession ハンドルでなければなりません。 -
createInfo有効な XrSpatialReferenceCacheCreateInfoANDROID 構造体へのポインタでなければなりません -
futureはXrFutureEXT値へのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialReferenceCacheCreateInfoANDROID 構造体は次のように定義されます。
typedef struct XrSpatialReferenceCacheCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
XrSpatialAnnotationReferenceSourceANDROID source;
} XrSpatialReferenceCacheCreateInfoANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。capabilityは、リファレンス キャッシュが作成される機能について説明する XrSpatialCapabilityEXT です。sourceは、参照キャッシュのソースを記述する XrSpatialAnnotationReferenceSourceANDROID です。
XrSpatialReferenceCacheCreateInfoANDROID 構造体は、XrSpatialReferenceCacheANDROID ハンドルを作成するための情報を記述します。
有効な使用方法(暗黙的)
- XrSpatialReferenceCacheCreateInfoANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
capabilityは、有効な XrSpatialCapabilityEXT 値でなければなりません。 -
sourceは、有効な XrSpatialAnnotationReferenceSourceANDROID 値でなければなりません。
xrCreateSpatialReferenceCacheCompleteANDROID 関数は次のように定義されます。
XrResult xrCreateSpatialReferenceCacheCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrCreateSpatialReferenceCacheCompletionANDROID* completion);
パラメータの説明
sessionは、以前に xrCreateSpatialReferenceCacheAsyncANDROID ::sessionに渡された XrSession です。futureは、xrCreateSpatialReferenceCacheAsyncANDROID ::futureから受け取ったXrFutureEXTです。completionは XrCreateSpatialReferenceCacheCompletionANDROID へのポインタです。
アプリケーションは、xrCreateSpatialReferenceCacheAsyncANDROID によって開始された非同期オペレーションの完了を待つために、xrCreateSpatialReferenceCacheCompleteANDROID を呼び出すことができます。
future が準備完了状態でない場合、ランタイムは XR_ERROR_FUTURE_PENDING_EXT を返さなければなりません。future がすでに完了またはキャンセルされている場合、ランタイムは XR_ERROR_FUTURE_INVALID_EXT を返さなければなりません。
有効な使用方法(暗黙的)
- xrCreateSpatialReferenceCacheCompleteANDROID を呼び出す前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
sessionは、有効な XrSession ハンドルでなければなりません。 -
completionは、XrCreateSpatialReferenceCacheCompletionANDROID 構造体へのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_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
XrCreateSpatialReferenceCacheCompletionANDROID 構造体は次のように定義されます。
typedef struct XrCreateSpatialReferenceCacheCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialReferenceCacheANDROID referenceCache;
} XrCreateSpatialReferenceCacheCompletionANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。futureResultは、参照キャッシュ作成オペレーションの XrResult です。- オペレーションが成功した場合、
referenceCacheは XrSpatialReferenceCacheANDROID ハンドルです。
今後の返品コード
futureResult 値:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHED
futureResult が成功コードの場合、ランタイムは有効な referenceCache ハンドルを返さなければなりません。referenceCache が有効な場合、xrCreateSpatialReferenceCacheAsyncANDROID :: session の有効期間内、またはアプリケーションが xrDestroySpatialReferenceCacheANDROID でハンドルを破棄するまでのいずれか早い方まで有効です。
referenceCache が有効な場合、XrSystemSpatialAnnotationPropertiesANDROID :: referenceCacheTimespan 内にキャッシュを記録します。
有効な使用方法(暗黙的)
- XrCreateSpatialReferenceCacheCompletionANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
futureResultは有効な XrResult 値でなければなりません。 -
referenceCacheは、有効な XrSpatialReferenceCacheANDROID ハンドルでなければなりません。
xrDestroySpatialReferenceCacheANDROID 関数は次のように定義されます。
XrResult xrDestroySpatialReferenceCacheANDROID(
XrSpatialReferenceCacheANDROID cacheHandle);
パラメータの説明
cacheHandleは、以前に xrCreateSpatialReferenceCacheAsyncANDROID で作成された XrSpatialReferenceCacheANDROID です。
空間コンテキストの作成が完了したら、アプリケーションは xrDestroySpatialReferenceCacheANDROID 関数を呼び出して、cacheHandle ハンドルと基盤となるリソースを解放できます。
有効な使用方法(暗黙的)
- xrDestroySpatialReferenceCacheANDROID を呼び出す前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
cacheHandleは、有効な XrSpatialReferenceCacheANDROID ハンドルでなければなりません。
スレッドセーフ
cacheHandleとその子ハンドルのアクセスは、外部で同期しなければなりません
戻りコード
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
構成
XrSpatialCapabilityConfigurationAnnotationTrackingANDROID 構造体は次のように定義されます。
typedef struct XrSpatialCapabilityConfigurationAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialReferenceCacheANDROID cache;
XrTime time;
XrSpatialReferenceImageEXT reference;
} XrSpatialCapabilityConfigurationAnnotationTrackingANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。capabilityは XrSpatialCapabilityEXT であり、XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDでなければなりません。enabledComponentCountは、enabledComponents配列内の要素の数を記述するuint32_tです。enabledComponentsは XrSpatialComponentTypeEXT の配列へのポインタです。cacheは、reference構成のランタイム参照を記録するために以前に作成された XrSpatialReferenceCacheANDROID です。timeは、referenceがキャプチャされるXrTimeです。referenceは、アノテーションが次のポインタにチェーンされている XrSpatialReferenceImageEXT です。
アプリは、XrSpatialContextCreateInfoEXT :: capabilityConfigs で XrSpatialCapabilityConfigurationAnnotationTrackingANDROID 構造体へのポインタを追加することで、XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID 空間機能を有効にできます。
capability が XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID でない場合、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
reference にアノテーションが含まれていない場合、ランタイムは XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT を返さなければなりません。
アノテーション コンポーネントが enabledComponents にリストされているが、対応するアノテーションが reference に関連付けられていない場合、ランタイムは XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT を返さなければなりません。
cache が xrCreateSpatialContextAsyncEXT に渡される同じ XrSession によって所有されていない場合、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
time が cache の期間外の場合、ランタイムは XR_ERROR_TIME_INVALID を返さなければなりません。
有効な使用方法(暗黙的)
- XrSpatialCapabilityConfigurationAnnotationTrackingANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります -
typeはXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
capabilityは、有効な XrSpatialCapabilityEXT 値でなければなりません。 -
enabledComponentsは、enabledComponentCount個の有効な XrSpatialComponentTypeEXT 値の配列へのポインタでなければなりません。 -
cacheは、有効な XrSpatialReferenceCacheANDROID ハンドルでなければなりません。 -
reference有効な XrSpatialReferenceImageEXT 構造でなければなりません -
enabledComponentCountパラメータは0より大きい値にする必要があります
アノテーション トラッキング イベント
XrEventDataSpatialAnnotationTrackingANDROID 構造体は次のように定義されます。
typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialContextEXT spatialContext;
uint32_t annotationIndex;
XrResult initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。spatialContextは、アノテーション トラッキングを有効にした XrSpatialContextEXT です。annotationIndexは、XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::referenceに関連付けられたアノテーション配列のインデックスにマッピングされます。initializationResultは、アノテーションの初期化結果を示します。XR_SUCCESSでない場合、アプリは XrSpatialContextEXT ハンドルを破棄して再作成し、アノテーションを再初期化するか、spatialContextを使用して他のアノテーションのトラッキングを続行できます。
有効な使用方法(暗黙的)
-
XR_ANDROID_spatial_annotation_tracking拡張機能は、XrEventDataSpatialAnnotationTrackingANDROID を使用する前に有効にしなければなりません。 -
typeはXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
ランタイムは、各アノテーションの XrEventDataSpatialAnnotationTrackingANDROID を入力して、初期化の完了を示す必要があります。初期化の結果に関係なく、アプリケーションはイベントを受信した後、イメージ バッファを解放してメモリ使用量を減らすことができます。
アノテーションが正常に初期化された場合、ランタイムは initializationResult に XR_SUCCESS を設定しなければなりません。アプリケーションは、XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT イベントをプルしてアノテーションをトラッキングできます。
それ以外の場合、ランタイムは、失敗の理由を示す適切なエラーコードを initializationResult に入力しなければなりません。アプリケーションは、XrSpatialContextEXT ハンドルを破棄して新しいアノテーションを開始するか、spatialContext を使用して他のアノテーションのトラッキングを続行できます。
Quad アノテーション
ランタイムは、次のコンポーネント タイプをリストすることで、xrEnumerateSpatialCapabilityComponentTypesEXT を使用してクアッド アノテーションのサポートをアドバタイズしなければなりません。
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
クアッド リファレンス
XrSpatialAnnotationQuadReferenceANDROID 構造体は次のように定義されます。
typedef struct XrSpatialAnnotationQuadReferenceANDROID {
XrStructureType type;
const void* next;
uint32_t quadCount;
const XrSpatialAnnotationQuadANDROID* quads;
} XrSpatialAnnotationQuadReferenceANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。quadCountは、quads配列内の要素の数を記述するuint32_tです。quadsは XrSpatialAnnotationQuadANDROID の配列へのポインタです。
ランタイムがクアッド アノテーションをサポートしている場合、アプリケーションは XrSpatialAnnotationQuadReferenceANDROID 構造体を XrSpatialReferenceImageEXT :: next にチェーンしてアノテーションを構成し、XrSpatialContextEXT ハンドルを作成する際に XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference で参照を設定できます。
quadCount が 0 の場合、ランタイムは xrCreateSpatialContextAsyncEXT から XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT を返さなければなりません。
有効な使用方法(暗黙的)
- XrSpatialAnnotationQuadReferenceANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります -
typeはXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
quadsは、quadCount個の有効な XrSpatialAnnotationQuadANDROID 構造体の配列へのポインタでなければなりません。 -
quadCountパラメータは0より大きい値にする必要があります
XrSpatialAnnotationQuadANDROID 構造体は次のように定義されます。
typedef struct XrSpatialAnnotationQuadANDROID {
XrSpatialAnnotationQuadAlignmentANDROID alignment;
XrVector2f upperLeft;
XrVector2f upperRight;
XrVector2f lowerRight;
XrVector2f lowerLeft;
} XrSpatialAnnotationQuadANDROID;
メンバーの説明
alignmentは、クアッドの XrSpatialAnnotationQuadAlignmentANDROID です。upperLeftは、原点に関連するクワッドの左上隅の座標を表す XrVector2f です。upperRightは、原点に関連するクワッドの右上隅の座標を表す XrVector2f です。lowerRightは、原点に関連するクアッドの右下隅の座標を表す XrVector2f です。lowerLeftは、原点に関連するクアッドの左下隅の座標を表す XrVector2f です。
2D 空間のクワッドは、時計回りの順序の凸四角形です。4 つの角の値は、クアッドが関連付けられている原点(0, 0)に関連しています。
- XrSpatialReferenceImageEXT に関連付けられている場合、原点は画像の左上隅です。X は幅のピクセルにマッピングされ、Y は高さのピクセルにマッピングされます。
- XrSpatialAnnotationQuadDataANDROID に関連付けられている場合、原点は XrSpatialAnnotationQuadDataANDROID ::
originの XrSpaceLocationData ::poseで示されます。
有効な使用方法(暗黙的)
- XrSpatialAnnotationQuadANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります -
alignmentは、有効な XrSpatialAnnotationQuadAlignmentANDROID 値でなければなりません
typedef enum XrSpatialAnnotationQuadAlignmentANDROID {
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID = 0,
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID = 1,
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationQuadAlignmentANDROID;
XrSpatialAnnotationQuadAlignmentANDROID 列挙型は、クアッド アノテーションの配置を記述します。
列挙型の意味は次のとおりです。
列挙型の説明
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID
アノテーションの四角形は画面平面と平行ですが、平面内の回転はワールド グラビティにロックされたままです。出力は、通常の直立した境界ボックスとして表示されます。
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID
アノテーションの四角形はオブジェクトに直接固定され、参照画像で定義された配置と一致します。出力は凸四角形で、オブジェクトの遠近法に合わせて形状が調整されます。
Quad コンポーネント
XrSpatialAnnotationQuadDataANDROID 構造体は次のように定義されます。
typedef struct XrSpatialAnnotationQuadDataANDROID {
uint32_t annotationIndex;
XrSpaceLocationData origin;
XrSpatialAnnotationQuadANDROID quad;
} XrSpatialAnnotationQuadDataANDROID;
メンバーの説明
annotationIndexは、XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::referenceによって渡された参照に関連付けられた XrSpatialAnnotationQuadReferenceANDROID ::quads配列へのインデックス マッピングです。originは、クアッドのルートとなる 2D 平面の原点を記述する XrSpaceLocationData です。ランタイムは、オリジン ポーズの有効なビットを示すために XrSpaceLocationData ::locationFlagsを設定しなければなりません。quadは、ローカル空間内のクアッドを表す XrSpatialAnnotationQuadANDROID です。originを使用して、クワッドをポーズ空間に変換します。
有効な使用方法(暗黙的)
- XrSpatialAnnotationQuadDataANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります -
originは有効な XrSpaceLocationData 構造でなければなりません。 -
quadは、有効な XrSpatialAnnotationQuadANDROID 構造体でなければなりません。
XrSpatialComponentAnnotationQuadListANDROID 構造体は次のように定義されます。
typedef struct XrSpatialComponentAnnotationQuadListANDROID {
XrStructureType type;
void* next;
uint32_t quadCount;
XrSpatialAnnotationQuadDataANDROID* quads;
} XrSpatialComponentAnnotationQuadListANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。quadCountは、quads配列内の要素の数を記述するuint32_tです。quadsは XrSpatialAnnotationQuadDataANDROID の配列です。
アプリケーションは、XrSpatialComponentDataQueryConditionEXT :: componentTypes に XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID を追加し、XrSpatialComponentDataQueryResultEXT の次のポインタ チェーンに XrSpatialComponentAnnotationQuadListANDROID を追加することで、XrSpatialSnapshotEXT の空間エンティティの四角形アノテーション コンポーネントをクエリできます。
ランタイムは、XrSpatialComponentAnnotationQuadListANDROID が XrSpatialComponentDataQueryResultEXT :: next の次のチェーンにあるが、XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID が XrSpatialComponentDataQueryConditionEXT :: componentTypes に含まれていない場合、xrQuerySpatialComponentDataEXT から XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
quadCount が XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput より小さい場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_SIZE_INSUFFICIENT を返さなければなりません。
有効な使用方法(暗黙的)
- XrSpatialComponentAnnotationQuadListANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります -
typeはXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
quadsは、quadCountXrSpatialAnnotationQuadDataANDROID 構造体の配列へのポインタでなければなりません。 -
quadCountパラメータは0より大きい値にする必要があります
コードの例
ランタイム サポートを確認する
次のサンプルコードは、ランタイムがアノテーション トラッキング機能をサポートしているかどうかを確認する方法を示しています。
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
PFN_xrEnumerateSpatialCapabilitiesEXT xrEnumerateSpatialCapabilitiesEXT;
PFN_xrEnumerateSpatialAnnotationReferenceSourcesANDROID xrEnumerateSpatialAnnotationReferenceSourcesANDROID;
PFN_xrEnumerateSpatialReferenceImageFormatsEXT xrEnumerateSpatialReferenceImageFormatsEXT;
PFN_xrEnumerateSpatialCapabilityComponentTypesEXT xrEnumerateSpatialCapabilityComponentTypesEXT;
// Check spatial annotation tracking capability
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0,
&capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount,
&capabilityCount,
capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(),
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID) ==
capabilities.end()) {
// System does not support spatial annotation tracking.
return;
}
// Inspect system properties for annotation tracking variables
XrSystemSpatialAnnotationPropertiesANDROID annotationSystemProperties{
XR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &annotationSystemProperties,
.systemId = systemId};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (annotationSystemProperties.maxAnnotationCount == 0) {
// System does not support any active annotations.
return;
}
// Enumerate supported reference sources
uint32_t sourceCountOutput = 0;
XrSpatialAnnotationReferenceSourceANDROID desiredSource =
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID;
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
0, &sourceCountOutput, nullptr));
std::vector<XrSpatialAnnotationReferenceSourceANDROID> sources(sourceCountOutput);
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
sourceCountOutput, &sourceCountOutput, sources.data()));
if (std::find(sources.begin(), sources.end(), desiredSource) == sources.end()) {
// The desired source is not supported.
return;
}
// Enumerate supported reference image formats, provided by XR_EXT_spatial_image_tracking.
uint32_t formatCountOutput = 0;
XrSpatialReferenceImageFormatEXT desiredFormat =
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT; // Or XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT for screenshot.
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID, 0,
&formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), desiredFormat) == formats.end()) {
// The desired format is not supported
return;
}
// Enumerate supported components for annotation tracking capability.
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes{
XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
&capabilityComponentTypes));
std::vector<XrSpatialComponentTypeEXT>
annotationTypes(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = annotationTypes.size();
capabilityComponentTypes.componentTypes = annotationTypes.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
&capabilityComponentTypes));
// Check supported annotation components.
XrSpatialComponentTypeEXT desiredComponent =
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID;
const auto supportedComponent = [&annotationTypes](
XrSpatialComponentTypeEXT component) {
return std::find(annotationTypes.begin(), annotationTypes.end(), component) !=
annotationTypes.end();
};
if (!supportedComponent(desiredComponent)) {
// The desired annotation is not supported.
return;
}
クワッド アノテーションを構成する
次のコード例は、四角形アノテーションを構成する方法を示しています。
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
PFN_xrCreateSpatialReferenceCacheAsyncANDROID xrCreateSpatialReferenceCacheAsyncANDROID;
PFN_xrCreateSpatialReferenceCacheCompleteANDROID xrCreateSpatialReferenceCacheCompleteANDROID;
PFN_xrDestroySpatialReferenceCacheANDROID xrDestroySpatialReferenceCacheANDROID;
PFN_xrCreateSpatialContextAsyncEXT xrCreateSpatialContextAsyncEXT;
PFN_xrCreateSpatialContextCompleteEXT xrCreateSpatialContextCompleteEXT;
void (*waitUntilReady)(XrFutureEXT);
XrSpatialReferenceImageFormatEXT desiredFormat;
XrSpatialAnnotationReferenceSourceANDROID desiredSource;
XrSpatialComponentTypeEXT desiredComponent;
// Create and start reference cache to prepare for capturing reference images.
XrSpatialReferenceCacheANDROID referenceCache;
XrSpatialReferenceCacheCreateInfoANDROID cacheCreateInfo{
.type = XR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
.source = desiredSource,
};
XrFutureEXT cacheFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialReferenceCacheAsyncANDROID(session, &cacheCreateInfo, &cacheFuture));
waitUntilReady(cacheFuture);
XrCreateSpatialReferenceCacheCompletionANDROID cacheCompletion{
XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID};
CHK_XR(xrCreateSpatialReferenceCacheCompleteANDROID(session, cacheFuture,
&cacheCompletion));
if (cacheCompletion.futureResult != XR_SUCCESS) {
// Error, reference cache creation failed
return;
}
referenceCache = cacheCompletion.referenceCache;
// Create the reference image with quad annotations
// YUV 4:2:0 Planar:
// ----------------------
// | Y |Cb |Cr |
// ----------------------
XrSpatialReferenceImagePlaneEXT cameraImagePlanes[3];
// for each plane (0=Y, 1=U(cb), 2=V(Cr)) return by Image#getPlanes().
for (int i = 0; i < 3; ++i) {
cameraImagePlanes[i].buffer; // read from Plane#getBuffer().
cameraImagePlanes[i].bufferSize; // set each buffer size. Y = width * height (bytes); U = Y / 4 (bytes); V = Y / 4 (bytes).
cameraImagePlanes[i].rowStride; // read from Plane#getRowStride().
cameraImagePlanes[i].pixelStride; // read from Plane#getPixelStride().
}
XrSpatialReferenceImageEXT referenceImage{
XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
referenceImage.width = 640;
referenceImage.height = 480;
referenceImage.format = desiredFormat;
referenceImage.planeCount = 3;
referenceImage.planes = cameraImagePlanes;
XrSpatialAnnotationQuadANDROID
quad; // quad coordinates within the reference image.
quad.alignment = XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID;
// Set unnormalized pixel coordinates of 4 corners.
quad.upperLeft = {0.0, 0.0};
quad.upperRight = {0.0, 100.0};
quad.lowerRight = {100.0, 100.0};
quad.lowerLeft = {0.0, 100.0};
XrSpatialAnnotationQuadReferenceANDROID quadReference{
XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID};
quadReference.quads = &quad;
quadReference.quadCount = 1;
referenceImage.next = &quadReference;
// Create the spatial context with annotation configuration.
XrSpatialContextEXT spatialContext{};
{
const std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
desiredComponent,
};
// Configure annotation tracking
XrSpatialCapabilityConfigurationAnnotationTrackingANDROID annotationConfig{
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID};
annotationConfig.capability =
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID;
annotationConfig.enabledComponentCount = enabledComponents.size();
annotationConfig.enabledComponents = enabledComponents.data();
annotationConfig.cache = referenceCache;
annotationConfig.time; // The time when this reference image is captured.
annotationConfig.reference = referenceImage;
std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT *>
capabilityConfigs;
capabilityConfigs.push_back(
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT *>(
&annotationConfig));
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
return;
}
spatialContext = completion.spatialContext;
CHK_XR(xrDestroySpatialReferenceCacheANDROID(referenceCache));
}
アクティブなアノテーションを見つける
次のコード例は、アノテーションを検出してクエリする方法を示しています。
XrInstance instance; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
XrSpatialContextEXT spatialContext; // previously created
PFN_xrCreateSpatialDiscoverySnapshotAsyncEXT xrCreateSpatialDiscoverySnapshotAsyncEXT;
PFN_xrCreateSpatialDiscoverySnapshotCompleteEXT xrCreateSpatialDiscoverySnapshotCompleteEXT;
PFN_xrQuerySpatialComponentDataEXT xrQuerySpatialComponentDataEXT;
PFN_xrDestroySpatialSnapshotEXT xrDestroySpatialSnapshotEXT;
PFN_xrPollEvent xrPollEvent;
PFN_xrDestroySpatialContextEXT xrDestroySpatialContextEXT;
void (*waitUntilReady)(XrFutureEXT);
XrSpatialComponentTypeEXT desiredComponent; // e.g. XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
auto discoverAnnotations = [&](XrSpatialContextEXT spatialContext, XrTime time,
XrSpace baseSpace) {
std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{desiredComponent};
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 = baseSpace;
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 desired annotation data, e.g. quad.
XrSpatialComponentTypeEXT componentsToQuery[] = {
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID};
XrSpatialComponentDataQueryConditionEXT queryCond{
XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = 1;
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<XrSpatialAnnotationQuadDataANDROID> quads(
queryResult.entityIdCountOutput);
XrSpatialComponentAnnotationQuadListANDROID quadList{
XR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID};
quadList.quadCount = quads.size();
quadList.quads = quads.data();
queryResult.next = &quadList;
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 XrSpatialAnnotationQuadDataANDROID ¤tQuad = quads[i];
// Rendering quad in the view.
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// For every frame in frame loop
XrSpace space; // Application's play space.
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_ANNOTATION_TRACKING_ANDROID: {
const XrEventDataSpatialAnnotationTrackingANDROID &eventdata =
*reinterpret_cast<XrEventDataSpatialAnnotationTrackingANDROID *>(
&event);
if (eventdata.initializationResult != XR_SUCCESS) {
// handle initialization failure.
// e.g. CHK_XR(xrDestroySpatialContextEXT(spatialContext));
}
break;
}
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, space);
break;
}
}
}
// Finish frame loop
}
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
新しいオブジェクト タイプ
新しいコマンド
- xrCreateSpatialReferenceCacheAsyncANDROID
- xrCreateSpatialReferenceCacheCompleteANDROID
- xrDestroySpatialReferenceCacheANDROID
- xrEnumerateSpatialAnnotationReferenceSourcesANDROID
新しい構造体
- XrCreateSpatialReferenceCacheCompletionANDROID
- XrEventDataSpatialAnnotationTrackingANDROID
- XrSpatialAnnotationQuadANDROID
- XrSpatialAnnotationQuadDataANDROID
- XrSpatialCapabilityConfigurationAnnotationTrackingANDROID
- XrSpatialReferenceCacheCreateInfoANDROID
XrSpatialReferenceImageEXT を拡張する :
XrSystemProperties の拡張 :
新しい列挙型
新しい列挙型定数
XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAMEXR_ANDROID_spatial_annotation_tracking_SPEC_VERSIONXrObjectType の拡張 :
XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
XrSpatialCapabilityEXT を拡張する :
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
XrSpatialComponentTypeEXT を拡張 :
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
XrStructureType を拡張する :
XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROIDXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROIDXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROIDXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROIDXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID
問題
バージョン履歴
リビジョン 1、2025-09-17(Levana Chen)
- 拡張機能の初回説明。