XR_ANDROID_spatial_annotation_tracking
Name String
XR_ANDROID_spatial_annotation_tracking
拡張機能の種類
インスタンス拡張
登録済みの内線番号
795
リビジョン
1
承認ステータス
未批准
拡張機能とバージョンの依存関係
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」を提供します。これは、正確に 4 つの辺を持つ多角形、つまり凸四角形であり、ランタイム参照内の一般化された 2D 境界ボックスを表します。追跡対象のクアッド アノテーションは、次のコンポーネントを持つ空間エンティティとして表されます。
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イベントを pull して、アノテーションの初期化結果を確認します。 - 初期化が成功すると、アプリケーションは
XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXTイベントを pull してアノテーションを追跡できます。 - 初期化に失敗した場合、アプリはイベントで返されたエラーコードを使用して失敗の理由を特定し、既存の XrSpatialContextEXT ハンドルを破棄して新しいアノテーションを開始できます。
- 初期化の結果に関係なく、アプリケーションはイベントを受信した後にイメージ バッファを解放してメモリ使用量を削減できます。
- アプリケーションは、空間エンティティのアクセス パターンに従ってアノテーションを検出し、クエリを実行します。
- アプリケーションは、有効な XrSpatialReferenceCacheANDROID の期間中に、新しい参照内のアノテーションを追跡するための追加の XrSpatialContextEXT ハンドルを作成できます。
- アプリケーションは、XrSpatialContextEXT ハンドルを破棄して、実行時に検出可能および追跡可能なアノテーションのセットを動的に削減できます。
ランタイム サポート
ランタイムは、xrEnumerateSpatialCapabilitiesEXT を使用して、次の機能をリストすることで、アノテーション トラッキング機能のサポートをアドバタイズしなければなりません。
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
ランタイムがアノテーション トラッキング機能をサポートしている場合:
- xrEnumerateSpatialCapabilityComponentTypesEXT を介してサポートされているアノテーション コンポーネントをリストすることで、少なくとも 1 つのアノテーション コンポーネントをサポートしなければなりません。
- xrEnumerateSpatialReferenceImageFormatsEXT を介してサポートされている参照形式を一覧表示し、
capabilityをXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDに設定することで、XrSpatialReferenceImageFormatEXT の少なくとも 1 つをサポートしなければなりません。 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 で拡張機能が有効になっていない参照ソースを列挙してはなりません。
有効な使用方法(暗黙的)
-
XR_ANDROID_spatial_annotation_tracking拡張機能は、xrEnumerateSpatialAnnotationReferenceSourcesANDROID を呼び出す前に有効にする必要があります。 -
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 へのポインタです。
アプリケーションは、xrCreateSpatialReferenceCacheCompleteANDROID を呼び出して、xrCreateSpatialReferenceCacheAsyncANDROID によって開始された非同期オペレーションの完了を待機できます。
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_INVALIDXR_ERROR_RUNTIME_FAILURE
構成
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を引き続き使用して他のアノテーションを追跡することもできます。
有効な使用方法(暗黙的)
- XrEventDataSpatialAnnotationTrackingANDROID を使用する前に、
XR_ANDROID_spatial_annotation_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
ランタイムは、各アノテーションの XrEventDataSpatialAnnotationTrackingANDROID を入力して、初期化の完了を示す必要があります。初期化の結果にかかわらず、アプリはイベントを受信した後に画像バッファを解放してメモリ使用量を削減できます。
アノテーションが正常に初期化された場合、ランタイムは initializationResult に XR_SUCCESS を入力しなければなりません。アプリケーションは、XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT イベントを pull してアノテーションを追跡できます。
それ以外の場合、ランタイムは、失敗の理由を示す適切なエラーコードを initializationResult に入力しなければなりません。アプリは、XrSpatialContextEXT ハンドルを破棄して新しいアノテーションを開始することも、spatialContext を引き続き使用して他のアノテーションを追跡することもできます。
クアッド アノテーション
ランタイムは、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_SURFACE_ANDROID = 2,
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
アノテーション クアッドはオブジェクトに直接アンカーされ、参照画像で定義された配置と一致します。出力は凸四角形であり、オブジェクトのパースペクティブに合わせて形状が調整されます。
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SURFACE_ANDROID
アノテーションの四角形は、追跡対象が平面オブジェクトまたは平面であると仮定すると、基になるオブジェクトの表面と同一平面上にあります。出力はオブジェクトの物理的な形状とシームレスに一致し、その特定の表面に対して平らになるようにパースが調整されます。
クアッド コンポーネント
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は、quadCount個の XrSpatialAnnotationQuadDataANDROID 構造体の配列へのポインタでなければなりません。-
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
XrSystemProperties の拡張:
新しい列挙型
新しい列挙型定数
XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAMEXR_ANDROID_spatial_annotation_tracking_SPEC_VERSIONXrObjectType の拡張:
XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
-
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)
- 拡張機能の初期説明。