XR_ANDROID_spatial_annotation_tracking
名稱字串
XR_ANDROID_spatial_annotation_tracking
擴充功能類型
執行個體擴充功能
擴充功能註冊編號
795
修訂版本
1
批准狀態
未批准
擴充功能和版本依附元件
XR_EXT_spatial_entity
和
XR_EXT_spatial_image_tracking
上次修改日期
2026-01-12
IP 狀態
未發現任何智慧財產權聲明。
著作人
Google 的 Levana Chen
Google 的 Christopher Feil
Google 的 Martin Sundermeyer
Google 的 David Joseph Tan
Google 的 Jared Finder
Google 的 Nihav Jain
總覽
這項擴充功能可為 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事件,確認註解的初始化結果。 - 如果初始化成功,應用程式可以提取
XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT事件,追蹤註解。 - 如果初始化失敗,應用程式可以使用事件中傳回的錯誤代碼判斷失敗原因,並終止現有的 XrSpatialContextEXT 控制代碼,開始新的註解。
- 無論初始化結果為何,應用程式可以在收到事件後釋放圖片緩衝區,減少記憶體用量。
- 應用程式會根據空間實體存取模式,探索及查詢註解。
- 應用程式可以建立額外的 XrSpatialContextEXT 控制代碼,在有效 XrSpatialReferenceCacheANDROID 的時間範圍內,追蹤新參照中的註解。
- 應用程式可以銷毀 XrSpatialContextEXT 控制代碼,在執行階段動態減少可偵測及追蹤的註解集。
執行階段支援
執行階段必須使用 xrEnumerateSpatialCapabilitiesEXT 列出下列功能,宣傳其支援註解追蹤功能:
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
如果執行階段支援註解追蹤功能:
- 必須支援至少一個註解元件,方法是透過 xrEnumerateSpatialCapabilityComponentTypesEXT 列出支援的註解元件。
- 必須支援至少一個 XrSpatialReferenceImageFormatEXT,方法是透過 xrEnumerateSpatialReferenceImageFormatsEXT 列出支援的參照格式,並將
capability設為XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID。 - 必須支援至少一個 XrSpatialAnnotationReferenceSourceANDROID,方法是透過 xrEnumerateSpatialAnnotationReferenceSourcesANDROID 列出支援的參照來源,並將
capability設定為XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID。
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必須是指向sourceCapacityInput個 XrSpatialAnnotationReferenceSourceANDROID 值陣列的指標
傳回代碼
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 Camera API 輸出未經裁剪的圖像,例如與 Camera2 CameraDevice 相關聯的 ImageReader 中的 Image,或是與 CameraX 相關聯的 ImageAnalysis 中的 ImageProxy。這通常是朝前的 RGB 攝影機。
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,藉此檢查相關系統屬性。
如果 XrSpatialReferenceImageEXT :: width 來自 XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference 超過 maxReferencePixelWidth,則在呼叫 xrCreateSpatialContextAsyncEXT 時,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialReferenceImageEXT :: height 來自 XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference 超過 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。
有效用量 (隱含)
-
XR_ANDROID_spatial_annotation_tracking擴充功能必須先啟用,才能使用 XrSystemSpatialAnnotationPropertiesANDROID -
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,檢查這項非同步作業是否完成。
如果 xrEnumerateSpatialCapabilitiesEXT 未列出 XrSpatialReferenceCacheCreateInfoANDROID :: capability,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT。
如果 xrEnumerateSpatialAnnotationReferenceSourcesANDROID 未列出指定功能的 XrSpatialReferenceCacheCreateInfoANDROID :: source,執行階段「必須」傳回 XR_ERROR_FEATURE_UNSUPPORTED。
應用程式只能為特定功能建立一個控制代碼 (每個來源)。否則,執行階段「必須」傳回 XR_ERROR_LIMIT_REACHED。
應用程式可以在 XrSpatialReferenceCacheANDROID 控制代碼的時間範圍內擷取執行階段參照,以設定新的 XrSpatialContextEXT 控制代碼。
有效用量 (隱含)
- 呼叫 xrCreateSpatialReferenceCacheAsyncANDROID 前,
XR_ANDROID_spatial_annotation_tracking擴充功能必須啟用 -
sessionmust 為有效的 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 控制代碼的資訊。
有效用量 (隱含)
- 必須先啟用
XR_ANDROID_spatial_annotation_tracking擴充功能,才能使用 XrSpatialReferenceCacheCreateInfoANDROID -
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 的 XrSession ::session。future是從 xrCreateSpatialReferenceCacheAsyncANDROID 接收的XrFutureEXT::future。completion是 XrCreateSpatialReferenceCacheCompletionANDROID 的指標。
應用程式可以呼叫 xrCreateSpatialReferenceCacheCompleteANDROID,等待 xrCreateSpatialReferenceCacheAsyncANDROID 啟動的非同步作業完成。
如果 future 未處於就緒狀態,執行階段必須傳回 XR_ERROR_FUTURE_PENDING_EXT。如果 future 已完成或取消,執行階段必須傳回 XR_ERROR_FUTURE_INVALID_EXT。
有效用量 (隱含)
-
XR_ANDROID_spatial_annotation_tracking擴充功能必須在呼叫 xrCreateSpatialReferenceCacheCompleteANDROID 之前啟用 -
sessionmust 為有效的 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 內的快取。
有效用量 (隱含)
- 必須先啟用
XR_ANDROID_spatial_annotation_tracking擴充功能,才能使用 XrCreateSpatialReferenceCacheCompletionANDROID -
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是uint32_t,說明enabledComponents陣列中的元素數量。uint32_tenabledComponents是指向 XrSpatialComponentTypeEXT 陣列的指標。cache是先前建立的 XrSpatialReferenceCacheANDROID,用於記錄reference設定的執行階段參照。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。
有效用量 (隱含)
- 必須先啟用
XR_ANDROID_spatial_annotation_tracking擴充功能,才能使用 XrSpatialCapabilityConfigurationAnnotationTrackingANDROID -
type必須為XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID -
next必須是NULL,或是指向結構體鏈結中下一個結構體的有效指標 -
capability必須是有效的 XrSpatialCapabilityEXT 值 -
enabledComponents必須是指向有效 XrSpatialComponentTypeEXT 值陣列的指標enabledComponentCount -
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,指出初始化完成。無論初始化結果為何,應用程式可以在收到事件後釋放圖片緩衝區,以減少記憶體用量。
如果註解初始化成功,執行階段必須以 XR_SUCCESS 填入 initializationResult。應用程式接著可以提取 XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT 事件,追蹤註解。
否則,執行階段必須在 initializationResult 中填入適當的錯誤代碼,指出失敗原因。應用程式可以銷毀 XrSpatialContextEXT 控制代碼,開始新的註解或繼續使用 spatialContext 追蹤其他註解。
Quad 註解
執行階段必須使用 xrEnumerateSpatialCapabilityComponentTypesEXT 列出下列元件類型,藉此宣傳對四元註解的支援:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Quad Reference
XrSpatialAnnotationQuadReferenceANDROID 結構體的定義如下:
typedef struct XrSpatialAnnotationQuadReferenceANDROID {
XrStructureType type;
const void* next;
uint32_t quadCount;
const XrSpatialAnnotationQuadANDROID* quads;
} XrSpatialAnnotationQuadReferenceANDROID;
成員說明
type是這個結構的 XrStructureType。next是NULL,或是指向結構鏈中下一個結構的指標。quadCount是uint32_t,說明quads陣列中的元素數量。uint32_tquads是指向 XrSpatialAnnotationQuadANDROID 陣列的指標。
如果執行階段支援四邊形註解,應用程式可以將 XrSpatialAnnotationQuadReferenceANDROID 結構體鏈結至 XrSpatialReferenceImageEXT :: next 來設定註解,並在建立 XrSpatialContextEXT 控制代碼時,於 XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference 中設定參照。
如果 quadCount 為 0,執行階段必須從 xrCreateSpatialContextAsyncEXT 傳回 XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT。
有效用量 (隱含)
- 必須先啟用
XR_ANDROID_spatial_annotation_tracking擴充功能,才能使用 XrSpatialAnnotationQuadReferenceANDROID -
type必須為XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID -
next必須是NULL,或是指向結構體鏈結中下一個結構體的有效指標 -
quads必須是指向有效quadCountXrSpatialAnnotationQuadANDROID 結構體陣列的指標 -
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 建立關聯時,原點會由 XrSpaceLocationData ::
pose的 XrSpatialAnnotationQuadDataANDROID ::origin指示。
有效用量 (隱含)
- 使用 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
註解四邊形會直接錨定至物件,並與參考圖像中定義的對齊方式相符。輸出結果為凸四邊形,會調整形狀以符合物體的透視效果。
四方元件
XrSpatialAnnotationQuadDataANDROID 結構體的定義如下:
typedef struct XrSpatialAnnotationQuadDataANDROID {
uint32_t annotationIndex;
XrSpaceLocationData origin;
XrSpatialAnnotationQuadANDROID quad;
} XrSpatialAnnotationQuadDataANDROID;
成員說明
annotationIndex是對應至 XrSpatialAnnotationQuadReferenceANDROID ::quads陣列的索引,該陣列與 XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::reference傳遞的參照相關聯。origin是 XrSpaceLocationData,說明四邊形所紮根的 2D 平面來源。執行階段必須設定 XrSpaceLocationData ::locationFlags,指出原點姿勢的有效位元。quad是代表本機空間中四邊形的 XrSpatialAnnotationQuadANDROID。使用origin將四邊形轉換為姿勢空間。
有效用量 (隱含)
-
XR_ANDROID_spatial_annotation_tracking擴充功能必須先啟用,才能使用 XrSpatialAnnotationQuadDataANDROID -
originmust 是有效的 XrSpaceLocationData 結構 -
quadmust 為有效的 XrSpatialAnnotationQuadANDROID 結構
XrSpatialComponentAnnotationQuadListANDROID 結構體的定義如下:
typedef struct XrSpatialComponentAnnotationQuadListANDROID {
XrStructureType type;
void* next;
uint32_t quadCount;
XrSpatialAnnotationQuadDataANDROID* quads;
} XrSpatialComponentAnnotationQuadListANDROID;
成員說明
type是這個結構的 XrStructureType。next是NULL,或是指向結構鏈中下一個結構的指標。quadCount是uint32_t,說明quads陣列中的元素數量。uint32_tquads是 XrSpatialAnnotationQuadDataANDROID 的陣列。
應用程式「可以」在 XrSpatialSnapshotEXT 中查詢空間實體的四邊形註解元件,方法是在 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中新增 XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID,並將 XrSpatialComponentAnnotationQuadListANDROID 新增至 XrSpatialComponentDataQueryResultEXT 的下一個指標鏈結。
如果 XrSpatialComponentAnnotationQuadListANDROID 位於 XrSpatialComponentDataQueryResultEXT 的下一個鏈結中,但 XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID 未納入 XrSpatialComponentDataQueryConditionEXT :: componentTypes,則執行階段「必須」從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_VALIDATION_FAILURE。next
如果 quadCount 小於 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput,執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_SIZE_INSUFFICIENT。
有效用量 (隱含)
-
XR_ANDROID_spatial_annotation_tracking擴充功能必須先啟用,才能使用 XrSpatialComponentAnnotationQuadListANDROID -
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
新列舉
新增列舉常數
XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAMEXR_ANDROID_spatial_annotation_tracking_SPEC_VERSION擴充 XrObjectType:
XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
-
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
-
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)
- 擴充功能的初始說明。