XR_EXT_spatial_entity
Name String
XR_EXT_spatial_entity
擴充功能類型
執行個體擴充功能
擴充功能註冊編號
741
修訂版本
1
批准狀態
已批准
擴充功能和版本依附元件
XR_EXT_future
著作人
Nihav Jain,Google
Jared Finder,Google
Natalie Fleury,Meta
Yuichi Taguchi,Meta
Ron Bessems,Meta
Yin Li,Microsoft
Karthik Kadappan,Magic Leap
Jimmy Alamparambil,ByteDance
Zhipeng Liu,ByteDance
Jun Yan,ByteDance
總覽
這項擴充功能介紹 OpenXR 中場景理解和空間推理的概念和基礎。這項擴充功能會整合多個相關但不同的功能領域,並以大致統一的方式列舉、設定及互動。由於這項擴充功能缺乏任何一個功能領域的具體定義,因此正式規格文字往往有些抽象。本擴充功能規格文字中的範例有時會提及即將推出或假設相關擴充功能中定義的功能,僅供說明之用,並未固有地限制或指定這類額外功能。
這項擴充功能的主要部分如下:
- 空間實體:功能以實體為中心,本身提供的功能很少。
- 空間元件:這些實體具有相關聯的元件,可提供資料和行為。
- 空間元件類型:每個空間元件都有特定的元件類型,且任何指定的實體最多只有一個指定元件類型的元件。
- 空間情境:所有空間實體互動都會在初始化和設定階段後,於情境中發生。
- 空間功能:空間實體操控功能通常由功能提供。「功能」是指某個功能單元,例如 (但不限於) 應用程式定義的錨點、平面偵測或圖片追蹤。每項功能通常會在個別擴充功能中定義 (照常在建立執行個體時啟用),並在建立時為特定情境啟用。
- 每項功能都與一組元件類型相關聯,而元件則存在於該功能公開的每個實體上。定義功能的擴充功能會指定該功能必須具備哪些元件類型 (「保證」),而相同或其他擴充功能可能會指定某些潛在實作提供的選用 元件類型。任意數量的功能可能會為實體提供特定元件類型的元件,無論產生該元件的功能為何,這些元件都可統一使用。
- 空間功能特徵:此外,部分功能需要設定,因此會由功能特徵參數化。
這項擴充功能提供一種機制,可列舉目前系統支援的每項功能提供的元件,包括必要和任何選用 元件。
由於某些實作可能需要不同程度的功能參數化,因此這項擴充功能提供了一種機制,可列舉與目前系統中指定功能相關聯的支援功能特性。
這項擴充功能也定義了多個常見元件,預期會用於各種功能。
空間實體
空間實體是存在於某個空間中的實體,具有各種相關聯的資料,並組織成元件。可能是下列任一項:
- 實體 (例如牆壁和地板等平面、椅子和書櫃等物體)
- 虛擬 (例如由其他應用程式或使用者放置及分享的內容)
- 應用程式定義 (例如應用程式將某個區域標示為「Living Room」或「廚房」,或將某個點標示為放置電視的位置等)
透過動作系統公開的事物 (例如控制器或視線) 不應模擬為空間實體。
OpenXR 中的空間實體會模擬為實體元件系統。每個空間實體都有一組元件,每個元件都會為該實體提供一組專屬的資料和行為。
空間實體會以 XrSpatialEntityIdEXT 原子或 XrSpatialEntityEXT 控制代碼表示,詳情請參閱「空間實體表示法」一節。
空間元件類型
空間實體有一或多個元件,可為該實體提供資料或行為。如要瞭解這個擴充功能定義的部分常見元件,請參閱「常見元件」。
typedef enum XrSpatialComponentTypeEXT {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT = 1,
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT = 2,
XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT = 3,
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT = 4,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT = 1000741000,
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT = 1000741001,
XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT = 1000741002,
XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT = 1000741003,
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT = 1000743000,
XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT = 1000744000,
XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT = 1000744001,
XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT = 1000744002,
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT = 1000762000,
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT = 1000763000,
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT = 1000782000,
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_NORMALS_EXT = 1000783000,
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_VERTEX_SEMANTIC_LABELS_EXT = 1000783001,
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_TRIANGLE_SEMANTIC_LABELS_EXT = 1000783002,
XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_ANDROID = 1000785000,
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID = 1000786000,
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID = 1000791000,
XR_SPATIAL_COMPONENT_TYPE_ROOM_ANDROIDSYS = 1000792002,
XR_SPATIAL_COMPONENT_TYPE_MATERIAL_TYPE_ANDROIDSYS = 1000792003,
XR_SPATIAL_COMPONENT_TYPE_CONFIDENCE_ANDROIDSYS = 1000792004,
XR_SPATIAL_COMPONENT_TYPE_ROOM_EMPTINESS_ANDROIDSYS = 1000792005,
XR_SPATIAL_COMPONENT_TYPE_OCCUPANCY_GRID_ANDROIDX1 = 1000793000,
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID = 1000794000,
XR_SPATIAL_COMPONENT_TYPE_STREETSCAPE_GEOMETRY_METADATA_ANDROIDX2 = 1000798000,
XR_SPATIAL_COMPONENT_TYPE_GEOMETRY_POINT_ANDROID = 1000803000,
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_SCOPES_ANDROIDX1 = 1000808000,
XR_SPATIAL_COMPONENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialComponentTypeEXT;
XrSpatialComponentTypeEXT 列舉會識別執行階段「可能」支援的不同元件類型。
這項擴充功能本身並未提供列出的所有元件類型:部分元件需要額外的擴充功能,才能在建立執行個體時啟用,詳情請參閱說明文件。
列舉值如下:
列舉說明
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
為空間實體提供 2D 邊界的元件。對應的清單結構為 XrSpatialComponentBounded2DListEXT;對應的資料結構為 XrSpatialBounded2DDataEXT
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT
為空間實體提供 3D 邊界的元件。對應的清單結構為 XrSpatialComponentBounded3DListEXT;對應的資料結構為 XrBoxf
XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT
提供空間實體父項 XrSpatialEntityIdEXT 的元件。對應的清單結構為 XrSpatialComponentParentListEXT;對應的資料結構為 XrSpatialEntityIdEXT
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT
為空間實體提供 3D 網格的元件。對應的清單結構為 XrSpatialComponentMesh3DListEXT;對應的資料結構為 XrSpatialMeshDataEXT
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
為空間實體提供平面對齊列舉的元件。對應的清單結構為 XrSpatialComponentPlaneAlignmentListEXT;對應的資料結構為 XrSpatialPlaneAlignmentEXT (由 XR_EXT_spatial_plane_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT
為空間實體提供 2D 網格的元件。對應的清單結構為 XrSpatialComponentMesh2DListEXT;對應的資料結構為 XrSpatialMeshDataEXT (由 XR_EXT_spatial_plane_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
為空間實體提供 2D 邊界多邊形的元件。對應的清單結構為 XrSpatialComponentPolygon2DListEXT;對應的資料結構為 XrSpatialPolygon2DDataEXT (由 XR_EXT_spatial_plane_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT
為平面提供語意標籤的元件。對應的清單結構為 XrSpatialComponentPlaneSemanticLabelListEXT;對應的資料結構為 XrSpatialPlaneSemanticLabelEXT (由 XR_EXT_spatial_plane_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
描述標記類型、ID 和位置的元件。對應的清單結構為 XrSpatialComponentMarkerListEXT;對應的資料結構為 XrSpatialMarkerDataEXT (由 XR_EXT_spatial_marker_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
為場景提供語意標籤的元件;對應的清單結構為 XrSpatialComponentObjectSemanticLabelListEXT。對應的資料結構為 XrSpatialObjectSemanticLabelEXT。(由 XR_EXT_spatial_object_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT
為鍵盤提供語意標籤的元件;對應的清單結構為 XrSpatialComponentKeyboardSemanticLabelListEXT。對應的資料結構為 XrSpatialKeyboardSemanticLabelEXT (由 XR_EXT_spatial_object_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT
為滑鼠提供語意標籤的元件;對應的清單結構為 XrSpatialComponentMouseSemanticLabelListEXT。對應的資料結構為 XrSpatialMouseSemanticLabelEXT (由 XR_EXT_spatial_object_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT
提供錨點位置的元件。對應的清單結構為 XrSpatialComponentAnchorListEXT;對應的資料結構為 XrPosef (由 XR_EXT_spatial_anchor 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT
為空間實體提供永久 UUID 的元件。對應的清單結構為 XrSpatialComponentPersistenceListEXT;對應的資料結構為 XrSpatialPersistenceDataEXT (由 XR_EXT_spatial_persistence 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
描述平面圖片類型的元件。對應的清單結構為 XrSpatialComponentImage2DListEXT;對應的資料結構為 XrSpatialImageSizeEXT。(由 XR_EXT_spatial_image_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_NORMALS_EXT
這個元件可提供空間實體 3D 網格的法線。對應的清單結構為 XrSpatialComponentMesh3DNormalsListEXT;對應的資料結構為 XrSpatialBufferEXT (由 XR_EXT_spatial_mesh_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_VERTEX_SEMANTIC_LABELS_EXT
這個元件可為空間實體的 3D 網格提供每個頂點的語意標籤。對應的清單結構為 XrSpatialComponentMesh3DVertexSemanticLabelsListEXT;對應的資料結構為 XrSpatialBufferEXT;緩衝區內的資料會對應至 XrSpatialMeshSemanticLabelEXT (由 XR_EXT_spatial_mesh_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_MESH_3D_TRIANGLE_SEMANTIC_LABELS_EXT
這個元件可為空間實體的 3D 網格,提供每個三角形面的語意標籤。對應的清單結構為 XrSpatialComponentMesh3DTriangleSemanticLabelsListEXT;對應的資料結構為 XrSpatialBufferEXT;緩衝區內的資料會對應至 XrSpatialMeshSemanticLabelEXT (由 XR_EXT_spatial_mesh_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_ANDROID
為物件提供語意標籤的元件;對應的清單結構為 XrSpatialComponentObjectSemanticLabelListANDROID;對應的資料結構為 XrSpatialObjectSemanticLabelANDROID (由 XR_ANDROID_spatial_object_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
這個元件會提供實體上光線投射命中的姿勢。對應的清單結構為 XrSpatialComponentRaycastResultListANDROID;對應的資料結構為 XrSpatialRaycastResultDataANDROID (由 XR_ANDROID_spatial_discovery_raycast 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
這個元件會提供實體的實體 ID,該實體包含附加的實體。對應的清單結構為 XrSpatialComponentSubsumedByListANDROID;對應的資料結構為 XrSpatialEntityIdEXT (由 XR_ANDROID_spatial_component_subsumed_by 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_ROOM_ANDROIDSYS
提供鞋盒尺寸和房間類型的元件;對應的清單結構為 XrSpatialComponentRoomListANDROIDSYS;對應的資料結構為 XrSpatialRoomDataANDROIDSYS (由 XR_ANDROIDSYS_spatial_room_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_MATERIAL_TYPE_ANDROIDSYS
提供邊界表面材質類型的元件;對應的清單結構為 XrSpatialComponentMaterialTypeListANDROIDSYS;對應的資料結構為 XrSpatialMaterialTypeANDROIDSYS (由 XR_ANDROIDSYS_spatial_room_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_CONFIDENCE_ANDROIDSYS
提供可追蹤項目信賴度的元件;對應的清單結構為 XrSpatialComponentConfidenceListANDROIDSYS;對應的資料結構為 float (由 XR_ANDROIDSYS_spatial_room_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_ROOM_EMPTINESS_ANDROIDSYS
提供房間空曠程度的元件;對應的清單結構為 XrSpatialComponentRoomEmptinessListANDROIDSYS;對應的資料結構為 float (由 XR_ANDROIDSYS_spatial_room_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_OCCUPANCY_GRID_ANDROIDX1
這個元件會提供所附實體的占用格線資訊。對應的清單結構為 XrSpatialComponentOccupancyGridListANDROIDX1;對應的資料結構為 XrSpatialOccupancyGridDataANDROIDX1 (由 XR_ANDROIDX1_spatial_occupancy_grid 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
說明四邊形註解的元件。對應的清單結構為 XrSpatialComponentAnnotationQuadListANDROID;對應的資料結構為 XrSpatialAnnotationQuadDataANDROID (由 XR_ANDROID_spatial_annotation_tracking 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_STREETSCAPE_GEOMETRY_METADATA_ANDROIDX2
提供街景幾何圖形中繼資料的元件;對應的清單結構為 XrSpatialComponentStreetscapeGeometryMetadataListANDROIDX2;對應的資料結構為 XrSpatialStreetscapeGeometryMetadataANDROIDX2 (由 XR_ANDROIDX2_geospatial_streetscape 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_GEOMETRY_POINT_ANDROID
將實體識別為幾何圖形點的元件。這個元件類型沒有對應的清單或資料結構。這個元件的存在僅表示實體可以附加至錨點。(由 XR_ANDROID_spatial_geometry_point 擴充功能新增)
XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_SCOPES_ANDROIDX1
說明實體保存範圍的元件。如果執行階段支援 XR_SPATIAL_COMPONENT_TYPE_PERSISTENCE_EXT,則必須支援這個元件。對應的資料結構為 XrSpatialBufferEXT。對應的清單結構為 XrSpatialComponentPersistenceScopeDataListANDROIDX1。(由 XR_ANDROIDX1_spatial_anchor_cloud_sharing 擴充功能新增)
空間功能和設定
空間功能定義了執行階段探索實體的能力,這些實體具有一組保證的元件。應用程式在建立 XrSpatialContextEXT 時,會啟用空間功能的元件,而執行階段則必須僅在偵測到的實體上提供已啟用的元件。舉例來說,如果執行階段回報某項功能的其中一個元件是「語意標籤」,表示應用程式可以透過該功能的設定啟用語意標籤,而執行階段必須僅在設定後提供語意標籤元件。
typedef enum XrSpatialCapabilityEXT {
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT = 1000741000,
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT = 1000743000,
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT = 1000743001,
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT = 1000743002,
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT = 1000743003,
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT = 1000744000,
XR_SPATIAL_CAPABILITY_ANCHOR_EXT = 1000762000,
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT = 1000782000,
XR_SPATIAL_CAPABILITY_MESH_TRACKING_EXT = 1000783000,
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_ANDROID = 1000785000,
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID = 1000786000,
XR_SPATIAL_CAPABILITY_ROOM_TRACKING_ANDROIDSYS = 1000792000,
XR_SPATIAL_CAPABILITY_ROOM_BOUNDARY_TRACKING_ANDROIDSYS = 1000792001,
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID = 1000794000,
XR_SPATIAL_CAPABILITY_STREETSCAPE_GEOMETRY_ANDROIDX2 = 1000798000,
XR_SPATIAL_CAPABILITY_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialCapabilityEXT;
XrSpatialCapabilityEXT 列舉會識別執行階段「可能」支援的不同功能類型。
列舉值如下:
列舉說明
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
平面追蹤 (由 XR_EXT_spatial_plane_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
可偵測及追蹤 QR code。(由 XR_EXT_spatial_marker_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT
偵測及追蹤微型 QR code 的功能。(由 XR_EXT_spatial_marker_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT
偵測及追蹤 Aruco 標記的能力。(由 XR_EXT_spatial_marker_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT
偵測及追蹤 AprilTag 的功能。(由 XR_EXT_spatial_marker_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
物件軌 (由 XR_EXT_spatial_object_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_ANCHOR_EXT
可建立空間錨點 (由 XR_EXT_spatial_anchor 擴充功能新增)
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
可偵測及追蹤平面參考圖像。(由 XR_EXT_spatial_image_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_MESH_TRACKING_EXT
可追蹤環境的網格。(由 XR_EXT_spatial_mesh_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_ANDROID
物件軌 (由 XR_ANDROID_spatial_object_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
對深度緩衝區進行光線投射 (由 XR_ANDROID_spatial_discovery_raycast 擴充功能新增)
XR_SPATIAL_CAPABILITY_ROOM_TRACKING_ANDROIDSYS
追蹤房間的功能 (由 XR_ANDROIDSYS_spatial_room_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_ROOM_BOUNDARY_TRACKING_ANDROIDSYS
追蹤房間邊界的功能 (由 XR_ANDROIDSYS_spatial_room_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
備註追蹤 (由 XR_ANDROID_spatial_annotation_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_STREETSCAPE_GEOMETRY_ANDROIDX2
街景幾何圖形 (由 XR_ANDROIDX2_geospatial_streetscape 擴充功能新增)
xrEnumerateSpatialCapabilitiesEXT 函式的定義如下:
XrResult xrEnumerateSpatialCapabilitiesEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t capabilityCapacityInput,
uint32_t* capabilityCountOutput,
XrSpatialCapabilityEXT* capabilities);
參數說明
instance是 XrInstance 的控制代碼。systemId是要列舉空間功能的XrSystemId。capabilityCapacityInput是capabilities陣列的容量,或 0 表示要求擷取所需容量。capabilityCountOutput是指功能數量,或capabilityCapacityInput不足時所需的容量。capabilities是 XrSpatialCapabilityEXT 的陣列。如果capabilityCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
capabilities大小,請參閱「緩衝區大小參數」一節。
應用程式可以使用 xrEnumerateSpatialCapabilitiesEXT 列舉特定 XrSystemId 支援的空間功能清單。
執行階段不得列舉未啟用 instance 擴充功能的空間功能。
有效用途 (隱含)
- 呼叫 xrEnumerateSpatialCapabilitiesEXT 前,必須啟用
XR_EXT_spatial_entity擴充功能 -
instance「必須」是有效的 XrInstance 控制代碼 -
capabilityCountOutput「必須」是指向uint32_t值的指標 - 如果
capabilityCapacityInput不是0,capabilities必須是指向capabilityCapacityInputXrSpatialCapabilityEXT 值陣列的指標
傳回代碼
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
xrEnumerateSpatialCapabilityComponentTypesEXT 函式的定義如下:
XrResult xrEnumerateSpatialCapabilityComponentTypesEXT(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
XrSpatialCapabilityComponentTypesEXT* capabilityComponents);
參數說明
instance是 XrInstance 的控制代碼。systemId是要列舉空間功能元件的XrSystemId。capability是要列舉元件的 XrSpatialCapabilityEXT。capabilityComponents是 XrSpatialCapabilityComponentTypesEXT 的指標,這是一種輸入/輸出結構,用於填入應用程式分配的陣列。
這個函式會列舉指定功能在系統中實體上提供的元件類型 (依設定)。
應用程式可以使用 XrSpatialCapabilityComponentTypesEXT :: componentTypes 中列舉的元件類型,瞭解 systemId 支援 capability 的完整元件組合,並可以使用這份清單,在為 capability 建立 XrSpatialContextEXT 時,判斷 capability 的有效設定。
如果 xrEnumerateSpatialCapabilitiesEXT 未列舉 capability,執行階段「必須」傳回 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT。
執行階段「不得」列舉未為 instance 啟用擴充功能的空間元件類型。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrEnumerateSpatialCapabilityComponentTypesEXT -
instance「必須」是有效的 XrInstance 控制代碼 -
capability「必須」是有效的 XrSpatialCapabilityEXT 值 -
capabilityComponents「必須」是指向 XrSpatialCapabilityComponentTypesEXT 結構的指標
傳回代碼
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
XrSpatialCapabilityComponentTypesEXT 結構定義如下:
typedef struct XrSpatialCapabilityComponentTypesEXT {
XrStructureType type;
void* next;
uint32_t componentTypeCapacityInput;
uint32_t componentTypeCountOutput;
XrSpatialComponentTypeEXT* componentTypes;
} XrSpatialCapabilityComponentTypesEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。componentTypeCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。componentTypeCountOutput是元件類型數量,或componentTypeCapacityInput不足時所需的容量。componentTypes是 XrSpatialComponentTypeEXT 的陣列。如果componentTypeCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
componentTypes大小,請參閱「緩衝區大小參數」一節。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialCapabilityComponentTypesEXT -
type「必須」為XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 - 如果
componentTypeCapacityInput不是0,componentTypes必須是指向componentTypeCapacityInputXrSpatialComponentTypeEXT 值陣列的指標
空間能力功能
typedef enum XrSpatialCapabilityFeatureEXT {
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT = 1000743000,
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT = 1000743001,
XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT = 1000744000,
XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID = 1000761000,
XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID = 1000761001,
XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID = 1000761002,
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT = 1000782000,
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT = 1000782001,
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT = 1000782002,
XR_SPATIAL_CAPABILITY_FEATURE_TRACK_WATERTIGHT_MESH_EXT = 1000783000,
XR_SPATIAL_CAPABILITY_FEATURE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialCapabilityFeatureEXT;
部分功能會向應用程式公開參數,以便設定執行階段如何計算元件資料。這些參數化/可設定性維度稱為功能。舉例來說,如果是圖片追蹤功能,執行階段可能支援應用程式功能,指定追蹤的圖片是否為靜態。
透過設定結構將這項資訊提供給執行階段時,不得變更相關聯實體 (例如追蹤的圖片) 上的元件類型組合。不過,執行階段可能會最佳化圖片追蹤功能等,為應用程式提供更優質的體驗。
這類功能會以 XrSpatialCapabilityFeatureEXT 表示,應用程式會使用 xrEnumerateSpatialCapabilityFeaturesEXT 列舉這些功能。
每項功能都有對應的設定結構,可用於啟用功能。這類設定結構必須鏈結至對應功能的 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next。
列舉值如下:
列舉說明
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT
這項功能可讓應用程式指定標記大小。對應的設定結構為 XrSpatialMarkerSizeEXT (由 XR_EXT_spatial_marker_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
這項功能可讓應用程式指定標記是否為靜態。對應的設定結構為 XrSpatialMarkerStaticOptimizationEXT (由 XR_EXT_spatial_marker_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
空間功能,可讓應用程式從 XrSpatialObjectSemanticLabelEXT 指定標籤子集,供執行階段追蹤。對應的設定結構為 XrSpatialFeatureObjectSemanticLabelSubsetEXT。(由 XR_EXT_spatial_object_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID
執行階段支援 XrSpatialDiscoverySnapshotCreateInfoEXT 的 XrSpatialBoundsSpherefANDROID 篩選器;建立空間情境時,不需要加入任何設定結構。(由 XR_ANDROID_spatial_discovery_bounds 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID
執行階段支援 XrSpatialDiscoverySnapshotCreateInfoEXT 的 XrSpatialBoundsBoxfANDROID 篩選器,建立空間情境時不需加入任何設定結構。(由 XR_ANDROID_spatial_discovery_bounds 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID
執行階段支援 XrSpatialDiscoverySnapshotCreateInfoEXT 的 XrSpatialBoundsFrustumfANDROID 篩選器;建立空間情境時,不需要加入任何設定結構。(由 XR_ANDROID_spatial_discovery_bounds 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT
執行階段支援自動推論偵測和追蹤圖片的實際大小。對應的設定結構為 XrSpatialImageSizeEXT (由 XR_EXT_spatial_image_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT
執行階段支援 XrSpatialImageStaticOptimizationEXT。對應的設定結構為 XrSpatialImageStaticOptimizationEXT。(由 XR_EXT_spatial_image_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT
執行階段支援 XrSpatialImageSizeEXT。對應的設定結構為 XrSpatialImageSizeEXT (由 XR_EXT_spatial_image_tracking 擴充功能新增)
XR_SPATIAL_CAPABILITY_FEATURE_TRACK_WATERTIGHT_MESH_EXT
可追蹤環境中不透水網格的功能。對應的設定結構為 XrSpatialFeatureTrackWatertightMeshEXT。(由 XR_EXT_spatial_mesh_tracking 擴充功能新增)
xrEnumerateSpatialCapabilityFeaturesEXT 函式的定義如下:
XrResult xrEnumerateSpatialCapabilityFeaturesEXT(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t capabilityFeatureCapacityInput,
uint32_t* capabilityFeatureCountOutput,
XrSpatialCapabilityFeatureEXT* capabilityFeatures);
參數說明
instance是 XrInstance 的控制代碼。systemId是XrSystemId,系統會列舉其空間功能。capability是要列舉功能的 XrSpatialCapabilityEXT。capabilityFeatureCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。capabilityFeatureCountOutput是特徵數量,或capabilityFeatureCapacityInput不足時所需的容量。capabilityFeatures是 XrSpatialCapabilityFeatureEXT 的陣列。如果capabilityFeatureCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
capabilityFeatures大小,請參閱「緩衝區大小參數」一節。
應用程式會使用 xrEnumerateSpatialCapabilityFeaturesEXT,探索特定系統支援的 XrSpatialCapabilityEXT 功能。
如果功能有公開的功能,應用程式會選取要啟用的功能,並在 XrSpatialContextCreateInfoEXT :: capabilityConfigs 的功能設定結構下一個鏈結中,提供對應的設定結構。
如果 capability 不是 xrEnumerateSpatialCapabilitiesEXT 列舉的功能,執行階段「必須」傳回 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT。
執行階段不得列舉未為 instance 啟用擴充功能的空間功能。
有效用途 (隱含)
- 呼叫 xrEnumerateSpatialCapabilityFeaturesEXT 之前,必須啟用
XR_EXT_spatial_entity擴充功能 -
instance「必須」是有效的 XrInstance 控制代碼 -
capability「必須」是有效的 XrSpatialCapabilityEXT 值 -
capabilityFeatureCountOutput「必須」是指向uint32_t值的指標 - 如果
capabilityFeatureCapacityInput不是0,capabilityFeatures必須是指向capabilityFeatureCapacityInputXrSpatialCapabilityFeatureEXT 值陣列的指標
傳回代碼
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
空間背景資訊
建立空間情境
XR_DEFINE_HANDLE(XrSpatialContextEXT)
XrSpatialContextEXT 控制代碼代表用於探索及更新使用者環境中部分空間實體的資源。應用程式可以使用這個控制代碼,透過這個擴充功能中的其他函式,探索及更新空間實體。
xrCreateSpatialContextAsyncEXT 函式的定義如下:
XrResult xrCreateSpatialContextAsyncEXT(
XrSession session,
const XrSpatialContextCreateInfoEXT* createInfo,
XrFutureEXT* future);
參數說明
session是 XrSession,空間情境會在這個工作階段中啟用。createInfo是 XrSpatialContextCreateInfoEXT,用於指定空間情境參數。future是指向XrFutureEXT的指標。
應用程式可以透過下列方式建立 XrSpatialContextEXT 控制代碼:
- 在 XrSpatialContextCreateInfoEXT ::
capabilityConfigs中提供 XrSpatialCapabilityConfigurationBaseHeaderEXT 衍生結構,以啟用功能和該功能的元件。 - 使用 XrSpatialCapabilityFeatureEXT 的對應設定結構,設定功能本身。
如果 XrSpatialContextCreateInfoEXT ::capabilityConfigCount 為 0,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT。空間情境控制代碼至少需要一項功能。
如果 XrSpatialContextCreateInfoEXT :: capabilityConfigs 陣列中的任何功能未由 xrEnumerateSpatialCapabilitiesEXT 列舉,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT。
如果 XrSpatialContextCreateInfoEXT :: capabilityConfigs 中的任何 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponentCount 為 0,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT。功能設定不完整,因為未列出要為該功能啟用的元件類型。
如果 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 中列出的任何元件類型,未在 xrEnumerateSpatialCapabilityComponentTypesEXT 的 XrSpatialCapabilityConfigurationBaseHeaderEXT :: capability 中列舉,執行階段必須傳回 XR_ERROR_SPATIAL_COMPONENT_UNSUPPORTED_FOR_CAPABILITY_EXT。
如果 XrSpatialContextCreateInfoEXT :: capabilityConfigs 的下一個鏈結中有任何結構對應至 XrSpatialCapabilityFeatureEXT,但該功能未在 xrEnumerateSpatialCapabilityFeaturesEXT 中列舉,則執行階段必須忽略該 XrSpatialCapabilityFeatureEXT 結構。
如果 XrSpatialContextCreateInfoEXT :: capabilityConfigs 包含多個具有相同 XrSpatialCapabilityConfigurationBaseHeaderEXT :: capability 的結構,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT。
為確保系統資源獲得最佳運用,執行階段可能會使用 XrSpatialContextCreateInfoEXT 陣列中提供的設定,為即將傳入的空間要求做好準備。舉例來說,如果應用程式建立包含平面追蹤功能的空間情境控制代碼,支援平面追蹤功能的執行階段可能只會啟動平面追蹤管道。如果設定的功能需要較長的暖機時間,呼叫 xrCreateSpatialDiscoverySnapshotAsyncEXT 可能會產生空白快照。應用程式可以先等待 XrEventDataSpatialDiscoveryRecommendedEXT,再使用 xrCreateSpatialDiscoverySnapshotAsyncEXT,確保基礎追蹤服務已準備就緒。
如果執行階段強制執行權限系統,控制應用程式對 XrSpatialContextEXT 設定的空間功能存取權,則在未授予應用程式這些權限時,執行階段必須傳回 XR_ERROR_PERMISSION_INSUFFICIENT。
這個函式會啟動非同步作業,並建立對應的 XrFutureEXT,可與 xrPollFutureEXT 和相關函式搭配使用。這個函式的傳回值只會指出參數是否可接受排定非同步作業。對應的完成函式為 xrCreateSpatialContextCompleteEXT,當這個函式的 Future 處於 READY 狀態時,即可使用該函式,並由該函式在完成結構 XrCreateSpatialContextCompletionEXT 中填入輸出內容。
有效用途 (隱含)
- 呼叫 xrCreateSpatialContextAsyncEXT 前,必須啟用
XR_EXT_spatial_entity擴充功能 -
session「必須」是有效的 XrSession 控制代碼 -
createInfo「必須」是指向有效 XrSpatialContextCreateInfoEXT 結構的指標 -
future「必須」是指向XrFutureEXT值的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_SPATIAL_COMPONENT_UNSUPPORTED_FOR_CAPABILITY_EXTXR_ERROR_VALIDATION_FAILUREXR_ERROR_TIME_INVALID(如果已啟用XR_ANDROID_spatial_annotation_tracking)
XrSpatialContextCreateInfoEXT 結構定義如下:
typedef struct XrSpatialContextCreateInfoEXT {
XrStructureType type;
const void* next;
uint32_t capabilityConfigCount;
const XrSpatialCapabilityConfigurationBaseHeaderEXT* const* capabilityConfigs;
} XrSpatialContextCreateInfoEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。capabilityConfigCount是uint32_t,用於描述capabilityConfigs陣列中的元素數量。capabilityConfigs是指向 XrSpatialCapabilityConfigurationBaseHeaderEXT 指標陣列的指標。
XrSpatialContextCreateInfoEXT 結構說明建立 XrSpatialContextEXT 控制代碼的資訊。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialContextCreateInfoEXT -
type「必須」為XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標。另請參閱:XrSpatialContextPersistenceConfigEXT -
capabilityConfigs「必須」指向由capabilityConfigCount個有效 XrSpatialCapabilityConfigurationBaseHeaderEXT 結構組成的陣列。另請參閱:XrSpatialCapabilityConfigurationAnchorEXT、XrSpatialCapabilityConfigurationAnnotationTrackingANDROID、XrSpatialCapabilityConfigurationAprilTagEXT、XrSpatialCapabilityConfigurationArucoMarkerEXT、XrSpatialCapabilityConfigurationDepthRaycastANDROID、XrSpatialCapabilityConfigurationImageTrackingEXT、XrSpatialCapabilityConfigurationMeshTrackingEXT、XrSpatialCapabilityConfigurationMicroQrCodeEXT、XrSpatialCapabilityConfigurationObjectTrackingANDROID、XrSpatialCapabilityConfigurationObjectTrackingEXT、XrSpatialCapabilityConfigurationPlaneTrackingEXT、XrSpatialCapabilityConfigurationQrCodeEXT、XrSpatialCapabilityConfigurationRoomBoundaryTrackingANDROIDSYS、XrSpatialCapabilityConfigurationRoomTrackingANDROIDSYS、XrSpatialCapabilityConfigurationStreetscapeGeometryANDROIDX2 -
capabilityConfigCount參數必須大於0
XrSpatialCapabilityConfigurationBaseHeaderEXT 結構定義如下:
typedef struct XrSpatialCapabilityConfigurationBaseHeaderEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationBaseHeaderEXT;
這個結構不會直接用於 API,但其子結構可以與 XrSpatialContextCreateInfoEXT 搭配使用,設定空間功能。
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。capability是 XrSpatialCapabilityEXT。enabledComponentCount是uint32_t,用於描述enabledComponents陣列中的元素數量。enabledComponents是指向 XrSpatialComponentTypeEXT 陣列的指標。
如果 xrEnumerateSpatialCapabilitiesEXT 未列舉 capability,執行階段「必須」傳回 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT。如果 enabledComponents 中列出的任何元件類型未在 xrEnumerateSpatialCapabilityComponentTypesEXT 中列舉 capability,執行階段必須傳回 XR_ERROR_SPATIAL_COMPONENT_UNSUPPORTED_FOR_CAPABILITY_EXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialCapabilityConfigurationBaseHeaderEXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
capability「必須」是有效的 XrSpatialCapabilityEXT 值 -
enabledComponents「必須」指向包含enabledComponentCount個有效 XrSpatialComponentTypeEXT 值的陣列 -
enabledComponentCount參數必須大於0
xrCreateSpatialContextCompleteEXT 函式的定義如下:
XrResult xrCreateSpatialContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialContextCompletionEXT* completion);
參數說明
session是先前傳遞至 xrCreateSpatialContextAsyncEXT ::session的 XrSession。future是從 xrCreateSpatialContextAsyncEXT 接收的XrFutureEXT。completion是 XrCreateSpatialContextCompletionEXT 的指標。
xrCreateSpatialContextCompleteEXT 會完成由 xrCreateSpatialContextAsyncEXT 啟動的非同步作業。如果 future 未處於就緒狀態,執行階段必須傳回 XR_ERROR_FUTURE_PENDING_EXT。如果 future 已完成或取消,執行階段必須傳回 XR_ERROR_FUTURE_INVALID_EXT。
有效用途 (隱含)
- 呼叫 xrCreateSpatialContextCompleteEXT 前,必須啟用
XR_EXT_spatial_entity擴充功能 -
session「必須」是有效的 XrSession 控制代碼 -
completion「必須」是指向 XrCreateSpatialContextCompletionEXT 結構的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
XrCreateSpatialContextCompletionEXT 結構定義如下:
typedef struct XrCreateSpatialContextCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialContextEXT spatialContext;
} XrCreateSpatialContextCompletionEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。futureResult是空間情境建立作業的 XrResult。spatialContext是使用 xrCreateSpatialContextAsyncEXT ::createInfo中的資料和設定建立的 XrSpatialContextEXT。
未來退貨代碼
futureResult 值:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT
如果 futureResult 是成功代碼,spatialContext 必須有效。如果 spatialContext 有效,則只會在 xrCreateSpatialContextAsyncEXT :: session 的生命週期內保持有效,或直到應用程式使用 xrDestroySpatialContextEXT 刪除 spatialContext 為止,以先發生者為準。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrCreateSpatialContextCompletionEXT -
type「必須」為XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
futureResult「必須」是有效的 XrResult 值 - 如果
spatialContext不是 XR_NULL_HANDLE,spatialContext「必須」是有效的 XrSpatialContextEXT 控制代碼
刪除空間背景資訊
xrDestroySpatialContextEXT 函式的定義如下:
XrResult xrDestroySpatialContextEXT(
XrSpatialContextEXT spatialContext);
參數說明
spatialContext是先前由 xrCreateSpatialContextAsyncEXT 建立的 XrSpatialContextEXT。
應用程式可以呼叫 xrDestroySpatialContextEXT 函式,在完成空間實體探索和更新工作後,釋出 spatialContext 控制代碼和基礎資源。如果沒有其他有效的 XrSpatialContextEXT 是以與 spatialContext 相同的空間功能建立,這項呼叫會建議執行階段停用這些功能所需的追蹤服務,以節省系統資源。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrDestroySpatialContextEXT -
spatialContext「必須」是有效的 XrSpatialContextEXT 控制代碼
執行緒安全
- 存取
spatialContext和任何子項控制代碼時,必須從外部同步
傳回代碼
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
空間實體表示法
空間實體 ID
XR_DEFINE_ATOM(XrSpatialEntityIdEXT)
XrSpatialEntityIdEXT 用於代表執行階段在使用者空間環境中偵測到的任何實體。XrSpatialEntityIdEXT 適用於偵測到該 ID 的 XrSpatialContextEXT,且執行階段不得在同一個 XrSpatialContextEXT 中,為不同實體重複使用相同的 XrSpatialEntityIdEXT。此外,無論是否代表相同實體,執行階段不得在同一個 XrSession 的多個 XrSpatialContextEXT 中重複使用相同的 XrSpatialEntityIdEXT。
#define XR_NULL_SPATIAL_ENTITY_ID_EXT 0
XR_NULL_SPATIAL_ENTITY_ID_EXT 是保留值,代表無效的 XrSpatialEntityIdEXT。只有在明確允許的情況下,才能傳遞至 API 函式,並從 API 函式傳回。
空間實體控制代碼
XR_DEFINE_HANDLE(XrSpatialEntityEXT)
XrSpatialEntityEXT 控制代碼代表空間實體。應用程式可以建立這類控制代碼,向執行階段表示對特定實體感興趣。
從 ID 建立空間實體控制代碼
xrCreateSpatialEntityFromIdEXT 函式的定義如下:
XrResult xrCreateSpatialEntityFromIdEXT(
XrSpatialContextEXT spatialContext,
const XrSpatialEntityFromIdCreateInfoEXT* createInfo,
XrSpatialEntityEXT* spatialEntity);
參數說明
spatialContext是先前使用 xrCreateSpatialContextAsyncEXT 建立的 XrSpatialContextEXT。createInfo是指向 XrSpatialEntityFromIdCreateInfoEXT 結構的指標。spatialEntity是傳回的 XrSpatialEntityEXT 控制代碼。
應用程式可以使用 xrCreateSpatialEntityFromIdEXT 建立 XrSpatialEntityEXT 控制代碼,參照使用者環境中的實體。
如果 XrSpatialEntityFromIdCreateInfoEXT :: entityId 不是 spatialContext 的有效 ID,執行階段必須傳回 XR_ERROR_SPATIAL_ENTITY_ID_INVALID_EXT。
有效用途 (隱含)
- 呼叫 xrCreateSpatialEntityFromIdEXT 之前,必須啟用
XR_EXT_spatial_entity擴充功能 -
spatialContext「必須」是有效的 XrSpatialContextEXT 控制代碼 -
createInfo「必須」是指向有效 XrSpatialEntityFromIdCreateInfoEXT 結構的指標 -
spatialEntity「必須」是指向 XrSpatialEntityEXT 控制代碼的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_ENTITY_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialEntityFromIdCreateInfoEXT 結構定義如下:
typedef struct XrSpatialEntityFromIdCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialEntityIdEXT entityId;
} XrSpatialEntityFromIdCreateInfoEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。entityId是應用程式要建立控制代碼的實體XrSpatialEntityIdEXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialEntityFromIdCreateInfoEXT -
type「必須」為XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標
刪除空間實體控制代碼
xrDestroySpatialEntityEXT 函式的定義如下:
XrResult xrDestroySpatialEntityEXT(
XrSpatialEntityEXT spatialEntity);
參數說明
spatialEntity是 XrSpatialEntityEXT 的控制代碼,先前由 xrCreateSpatialEntityFromIdEXT 等函式建立。
如果應用程式不再需要這個控制代碼參照的實體,可以使用 xrDestroySpatialEntityEXT 釋出 spatialEntity 控制代碼。
有效用途 (隱含)
- 呼叫 xrDestroySpatialEntityEXT 之前,必須啟用
XR_EXT_spatial_entity擴充功能 -
spatialEntity「必須」是有效的 XrSpatialEntityEXT 控制代碼
執行緒安全
- 存取
spatialEntity和任何子項控制代碼時,必須從外部同步
傳回代碼
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
空間快照
XR_DEFINE_HANDLE(XrSpatialSnapshotEXT)
應用程式可以建立空間快照,以便探索空間實體,或更新已知空間實體的資訊。XrSpatialSnapshotEXT 控制代碼代表已偵測或更新的空間實體,以及應用程式所選元件子集的不可變資料。空間快照代表實體及其元件資料的一致檢視畫面。快照建立後,快照的資料在快照有效期間必須保持不變。
應用程式「可以」建立任意數量的快照,但「必須」注意為每個新快照分配的記憶體,且在不再需要快照時「必須」將其刪除。
建立探索快照
xrCreateSpatialDiscoverySnapshotAsyncEXT 函式的定義如下:
XrResult xrCreateSpatialDiscoverySnapshotAsyncEXT(
XrSpatialContextEXT spatialContext,
const XrSpatialDiscoverySnapshotCreateInfoEXT* createInfo,
XrFutureEXT* future);
參數說明
spatialContext是先前使用 xrCreateSpatialContextAsyncEXT 建立的 XrSpatialContextEXT。createInfo是指向 XrSpatialDiscoverySnapshotCreateInfoEXT 的指標。future是指向XrFutureEXT的指標。
應用程式可以使用 xrCreateSpatialDiscoverySnapshotAsyncEXT 建立探索快照,藉此探索空間實體。
這個函式會啟動非同步作業,並建立對應的 XrFutureEXT,可與 xrPollFutureEXT 和相關函式搭配使用。這個函式的傳回值只會指出參數是否可接受排定非同步作業。對應的完成函式為 xrCreateSpatialDiscoverySnapshotCompleteEXT,當這個函式的 Future 處於 READY 狀態時,即可使用這個函式,並由該函式在完成結構 XrCreateSpatialDiscoverySnapshotCompletionEXT 中填入輸出內容。
應用程式可以提交多個探索快照建立要求,不必等待前一個要求完成。執行階段「可能」會以任何順序處理及完成快照建立作業。如果執行階段因裝置的電力、溫度或其他政策而需要減少系統資源用量,則可能會延遲完成探索快照建立作業,以限制應用程式。
應用程式可以使用 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes,篩選實體清單和元件,執行階段必須將這些元件的資料納入快照。如果應用程式在 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes 中提供有效的空間元件類型清單,則執行階段必須只在快照中包含至少具有 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes 中提供的其中一個元件的空間實體。此外,執行階段必須只包含快照中這些元件的資料。
建立 spatialContext 時,如果 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes 中的任何 XrSpatialComponentTypeEXT 未針對傳遞至 XrSpatialContextCreateInfoEXT :: capabilityConfigs 的空間功能啟用,執行階段必須傳回 XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT。
如果應用程式未在 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes 中提供空間元件類型清單,執行階段必須在快照中納入所有空間實體,這些實體具有 XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents 中列舉的元件組合,適用於為 spatialContext 設定的功能。執行階段必須包含為 spatialContext 設定的功能中,所有已啟用元件的資料。
如果 XrEventDataReferenceSpaceChangePending 在 future 完成前排入佇列,且 XrEventDataReferenceSpaceChangePending :: poseValid 為 false,則執行階段可能會建立不含實體的 XrSpatialSnapshotEXT,或將無法再定位的實體 XrSpatialEntityTrackingStateEXT 設為 XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT 或 XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT,位置在 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace 的 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time。執行階段「不得」因 XrEventDataReferenceSpaceChangePending 而將 XrCreateSpatialContextCompletionEXT :: futureResult 設為錯誤代碼。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrCreateSpatialDiscoverySnapshotAsyncEXT -
spatialContext「必須」是有效的 XrSpatialContextEXT 控制代碼 -
createInfo「必須」指向有效的 XrSpatialDiscoverySnapshotCreateInfoEXT 結構 -
future「必須」是指向XrFutureEXT值的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialDiscoverySnapshotCreateInfoEXT 結構定義如下:
typedef struct XrSpatialDiscoverySnapshotCreateInfoEXT {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
} XrSpatialDiscoverySnapshotCreateInfoEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。componentTypeCount是uint32_t,用於描述componentTypes陣列中的元素數量。componentTypes是 XrSpatialComponentTypeEXT 的陣列。
XrSpatialDiscoverySnapshotCreateInfoEXT 結構描述了在探索空間實體時,建立 XrSpatialSnapshotEXT 控制代碼的資訊。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialDiscoverySnapshotCreateInfoEXT -
type「必須」為XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標。另請參閱:XrSpatialBoundsBoxfANDROID、XrSpatialBoundsFrustumfANDROID、XrSpatialBoundsSpherefANDROID、XrSpatialDiscoveryPersistenceContextFilterANDROIDX1、XrSpatialDiscoveryPersistenceUuidFilterEXT、XrSpatialDiscoveryRoomBoundaryFilterANDROIDSYS、XrSpatialDiscoveryUniqueEntitiesFilterANDROID、XrSpatialFilterTrackingStateEXT、XrSpatialRaycastInfoANDROID - 如果
componentTypeCount不是0,componentTypes必須是指向componentTypeCount個有效 XrSpatialComponentTypeEXT 值陣列的指標
xrCreateSpatialDiscoverySnapshotCompleteEXT 函式的定義如下:
XrResult xrCreateSpatialDiscoverySnapshotCompleteEXT(
XrSpatialContextEXT spatialContext,
const XrCreateSpatialDiscoverySnapshotCompletionInfoEXT* createSnapshotCompletionInfo,
XrCreateSpatialDiscoverySnapshotCompletionEXT* completion);
參數說明
spatialContext是先前傳遞至 xrCreateSpatialDiscoverySnapshotAsyncEXT ::spatialContext的 XrSpatialContextEXT。createSnapshotCompletionInfo是指向 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT 的指標,提供探索快照建立要求完成的相關資訊。completion是指向 XrCreateSpatialDiscoverySnapshotCompletionEXT 的指標。
xrCreateSpatialDiscoverySnapshotCompleteEXT 會完成由 xrCreateSpatialDiscoverySnapshotAsyncEXT 啟動的非同步作業。如果 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: future 未處於就緒狀態,執行階段必須傳回 XR_ERROR_FUTURE_PENDING_EXT。如果 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: future 已完成或取消,執行階段必須傳回 XR_ERROR_FUTURE_INVALID_EXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrCreateSpatialDiscoverySnapshotCompleteEXT -
spatialContext「必須」是有效的 XrSpatialContextEXT 控制代碼 -
createSnapshotCompletionInfo「必須」指向有效的 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT 結構 -
completion「必須」是指向 XrCreateSpatialDiscoverySnapshotCompletionEXT 結構的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT 結構定義如下:
typedef struct XrCreateSpatialDiscoverySnapshotCompletionInfoEXT {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
XrFutureEXT future;
} XrCreateSpatialDiscoverySnapshotCompletionInfoEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。baseSpace是 XrSpace,其中會包含探索 XrSpatialSnapshotEXT 的所有位置。time是XrTime,用於定位探索 XrSpatialSnapshotEXT 的所有位置。future是從 xrCreateSpatialDiscoverySnapshotAsyncEXT 接收的XrFutureEXT
建立的快照中,各種元件資料的位置會以 baseSpace 表示,位於 time。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT -
type「必須」為XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
baseSpace「必須」是有效的 XrSpace 帳號代碼
XrCreateSpatialDiscoverySnapshotCompletionEXT 結構定義如下:
typedef struct XrCreateSpatialDiscoverySnapshotCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialSnapshotEXT snapshot;
} XrCreateSpatialDiscoverySnapshotCompletionEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。futureResult是空間探索快照建立作業的 XrResult。snapshot是 XrSpatialSnapshotEXT,可用於查詢偵測到的空間實體元件資料。
未來退貨代碼
futureResult 值:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHED
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrCreateSpatialDiscoverySnapshotCompletionEXT -
type「必須」為XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
futureResult「必須」是有效的 XrResult 值 - 如果
snapshot不是 XR_NULL_HANDLE,則snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼
探索推薦事件
XrEventDataSpatialDiscoveryRecommendedEXT 結構定義如下:
typedef struct XrEventDataSpatialDiscoveryRecommendedEXT {
XrStructureType type;
const void* next;
XrSpatialContextEXT spatialContext;
} XrEventDataSpatialDiscoveryRecommendedEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。spatialContext是執行階段建議探索的 XrSpatialContextEXT。
應用程式「可以」使用 xrPollEvent 擷取這個事件。應用程式可以等待這個事件,避免過度呼叫 xrCreateSpatialDiscoverySnapshotAsyncEXT 來探索空間實體。如果應用程式在兩個 XrEventDataSpatialDiscoveryRecommendedEXT 事件之間,使用相同的 XrSpatialDiscoverySnapshotCreateInfoEXT 建立多個探索快照,產生的快照可能包含相同的實體,因此建立快照和查詢資料會浪費資源。
等待這個事件建立新的探索快照,可確保應用程式不會向系統傳送過多探索要求,因為執行階段可能不會傳回任何新資料,而且有助於避免過度使用系統資源,以及因裝置的電源或散熱政策而受到節流。這也有助於讓執行階段保持一致,無論是透過即時追蹤動態探索空間實體,還是根據先前記錄的狀態提供空間實體 (執行階段可能只會為每個 XrSpatialContextEXT 佇列一次探索建議事件)。
執行階段「不得」將此事件排入佇列,通知應用程式現有空間實體的元件資料有所變更或調整。應用程式可以使用 xrCreateSpatialUpdateSnapshotEXT,追蹤感興趣空間實體的元件資料更新。
執行階段可以將探索建議事件排入佇列,不必等待應用程式先呼叫 xrCreateSpatialDiscoverySnapshotAsyncEXT。舉例來說,執行階段可能會根據 XrSpatialContextEXT 的設定、對使用者周遭環境的瞭解 (發現新實體或失去現有實體),或向應用程式提示適當的探索要求頻率,以免系統資源超載,決定是否將探索建議事件排入佇列。如果 XrSpatialContextEXT 的整個生命週期內,在使用者環境中找不到任何實體,執行階段可能會選擇不將此事件排入 XrSpatialContextEXT 的佇列。
在應用程式使用 xrCreateSpatialContextCompleteEXT 完成建立作業前,執行階段不得將指定 spatialContext 的事件排入佇列。
應用程式呼叫 xrDestroySpatialContextEXT 後,執行階段不得再為該空間情境排入任何探索建議事件,也不得從 xrPollEvent 傳回該情境的任何這類事件。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrEventDataSpatialDiscoveryRecommendedEXT -
type「必須」為XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標
查詢元件資料
xrQuerySpatialComponentDataEXT 函式的定義如下:
XrResult xrQuerySpatialComponentDataEXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialComponentDataQueryConditionEXT* queryCondition,
XrSpatialComponentDataQueryResultEXT* queryResult);
參數說明
snapshot是先前由 xrCreateSpatialDiscoverySnapshotCompleteEXT 或 xrCreateSpatialUpdateSnapshotEXT 提供的 XrSpatialSnapshotEXT。queryCondition是指向 XrSpatialComponentDataQueryConditionEXT 結構的指標。queryResult是指向 XrSpatialComponentDataQueryResultEXT 結構的指標。
應用程式可以使用 xrQuerySpatialComponentDataEXT 查詢快照中實體的元件資料,方法是將清單結構附加至 XrSpatialComponentDataQueryResultEXT :: next,對應至 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中的每個 XrSpatialComponentTypeEXT。
如果應用程式將清單結構附加至 XrSpatialComponentDataQueryResultEXT :: next,但該結構不對應 XrSpatialComponentDataQueryConditionEXT :: componentTypes 列出的任何元件,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
應用程式可以選擇只附加 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中列出的部分元件對應的清單結構。如果應用程式只想知道符合 queryCondition 的空間實體 ID 和追蹤狀態,可以選擇完全省略清單結構。執行階段「不得」將 XrSpatialComponentDataQueryResultEXT :: next 鏈結中缺少清單結構視為失敗。
如果 XrEventDataReferenceSpaceChangePending 已排入佇列,且應用程式從 XrSpatialSnapshotEXT 查詢元件資料時,XrEventDataReferenceSpaceChangePending :: changeTime 已過,則應用程式可能會使用事件資料相應調整姿勢。
執行階段必須填入 XrSpatialComponentDataQueryResultEXT :: entityIds,且只能包含具有 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中指定的所有元件的實體。如果 XrSpatialComponentDataQueryConditionEXT :: componentTypeCount 為 0,執行階段必須在 queryResult 中填入快照中的所有實體 (及其追蹤狀態)。如果將其他查詢條件新增至 XrSpatialComponentDataQueryConditionEXT :: next,執行階段必須將這些條件視為「AND」與元件類型可用性,也就是說,執行階段必須僅使用符合所有提供條件的實體填入 XrSpatialComponentDataQueryResultEXT ::entityIds。執行階段必須按照 XrSpatialComponentDataQueryResultEXT :: entityIds 中實體的順序,在清單結構中填入元件資料,也就是說,清單結構陣列中特定索引處的元件資料,必須對應至相同索引處的實體。
如果實體的追蹤狀態不是 XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT,執行階段「不得」變更陣列中該實體對應索引的資料,該陣列位於附加至 XrSpatialComponentDataQueryResultEXT 的清單結構中。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrQuerySpatialComponentDataEXT -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
queryCondition「必須」指向有效的 XrSpatialComponentDataQueryConditionEXT 結構 -
queryResult「必須」是指向 XrSpatialComponentDataQueryResultEXT 結構的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_VALIDATION_FAILURE
舉例來說,應用程式會建立包含 5 個實體的 XrSpatialSnapshotEXT,其中:
- 實體 1 和 2 包含元件
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT和XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT - 實體 3 和 4 包含元件
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT和XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT - 實體 5 包含
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT和XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT元件。
XrSpatialEntityIdEXT
XrSpatialEntityIdEXT
1
1
2
2
3
3
4
4
5
5
Bounded2D
Bounded2D
是
是
是
是
否
否
否
否
是
是
父項
父項
是
是
是
是
否
否
否
否
否
否
Mesh3D
Mesh3D
否
否
否
否
是
是
是
是
是
是
Bounded3D
Bounded3D
否
否
否
否
是
是
是
是
否
否 Text is not SVG - cannot display
圖 20. 範例快照
在上述快照上使用 xrQuerySpatialComponentDataEXT,並在查詢條件中列出 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,系統會將實體 #1、#2 和 #5 傳回應用程式,應用程式可以將 XrSpatialBounded2DDataEXT 陣列附加為 XrSpatialComponentBounded2DListEXT 結構的一部分,附加至 XrSpatialComponentDataQueryResultEXT 的下一個鏈結,以取得 bounded2D 資料。
XrSpatialEntityIdEXT
XrSpatialEntityIdEXT
1
1
2
2
5
5
Bounded2D
Bounded2D
entityId #1 的資料
實體資料...
entityId #2 的資料
實體資料...
entityId #5 的資料
實體資料...
entityIds
entityIds
下一個
下一個
XrSpatialComponent DataQueryResultEXT
XrSpatialComponent Dat...
bounds
bounds
XrSpatialComponent Bounded2DListEXT
XrSpatialComponent Bou... 文字並非 SVG,無法顯示
圖 21. 查詢結果範例
在上述快照上使用 xrQuerySpatialComponentDataEXT,並在查詢條件中列出 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT 和 XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT 元件,系統會將實體 #3 和 #4 傳回應用程式,應用程式可以將 XrBoxf 和 XrSpatialMeshDataEXT 陣列分別附加為 XrSpatialComponentBounded3DListEXT 和 XrSpatialComponentMesh3DListEXT 結構的一部分,附加至 XrSpatialComponentDataQueryResultEXT 的下一個鏈結,以取得元件資料。
XrSpatialEntityIdEXT
XrSpatialEntityIdEXT
3
3
4
4
Bounded3D
Bounded3D
entityId #3 的資料
實體資料...
entityId #4 的資料
實體資料...
Mesh3D
Mesh3D
entityId #3 的資料
實體資料...
entityId #4 的資料
實體資料...
entityIds
entityIds
下一個
下一個
XrSpatialComponent DataQueryResultEXT
XrSpatialComponent Da...
bounds
bounds
下一個
下一個
XrSpatialComponent Bounded3DListEXT
XrSpatialComponent Bo...
XrSpatialComponent Mesh3DListEXT
XrSpatialComponent Me...
網格
網格 Text is not SVG - cannot display
圖 22. 查詢結果範例
XrSpatialComponentDataQueryConditionEXT 結構定義如下:
typedef struct XrSpatialComponentDataQueryConditionEXT {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
} XrSpatialComponentDataQueryConditionEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。componentTypeCount是uint32_t,用於描述componentTypes陣列中的元素數量。componentTypes是 XrSpatialComponentTypeEXT 陣列,用於從快照取得資料。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialComponentDataQueryConditionEXT -
type「必須」為XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標。另請參閱:XrSpatialDiscoveryPersistenceUuidFilterEXT、XrSpatialFilterArchetypeEXT、XrSpatialFilterTrackingStateEXT - 如果
componentTypeCount不是0,componentTypes必須是指向componentTypeCount個有效 XrSpatialComponentTypeEXT 值陣列的指標
XrSpatialComponentDataQueryResultEXT 結構定義如下:
typedef struct XrSpatialComponentDataQueryResultEXT {
XrStructureType type;
void* next;
uint32_t entityIdCapacityInput;
uint32_t entityIdCountOutput;
XrSpatialEntityIdEXT* entityIds;
uint32_t entityStateCapacityInput;
uint32_t entityStateCountOutput;
XrSpatialEntityTrackingStateEXT* entityStates;
} XrSpatialComponentDataQueryResultEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。entityIdCapacityInput是entityIds陣列的容量,或 0 表示要求擷取所需容量。entityIdCountOutput是entityIds中的XrSpatialEntityIdEXT數量,或entityIdCapacityInput不足時所需的容量。entityIds是XrSpatialEntityIdEXT的陣列。如果entityIdCapacityInput為 0,則可以是NULL。entityStateCapacityInput是entityStates陣列的容量,或 0 表示要求擷取所需容量。entityStateCountOutput是entityStates中 XrSpatialEntityTrackingStateEXT 的數量,或entityStateCapacityInput不足時所需的容量。這個值必須一律與entityIdCountOutput相同。entityStates是 XrSpatialEntityTrackingStateEXT 的陣列。如果entityStateCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
entityIds大小,請參閱「緩衝區大小參數」一節。
應用程式可以搭配 xrCreateSpatialEntityFromIdEXT 使用 entityIds,為要定期更新的實體建立 XrSpatialEntityEXT 控制代碼。應用程式可以將這些 XrSpatialEntityEXT 控制代碼與 xrCreateSpatialUpdateSnapshotEXT 搭配使用,建立更新快照,其中包含執行階段最新已知的實體元件資料。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialComponentDataQueryResultEXT -
type「必須」為XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標。另請參閱:XrSpatialComponentAnchorListEXT、XrSpatialComponentAnnotationQuadListANDROID、XrSpatialComponentBounded2DListEXT、XrSpatialComponentBounded3DListEXT、XrSpatialComponentConfidenceListANDROIDSYS、XrSpatialComponentImage2DListEXT、XrSpatialComponentKeyboardSemanticLabelListEXT、XrSpatialComponentMarkerListEXT、XrSpatialComponentMaterialTypeListANDROIDSYS、XrSpatialComponentMesh2DListEXT、XrSpatialComponentMesh3DListEXT、XrSpatialComponentMesh3DNormalsListEXT、XrSpatialComponentMesh3DTriangleSemanticLabelsListEXT、XrSpatialComponentMesh3DVertexSemanticLabelsListEXT、XrSpatialComponentMouseSemanticLabelListEXT、XrSpatialComponentObjectSemanticLabelListANDROID、XrSpatialComponentObjectSemanticLabelListEXT、XrSpatialComponentOccupancyGridListANDROIDX1、XrSpatialComponentParentListEXT、XrSpatialComponentPersistenceListEXT、XrSpatialComponentPersistenceScopesListANDROIDX1、XrSpatialComponentPlaneAlignmentListEXT、XrSpatialComponentPlaneSemanticLabelListEXT、XrSpatialComponentPolygon2DListEXT、XrSpatialComponentRaycastResultListANDROID、XrSpatialComponentRoomEmptinessListANDROIDSYS、XrSpatialComponentRoomListANDROIDSYS、XrSpatialComponentStreetscapeGeometryMetadataListANDROIDX2、XrSpatialComponentSubsumedByListANDROID - 如果
entityIdCapacityInput不是0,entityIds「必須」是指向entityIdCapacityInputXrSpatialEntityIdEXT值陣列的指標 - 如果
entityStateCapacityInput不是0,entityStates必須是指向entityStateCapacityInputXrSpatialEntityTrackingStateEXT 值陣列的指標
typedef enum XrSpatialEntityTrackingStateEXT {
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT = 1,
XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT = 2,
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT = 3,
XR_SPATIAL_ENTITY_TRACKING_STATE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialEntityTrackingStateEXT;
XrSpatialEntityTrackingStateEXT 會列舉可能的空間實體追蹤狀態:
列舉的意義如下:
列舉說明
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT
執行階段已停止追蹤這個實體,且不會再繼續追蹤。
XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT
執行階段已暫停追蹤這個實體,但日後可能會繼續追蹤。
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT
執行階段目前正在追蹤這個實體,且其元件資料有效。
追蹤
已暫停
STOPPED
圖 23. XrSpatialEntityTrackingStateEXT
- 如果執行階段暫停追蹤空間實體,但日後可能恢復追蹤,則可能會將空間實體的狀態從
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT變更為XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT。執行階段「可能」執行這項操作的情況包括 (但不限於):應用程式失去輸入焦點;指定的空間實體距離使用者太遠,無法準確追蹤;或追蹤的實體過多,執行階段想要降低追蹤成本。XrSpatialEntityTrackingStateEXT 可協助應用程式不受各執行階段的不同追蹤政策影響。 - 執行階段可能會將實體狀態從
XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT變更為XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT或XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT。 - 如果空間實體遺失,且追蹤功能無法復原或恢復,執行階段必須將空間實體的狀態從
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT或XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT變更為XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT。舉例來說,如果裝置失去追蹤、重新啟動追蹤工作階段,但無法在環境中重新定位,就會將這個追蹤工作階段中發現的實體視為新實體。 - 實體的追蹤狀態設為
XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT後,執行階段「絕對不得」變更為任何其他狀態。 - 使用 xrQuerySpatialComponentDataEXT 查詢空間實體的元件資料時,如果實體狀態為
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT,執行階段必須在 XrSpatialComponentDataQueryResultEXT 的下一個鏈結中,於應用程式提供的緩衝區內容中設定有效資料。如果實體狀態為XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT或XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT,執行階段「不得」變更緩衝區內容。
元件資料的雙重呼叫慣用語
XrSpatialBufferEXT 結構定義如下:
typedef struct XrSpatialBufferEXT {
XrSpatialBufferIdEXT bufferId;
XrSpatialBufferTypeEXT bufferType;
} XrSpatialBufferEXT;
成員說明
bufferId緩衝區資料的XrSpatialBufferIdEXT。bufferType是 XrSpatialBufferTypeEXT,用於指出bufferId中的資料類型。應用程式可以使用bufferType判斷要使用哪個函式擷取緩衝區的實際資料。
部分空間元件具有可變大小的資料,因此需要使用雙呼叫慣用語來擷取資料。在這種情況下,空間元件資料結構會為該元件資料中所需的每個可變大小緩衝區,提供 XrSpatialBufferEXT。
對於相同的 bufferId,執行階段「必須」在不同元件資料查詢之間提供相同的資料,即使在不同快照之間也是如此。如果元件資料查詢呼叫之間的 bufferId 不同,應用程式就會知道該元件的資料「可能」已變更。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialBufferEXT -
bufferType「必須」是有效的 XrSpatialBufferTypeEXT 值
XR_DEFINE_ATOM(XrSpatialBufferIdEXT)
XrSpatialBufferIdEXT 用於表示空間元件的任何可變大小資料。
執行階段必須將 XrSpatialBufferIdEXT 及其資料保留在記憶體中,至少要保留到包含該資料的 XrSpatialSnapshotEXT 生命週期結束。執行階段可能會將 XrSpatialBufferIdEXT 及其資料保留在記憶體中,時間長度超過 XrSpatialSnapshotEXT 的生命週期,以便在應用程式稍後建立的快照中傳回相同的 ID。對於相同的 XrSpatialBufferIdEXT,執行階段「必須」一律透過適當的 xrGetSpatialBuffer* 函式傳回相同的資料。
typedef enum XrSpatialBufferTypeEXT {
XR_SPATIAL_BUFFER_TYPE_UNKNOWN_EXT = 0,
XR_SPATIAL_BUFFER_TYPE_STRING_EXT = 1,
XR_SPATIAL_BUFFER_TYPE_UINT8_EXT = 2,
XR_SPATIAL_BUFFER_TYPE_UINT16_EXT = 3,
XR_SPATIAL_BUFFER_TYPE_UINT32_EXT = 4,
XR_SPATIAL_BUFFER_TYPE_FLOAT_EXT = 5,
XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT = 6,
XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT = 7,
XR_SPATIAL_BUFFER_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialBufferTypeEXT;
XrSpatialBufferTypeEXT 列舉會識別 XrSpatialBufferIdEXT 代表的緩衝區資料類型。
列舉說明
XR_SPATIAL_BUFFER_TYPE_STRING_EXT。XrSpatialBufferIdEXT「可以」傳遞至 xrGetSpatialBufferStringEXT,以擷取字串緩衝區。XR_SPATIAL_BUFFER_TYPE_UINT8_EXT。XrSpatialBufferIdEXT「可以」傳遞至 xrGetSpatialBufferUint8EXT,以擷取uint8_t緩衝區。XR_SPATIAL_BUFFER_TYPE_UINT16_EXT。XrSpatialBufferIdEXT「可以」傳遞至 xrGetSpatialBufferUint16EXT,以擷取uint16_t緩衝區。XR_SPATIAL_BUFFER_TYPE_UINT32_EXT。XrSpatialBufferIdEXT「可以」傳遞至 xrGetSpatialBufferUint32EXT,以擷取uint32_t緩衝區。XR_SPATIAL_BUFFER_TYPE_FLOAT_EXT。XrSpatialBufferIdEXT可以傳遞至 xrGetSpatialBufferFloatEXT,以擷取float緩衝區。XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT。XrSpatialBufferIdEXT「可以」傳遞至 xrGetSpatialBufferVector2fEXT,以擷取 XrVector2f 緩衝區。XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT。XrSpatialBufferIdEXT「可以」傳遞至 xrGetSpatialBufferVector3fEXT,以擷取 XrVector3f 緩衝區。
xrGetSpatialBufferStringEXT 函式的定義如下:
XrResult xrGetSpatialBufferStringEXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
char* buffer);
參數說明
snapshot是 XrSpatialSnapshotEXT 的控制代碼。info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。bufferCountOutput是字元數,或bufferCapacityInput不足時所需的容量。buffer是char的陣列。如果bufferCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以使用 xrGetSpatialBufferStringEXT,取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 為 XR_SPATIAL_BUFFER_TYPE_STRING_EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_STRING_EXT,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
由執行階段填入的 buffer「必須」是以空值結尾的 UTF-8 字串。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrGetSpatialBufferStringEXT -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
info「必須」是指向有效 XrSpatialBufferGetInfoEXT 結構的指標 -
bufferCountOutput「必須」是指向uint32_t值的指標 - 如果
bufferCapacityInput不是0,buffer「必須」是指向bufferCapacityInput個字元值陣列的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
xrGetSpatialBufferUint8EXT 函式的定義如下:
XrResult xrGetSpatialBufferUint8EXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
uint8_t* buffer);
參數說明
snapshot是 XrSpatialSnapshotEXT 的控制代碼。info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。bufferCountOutput是buffer陣列中的元素數量,或bufferCapacityInput不足時所需的容量。buffer是uint8_t的陣列。如果bufferCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以使用 xrGetSpatialBufferUint8EXT,取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 為 XR_SPATIAL_BUFFER_TYPE_UINT8_EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_UINT8_EXT,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrGetSpatialBufferUint8EXT -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
info「必須」是指向有效 XrSpatialBufferGetInfoEXT 結構的指標 -
bufferCountOutput「必須」是指向uint32_t值的指標 - 如果
bufferCapacityInput不是0,buffer「必須」是指向bufferCapacityInputuint8_t值陣列的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
xrGetSpatialBufferUint16EXT 函式的定義如下:
XrResult xrGetSpatialBufferUint16EXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
uint16_t* buffer);
參數說明
snapshot是 XrSpatialSnapshotEXT 的控制代碼。info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。bufferCountOutput是buffer陣列中的元素數量,或bufferCapacityInput不足時所需的容量。buffer是uint16_t的陣列。如果bufferCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以使用 xrGetSpatialBufferUint16EXT,取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 為 XR_SPATIAL_BUFFER_TYPE_UINT16_EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_UINT16_EXT,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效用途 (隱含)
- 呼叫 xrGetSpatialBufferUint16EXT 之前,必須啟用
XR_EXT_spatial_entity擴充功能 -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
info「必須」是指向有效 XrSpatialBufferGetInfoEXT 結構的指標 -
bufferCountOutput「必須」是指向uint32_t值的指標 - 如果
bufferCapacityInput不是0,buffer「必須」是指向bufferCapacityInputuint16_t值陣列的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
xrGetSpatialBufferUint32EXT 函式的定義如下:
XrResult xrGetSpatialBufferUint32EXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
uint32_t* buffer);
參數說明
snapshot是 XrSpatialSnapshotEXT 的控制代碼。info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。bufferCountOutput是buffer陣列中的元素數量,或bufferCapacityInput不足時所需的容量。buffer是uint32_t的陣列。如果bufferCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以使用 xrGetSpatialBufferUint32EXT,取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 為 XR_SPATIAL_BUFFER_TYPE_UINT32_EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_UINT32_EXT,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效用途 (隱含)
- 呼叫 xrGetSpatialBufferUint32EXT 之前,必須啟用
XR_EXT_spatial_entity擴充功能 -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
info「必須」是指向有效 XrSpatialBufferGetInfoEXT 結構的指標 -
bufferCountOutput「必須」是指向uint32_t值的指標 - 如果
bufferCapacityInput不是0,buffer「必須」是指向bufferCapacityInputuint32_t值陣列的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
xrGetSpatialBufferFloatEXT 函式的定義如下:
XrResult xrGetSpatialBufferFloatEXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
float* buffer);
參數說明
snapshot是 XrSpatialSnapshotEXT 的控制代碼。info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。bufferCountOutput是buffer陣列中的元素數量,或bufferCapacityInput不足時所需的容量。buffer是float的陣列。如果bufferCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以使用 xrGetSpatialBufferFloatEXT,取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 為 XR_SPATIAL_BUFFER_TYPE_FLOAT_EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_FLOAT_EXT,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrGetSpatialBufferFloatEXT -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
info「必須」是指向有效 XrSpatialBufferGetInfoEXT 結構的指標 -
bufferCountOutput「必須」是指向uint32_t值的指標 - 如果
bufferCapacityInput不是0,buffer「必須」是指向bufferCapacityInputfloat值陣列的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
xrGetSpatialBufferVector2fEXT 函式的定義如下:
XrResult xrGetSpatialBufferVector2fEXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
XrVector2f* buffer);
參數說明
snapshot是 XrSpatialSnapshotEXT 的控制代碼。info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。bufferCountOutput是buffer陣列中的元素數量,或bufferCapacityInput不足時所需的容量。buffer是 XrVector2f 陣列。如果bufferCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式「可以」使用 xrGetSpatialBufferVector2fEXT,取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 為 XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效用途 (隱含)
- 呼叫 xrGetSpatialBufferVector2fEXT 前,必須啟用
XR_EXT_spatial_entity擴充功能 -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
info「必須」是指向有效 XrSpatialBufferGetInfoEXT 結構的指標 -
bufferCountOutput「必須」是指向uint32_t值的指標 - 如果
bufferCapacityInput不是0,buffer必須是指向bufferCapacityInputXrVector2f 結構陣列的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
xrGetSpatialBufferVector3fEXT 函式的定義如下:
XrResult xrGetSpatialBufferVector3fEXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
XrVector3f* buffer);
參數說明
snapshot是 XrSpatialSnapshotEXT 的控制代碼。info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 表示要求擷取所需容量。bufferCountOutput是buffer陣列中的元素數量,或bufferCapacityInput不足時所需的容量。buffer是 XrVector3f 陣列。如果bufferCapacityInput為 0,則可以是NULL。- 如要進一步瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以使用 xrGetSpatialBufferVector3fEXT,取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 為 XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT,執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效用途 (隱含)
- 呼叫 xrGetSpatialBufferVector3fEXT 之前,必須啟用
XR_EXT_spatial_entity擴充功能 -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼 -
info「必須」是指向有效 XrSpatialBufferGetInfoEXT 結構的指標 -
bufferCountOutput「必須」是指向uint32_t值的指標 - 如果
bufferCapacityInput不是0,buffer必須是指向bufferCapacityInputXrVector3f 結構陣列的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialBufferGetInfoEXT 結構定義如下:
typedef struct XrSpatialBufferGetInfoEXT {
XrStructureType type;
const void* next;
XrSpatialBufferIdEXT bufferId;
} XrSpatialBufferGetInfoEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。bufferId:要擷取資料的緩衝區XrSpatialBufferIdEXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialBufferGetInfoEXT -
type「必須」為XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標
#define XR_NULL_SPATIAL_BUFFER_ID_EXT 0
XR_NULL_SPATIAL_BUFFER_ID_EXT 是保留值,代表無效的 XrSpatialBufferIdEXT。只有在明確允許的情況下,才能傳遞至 API 函式,並從 API 函式傳回。
建立更新快照
xrCreateSpatialUpdateSnapshotEXT 函式的定義如下:
XrResult xrCreateSpatialUpdateSnapshotEXT(
XrSpatialContextEXT spatialContext,
const XrSpatialUpdateSnapshotCreateInfoEXT* createInfo,
XrSpatialSnapshotEXT* snapshot);
參數說明
spatialContext是先前使用 xrCreateSpatialContextAsyncEXT 建立的 XrSpatialContextEXT。createInfo是指向 XrSpatialUpdateSnapshotCreateInfoEXT 的指標。snapshot是指向結果 XrSpatialSnapshotEXT 的指標。
應用程式可以使用 xrCreateSpatialUpdateSnapshotEXT 建立快照,並取得執行階段已知的特定實體最新元件資料。應用程式可以在建立快照時,提供 XrSpatialEntityEXT 控制代碼和感興趣的元件類型。
應用程式可以使用 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes,篩選資料必須包含在快照中的元件清單。如果應用程式在 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中提供有效的空間元件類型清單,則執行階段必須在快照中只包含至少具有 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中提供的其中一個元件的空間實體。此外,執行階段必須只包含快照中這些元件的資料。
如果 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中的任何 XrSpatialComponentTypeEXT,未針對建立 spatialContext 時傳遞至 XrSpatialContextCreateInfoEXT :: capabilityConfigs 的空間功能啟用,執行階段必須傳回 XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT。
如果應用程式未在 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中提供空間元件類型清單,執行階段必須在快照中納入 XrSpatialUpdateSnapshotCreateInfoEXT :: entities 列出的所有空間實體,且必須納入為 spatialContext 設定的功能中,所有已啟用元件的資料。
執行階段「不得」包含 snapshot 中 XrSpatialUpdateSnapshotCreateInfoEXT :: entities 未列出的空間實體。
應用程式「可以」建立任意數量的快照,但「必須」注意為每個新快照分配的記憶體,且在不再需要快照時「必須」將其刪除。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能呼叫 xrCreateSpatialUpdateSnapshotEXT -
spatialContext「必須」是有效的 XrSpatialContextEXT 控制代碼 -
createInfo「必須」指向有效的 XrSpatialUpdateSnapshotCreateInfoEXT 結構 -
snapshot「必須」是指向 XrSpatialSnapshotEXT 控制代碼的指標
傳回代碼
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
XrSpatialUpdateSnapshotCreateInfoEXT 結構定義如下:
typedef struct XrSpatialUpdateSnapshotCreateInfoEXT {
XrStructureType type;
const void* next;
uint32_t entityCount;
const XrSpatialEntityEXT* entities;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
XrSpace baseSpace;
XrTime time;
} XrSpatialUpdateSnapshotCreateInfoEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。entityCount是uint32_t,用於描述entities陣列中的元素數量。entities是 XrSpatialEntityEXT 陣列,執行階段必須在快照中加入元件資料。componentTypeCount是uint32_t,用於描述componentTypes陣列中的元素數量。componentTypes是 XrSpatialComponentTypeEXT 陣列,執行階段「必須」在快照中加入該陣列的資料。baseSpace是 XrSpace,更新後的 XrSpatialSnapshotEXT 所有位置都會相對於此空間。time是XrTime,更新 XrSpatialSnapshotEXT 的所有位置都會位於此處。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialUpdateSnapshotCreateInfoEXT -
type「必須」為XR_TYPE_SPATIAL_UPDATE_SNAPSHOT_CREATE_INFO_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
entities「必須」是指向entityCount個有效 XrSpatialEntityEXT 控制代碼陣列的指標 - 如果
componentTypeCount不是0,componentTypes必須是指向componentTypeCount個有效 XrSpatialComponentTypeEXT 值陣列的指標 -
baseSpace「必須」是有效的 XrSpace 帳號代碼 -
entityCount參數必須大於0 -
baseSpace和entities的元素必須已建立、分配或從同一個 XrSession 擷取
刪除快照
xrDestroySpatialSnapshotEXT 函式的定義如下:
XrResult xrDestroySpatialSnapshotEXT(
XrSpatialSnapshotEXT snapshot);
參數說明
snapshot是先前由 xrCreateSpatialDiscoverySnapshotCompleteEXT 或 xrCreateSpatialUpdateSnapshotEXT 提供的 XrSpatialSnapshotEXT。
應用程式可以呼叫 xrDestroySpatialSnapshotEXT,刪除 XrSpatialSnapshotEXT 控制代碼和相關聯的資源。
有效用途 (隱含)
- 呼叫 xrDestroySpatialSnapshotEXT 之前,必須啟用
XR_EXT_spatial_entity擴充功能 -
snapshot「必須」是有效的 XrSpatialSnapshotEXT 控制代碼
執行緒安全
- 存取
snapshot和任何子項控制代碼時,必須從外部同步
傳回代碼
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
常見元件
有界 2D
元件資料
XrSpatialBounded2DDataEXT 結構定義如下:
typedef struct XrSpatialBounded2DDataEXT {
XrPosef center;
XrExtent2Df extents;
} XrSpatialBounded2DDataEXT;
成員說明
center是 XrPosef,用於定義有界限 2D 元件的幾何中心。extents是有界限 2D 元件沿著 X 軸 (extents.width) 和 Y 軸 (extents.height) 的範圍,以center為中心。
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT 的 extents 是指實體在平面座標系統的 x-y 平面中的大小。如果平面的位置為 {0, 0, 0}、旋轉角度為 {0, 0, 0, 1} (無旋轉),且範圍為 {1, 1},則表示該平面為 1 公尺 x 1 公尺,中心點為 {0, 0, 0},且其正面法向量指向元件空間中的 +Z 方向。
X X Y Y Z Z 高度 高度 Y Y Z Z X X 垂直平面 垂直平面 水平平面 水平平面 寬度 寬度 寬度 寬度 高度 高度
圖 24. Bounded2D 元件座標系統
注意事項
OpenXR 使用 X-Y 平面,+Z 為平面法線,但其他 API 可能使用 X-Z 平面,+Y 為平面法線。只要繞著 +X 軸旋轉 -π/2 弧度,即可將 X-Y 平面轉換為 X-Z 平面。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialBounded2DDataEXT
用於查詢資料的元件清單結構
XrSpatialComponentBounded2DListEXT 結構定義如下:
typedef struct XrSpatialComponentBounded2DListEXT {
XrStructureType type;
void* next;
uint32_t boundCount;
XrSpatialBounded2DDataEXT* bounds;
} XrSpatialComponentBounded2DListEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。boundCount是uint32_t,用於描述bounds陣列中的元素數量。bounds是 XrSpatialBounded2DDataEXT 的陣列。
如果 XrSpatialComponentBounded2DListEXT 位於 XrSpatialComponentDataQueryResultEXT :: next 的下一個鏈結中,但 XrSpatialComponentDataQueryConditionEXT ::componentTypeCount 不為零,且 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT 未包含在 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中,則執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_VALIDATION_FAILURE。
如果 boundCount 小於 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput,執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_SIZE_INSUFFICIENT。
如果 xrQuerySpatialComponentDataEXT :: snapshot 是透過 xrCreateSpatialDiscoverySnapshotCompleteEXT 建立,則執行階段必須在 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace 和 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time 中提供 XrSpatialBounded2DDataEXT :: center。
如果 xrQuerySpatialComponentDataEXT :: snapshot 是透過 xrCreateSpatialUpdateSnapshotEXT 建立,則執行階段必須在 XrSpatialUpdateSnapshotCreateInfoEXT :: baseSpace 和 XrSpatialUpdateSnapshotCreateInfoEXT :: time 中提供 XrSpatialBounded2DDataEXT :: center。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialComponentBounded2DListEXT -
type「必須」為XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
bounds「必須」指向boundCountXrSpatialBounded2DDataEXT 結構陣列 -
boundCount參數必須大於0
設定
如果 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT 列舉在 XrSpatialCapabilityComponentTypesEXT :: componentTypes 中,代表某項功能,應用程式可以在 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 清單中加入列舉值,啟用該功能。這個元件不需要任何特殊設定,即可納入 XrSpatialCapabilityConfigurationBaseHeaderEXT 的下一個鏈結。
有邊界的 3D
元件資料
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT 使用 XrBoxf 儲存資料。
用於查詢資料的元件清單結構
XrSpatialComponentBounded3DListEXT 結構定義如下:
typedef struct XrSpatialComponentBounded3DListEXT {
XrStructureType type;
void* next;
uint32_t boundCount;
XrBoxf* bounds;
} XrSpatialComponentBounded3DListEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。boundCount是uint32_t,用於描述bounds陣列中的元素數量。bounds是 XrBoxf 陣列。
如果 XrSpatialComponentBounded3DListEXT 位於 XrSpatialComponentDataQueryResultEXT :: next 的下一個鏈結中,但 XrSpatialComponentDataQueryConditionEXT ::componentTypeCount 不為零,且 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT 未包含在 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中,則執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_VALIDATION_FAILURE。
如果 boundCount 小於 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput,執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_SIZE_INSUFFICIENT。
如果 xrQuerySpatialComponentDataEXT :: snapshot 是透過 xrCreateSpatialDiscoverySnapshotCompleteEXT 建立,則執行階段必須在 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace 的 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time 提供 XrBoxf :: center。
如果 xrQuerySpatialComponentDataEXT :: snapshot 是透過 xrCreateSpatialUpdateSnapshotEXT 建立,則執行階段必須在 XrSpatialUpdateSnapshotCreateInfoEXT :: time 的 XrSpatialUpdateSnapshotCreateInfoEXT :: baseSpace 中提供 XrBoxf :: center。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialComponentBounded3DListEXT -
type「必須」為XR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
bounds「必須」是指向boundCountXrBoxf 結構陣列的指標 -
boundCount參數必須大於0
設定
如果 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT 在 XrSpatialCapabilityComponentTypesEXT :: componentTypes 中列舉,應用程式可以在 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 清單中加入列舉,啟用該功能。這個元件不需要任何特殊設定,即可納入 XrSpatialCapabilityConfigurationBaseHeaderEXT 的下一個鏈結。
父項
元件資料
XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT 使用 XrSpatialEntityIdEXT 儲存資料。
用於查詢資料的元件清單結構
XrSpatialComponentParentListEXT 結構定義如下:
typedef struct XrSpatialComponentParentListEXT {
XrStructureType type;
void* next;
uint32_t parentCount;
XrSpatialEntityIdEXT* parents;
} XrSpatialComponentParentListEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。parentCount是uint32_t,用於描述parents陣列中的元素數量。parents是XrSpatialEntityIdEXT的陣列。
如果 XrSpatialComponentParentListEXT 位於 XrSpatialComponentDataQueryResultEXT :: next 的下一個鏈結中,但 XrSpatialComponentDataQueryConditionEXT ::componentTypeCount 不為零,且 XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT 未包含在 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中,則執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_VALIDATION_FAILURE。
如果 parentCount 小於 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput,執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_SIZE_INSUFFICIENT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialComponentParentListEXT -
type「必須」為XR_TYPE_SPATIAL_COMPONENT_PARENT_LIST_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
parents「必須」是指向parentCountXrSpatialEntityIdEXT值陣列的指標 -
parentCount參數必須大於0
設定
如果 XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT 在 XrSpatialCapabilityComponentTypesEXT :: componentTypes 中列舉,應用程式可以在 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 清單中加入列舉,啟用該功能。這個元件不需要任何特殊設定,即可納入 XrSpatialCapabilityConfigurationBaseHeaderEXT 的下一個鏈結。
網格 3D
元件資料
XrSpatialMeshDataEXT 結構定義如下:
typedef struct XrSpatialMeshDataEXT {
XrPosef origin;
XrSpatialBufferEXT vertexBuffer;
XrSpatialBufferEXT indexBuffer;
} XrSpatialMeshDataEXT;
成員說明
origin是定義網格原點的 XrPosef。網格的所有頂點都必須相對於這個原點。vertexBuffer是 XrSpatialBufferEXT,提供緩衝區 ID,代表這個元件所在實體的頂點緩衝區。頂點的位置必須相對於origin。indexBuffer是 XrSpatialBufferEXT,提供緩衝區的 ID,代表三角形索引陣列,指定vertexBuffer中網格頂點的索引。三角形索引必須以逆時針順序傳回,且三個索引代表一個三角形。
使用 XrSpatialMeshDataEXT 的元件類型必須指定 vertexBuffer 和 indexBuffer 的 XrSpatialBufferTypeEXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialMeshDataEXT -
vertexBuffer「必須」是有效的 XrSpatialBufferEXT 結構 -
indexBuffer「必須」是有效的 XrSpatialBufferEXT 結構
用於查詢資料的元件清單結構
XrSpatialComponentMesh3DListEXT 結構定義如下:
typedef struct XrSpatialComponentMesh3DListEXT {
XrStructureType type;
void* next;
uint32_t meshCount;
XrSpatialMeshDataEXT* meshes;
} XrSpatialComponentMesh3DListEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。meshCount是uint32_t,用於描述meshes陣列中的元素數量。meshes是 XrSpatialMeshDataEXT 的陣列。
應用程式可以查詢 XrSpatialSnapshotEXT 中空間實體的網格 3D 元件,方法是在 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中新增 XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT,並將 XrSpatialComponentMesh3DListEXT 新增至 XrSpatialComponentDataQueryResultEXT 的下一個指標鏈結。
如果 XrSpatialComponentMesh3DListEXT 位於 XrSpatialComponentDataQueryResultEXT :: next 的下一個鏈結中,但 XrSpatialComponentDataQueryConditionEXT ::componentTypeCount 不為零,且 XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT 未包含在 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中,則執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_VALIDATION_FAILURE。
如果 meshCount 小於 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput,執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_SIZE_INSUFFICIENT。
對於執行階段在 meshes 陣列中填入的 XrSpatialMeshDataEXT,XrSpatialMeshDataEXT :: vertexBuffer 的 XrSpatialBufferEXT :: bufferType「必須」為 XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT,XrSpatialMeshDataEXT :: indexBuffer 的 XrSpatialBufferEXT :: bufferType「必須」為 XR_SPATIAL_BUFFER_TYPE_UINT32_EXT。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialComponentMesh3DListEXT -
type「必須」為XR_TYPE_SPATIAL_COMPONENT_MESH_3D_LIST_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
meshes「必須」是指向meshCountXrSpatialMeshDataEXT 結構陣列的指標 -
meshCount參數必須大於0
設定
如果 XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT 在 XrSpatialCapabilityComponentTypesEXT :: componentTypes 中列舉,則應用程式可以啟用該功能,方法是在支援此元件的功能的 XrSpatialCapabilityConfigurationBaseHeaderEXT 衍生結構的 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 清單中加入該列舉。
這個元件不需要任何特殊設定,即可納入 XrSpatialCapabilityConfigurationBaseHeaderEXT 的下一個鏈結。
追蹤狀態篩選器
XrSpatialFilterTrackingStateEXT 結構定義如下:
typedef struct XrSpatialFilterTrackingStateEXT {
XrStructureType type;
const void* next;
XrSpatialEntityTrackingStateEXT trackingState;
} XrSpatialFilterTrackingStateEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或指向結構鏈中下一個結構的指標。trackingState是應用程式要套用篩選器的 XrSpatialEntityTrackingStateEXT。
應用程式可以在 XrSpatialDiscoverySnapshotCreateInfoEXT 的下一個鏈結中使用 XrSpatialFilterTrackingStateEXT,將探索範圍限定在追蹤狀態為 trackingState 的實體。
應用程式可以在 XrSpatialComponentDataQueryConditionEXT 的下一個鏈結中使用 XrSpatialFilterTrackingStateEXT,將快照中的元件資料查詢範圍,限定為追蹤狀態為 trackingState 的實體。
有效用途 (隱含)
- 必須先啟用
XR_EXT_spatial_entity擴充功能,才能使用 XrSpatialFilterTrackingStateEXT -
type「必須」為XR_TYPE_SPATIAL_FILTER_TRACKING_STATE_EXT -
next「必須」為NULL,或指向結構鏈中下一個結構的有效指標 -
trackingState「必須」是有效的 XrSpatialEntityTrackingStateEXT 值
範例程式碼
應用程式使用情形
應用程式通常會以下列模式使用空間實體擴充功能:
- 應用程式會先使用 xrEnumerateSpatialCapabilitiesEXT 列舉系統的空間功能。接著,系統會檢查傳回的 XrSpatialCapabilityEXT 陣列,並分別使用 xrEnumerateSpatialCapabilityComponentTypesEXT 和 xrEnumerateSpatialCapabilityFeaturesEXT,列舉各項功能支援的元件和功能。這樣一來,應用程式就能全面掌握可啟用的元件,以及功能接受的設定。
- 接著,應用程式會建立一或多個 XrSpatialContextEXT 控制代碼,並指定空間功能設定。這些設定會在空間情境中啟用及設定特定功能,並啟用及設定這些功能的元件。
- 對於每個 XrSpatialContextEXT,應用程式會等待接收該 XrSpatialContextEXT 的 XrEventDataSpatialDiscoveryRecommendedEXT 事件,然後再使用 xrCreateSpatialDiscoverySnapshotAsyncEXT 探索空間實體。這項非同步作業完成後,應用程式會收到 XrSpatialSnapshotEXT 控制代碼。
- 應用程式會使用 xrQuerySpatialComponentDataEXT 查詢實體和這個 XrSpatialSnapshotEXT 包含的元件資料。如果實體狀態為
XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT,應用程式會從附加至下一個 XrSpatialComponentDataQueryResultEXT 鏈結的結構中,讀取所查詢實體的最新元件資料。 - 如果應用程式認為某些實體值得關注,並想持續取得更新,就會使用 xrCreateSpatialEntityFromIdEXT 為這些實體建立 XrSpatialEntityEXT 控制代碼。應用程式會使用 xrCreateSpatialUpdateSnapshotEXT 取得這類實體的更新,並在新建立的 XrSpatialSnapshotEXT 上使用相同的 xrQuerySpatialComponentDataEXT 函式,取得這些實體的最新元件資料。
探索空間實體及查詢元件資料
以下程式碼範例說明如何探索「Foo」功能的空間實體,並查詢其元件資料。
/****************************/
/* Capability definition */
/****************************/
// Foo capability has the following components -
// - XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
#define XR_SPATIAL_CAPABILITY_FOO ((XrSpatialCapabilityEXT)1000740000U)
#define XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_FOO_EXT ((XrStructureType)1000740000U)
// Derives from XrSpatialCapabilityConfigurationBaseHeaderEXT
typedef struct XrSpatialCapabilityConfigurationFooEXT {
XrStructureType type;
const void* XR_MAY_ALIAS next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationFooEXT;
/******************************/
/* End capability definition */
/******************************/
auto waitUntilReady = [](XrFutureEXT future) {
XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
pollInfo.future = future;
do {
// sleep(1);
CHK_XR(xrPollFutureEXT(instance, &pollInfo, &pollResult));
} while (pollResult.state != XR_FUTURE_STATE_READY_EXT);
};
// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{
const std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
};
// Configure Foo capability for the spatial context
XrSpatialCapabilityConfigurationFooEXT fooConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_FOO_EXT};
fooConfig.capability = XR_SPATIAL_CAPABILITY_FOO;
fooConfig.enabledComponentCount = enabledComponents.size();
fooConfig.enabledComponents = enabledComponents.data();
std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&fooConfig));
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
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) {
return;
}
spatialContext = completion.spatialContext;
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
// We want to look for entities that have the following components.
std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT};
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
XrFutureEXT future = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the bounded2d component data
XrSpatialComponentTypeEXT componentToQuery = XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT;
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypes = &componentToQuery;
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
queryResult.entityIdCapacityInput = 0;
queryResult.entityIds = nullptr;
queryResult.entityStateCapacityInput = 0;
queryResult.entityStates = nullptr;
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityStateCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialBounded2DDataEXT> bounded2d(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT boundsList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
boundsList.boundCount = bounded2d.size();
boundsList.bounds = bounded2d.data();
queryResult.next = &boundsList;
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) {
// 2D extents for entity entityIds[i] is bounded2d[i].extents.
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
*reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
// Discover spatial entities for the context that we received the "discovery
// recommended" event for.
discoverSpatialEntities(eventdata.spatialContext, time);
break;
}
}
}
// ...
// Finish frame loop
// ...
}
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
查詢緩衝區資料
下列程式碼範例說明如何取得提供 XrSpatialBufferEXT 的元件資料。
/****************************/
/* Component definition */
/****************************/
// Foo component that provides an XrVector3f buffer
#define XR_SPATIAL_COMPONENT_TYPE_FOO_EXT ((XrSpatialComponentTypeEXT)1000740000U)
#define XR_TYPE_SPATIAL_COMPONENT_FOO_LIST_EXT ((XrStructureType)1000740000U)
// XrSpatialComponentFooListEXT extends XrSpatialComponentDataQueryResultEXT
typedef struct XrSpatialComponentFooListEXT {
XrStructureType type;
void* XR_MAY_ALIAS next;
uint32_t fooCount;
XrSpatialBufferEXT* foo;
} XrSpatialComponentFooListEXT;
/******************************/
/* End Component definition */
/******************************/
// Query for the foo component data
XrSpatialComponentTypeEXT componentToQuery = XR_SPATIAL_COMPONENT_TYPE_FOO_EXT;
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = 1;
queryCond.componentTypes = &componentToQuery;
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
std::vector<XrSpatialBufferEXT> fooBuffers(queryResult.entityIdCountOutput);
XrSpatialComponentFooListEXT fooList{XR_TYPE_SPATIAL_COMPONENT_FOO_LIST_EXT};
fooList.fooCount = fooBuffers.size();
fooList.foo = fooBuffers.data();
queryResult.next = &fooList;
CHK_XR(xrQuerySpatialComponentDataEXT(snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// foo component data for entity entityIds[i]
if (fooBuffers[i].bufferType == XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT) {
XrSpatialBufferGetInfoEXT getInfo{XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT};
getInfo.bufferId = fooBuffers[i].bufferId;
uint32_t bufferCountOutput;
CHK_XR(xrGetSpatialBufferVector3fEXT(snapshot, &getInfo, 0, &bufferCountOutput, nullptr));
std::vector<XrVector3f> vertexBuffer(bufferCountOutput);
CHK_XR(xrGetSpatialBufferVector3fEXT(snapshot, &getInfo, bufferCountOutput, &bufferCountOutput, vertexBuffer.data()));
// XrVertex3f buffer for entity entityIds[i] is now available in vertexBuffer vector.
}
}
擴充功能規範
如果擴充功能定義了新的 XrSpatialComponentTypeEXT,提供空間實體的額外資料,
- 擴充功能必須為該元件定義清單結構,讓應用程式將陣列傳遞至執行階段,並填入符合 xrQuerySpatialComponentDataEXT ::
queryCondition的每個空間實體資料。這類清單結構的範例包括 XrSpatialComponentParentListEXT 和 XrSpatialComponentBounded2DListEXT。如果元件資料大小不固定,且應用程式需要使用雙重呼叫慣用語查詢,則元件資料應為清單結構中的每個可變大小資料提供 XrSpatialBufferEXT,且必須為每個緩衝區指定 XrSpatialBufferTypeEXT。接著,應用程式可以使用元件資料的雙呼叫慣用語中定義的函式,查詢緩衝區資料。這類結構的範例是 XrSpatialMeshDataEXT,其中包含 XrSpatialComponentMesh3DListEXT。 - 擴充功能可以提供結構,讓應用程式可以鏈結至 XrSpatialComponentDataQueryConditionEXT ::
next,為與此元件資料相關的查詢提供額外篩選條件。
- 擴充功能必須為該元件定義清單結構,讓應用程式將陣列傳遞至執行階段,並填入符合 xrQuerySpatialComponentDataEXT ::
擴充功能可以定義擴充 XrSpatialDiscoverySnapshotCreateInfoEXT 的結構,為探索提供額外的篩選器。建立快照的篩選器「不得」影響空間情境的設定,而是用於向執行階段提供提示,說明要將哪些實體和資料納入快照,並由空間情境的目前設定 (以及基礎服務的目前設定) 追蹤。
如果擴充功能定義了新的 XrSpatialCapabilityEXT,
- 也應指定執行階段必須在實體上為該功能提供的 XrSpatialComponentTypeEXT 清單。
- 也必須提供衍生自 XrSpatialCapabilityConfigurationBaseHeaderEXT 的結構,以便設定該功能。
如果擴充功能定義了新的 XrSpatialCapabilityFeatureEXT,則必須定義對應的設定結構,該結構可以鏈結至 XrSpatialCapabilityConfigurationBaseHeaderEXT 的下一個指標,應用程式可以在建立 XrSpatialContextEXT 時使用該結構啟用功能。
定義新 XrSpatialCapabilityEXT 的擴充功能應遵循此範本規格:
- 總覽
- 執行階段支援
- 設定
- 保證元件
- 範例程式碼
定義新 XrSpatialComponentTypeEXT 的擴充功能應遵循此範本規格:
- 元件資料
- 用於查詢資料的元件清單結構
- 設定
編寫為應用程式提供
XrSpatialBufferIdEXT的 API 時,必須搭配 XrSpatialBufferTypeEXT,告知應用程式緩衝區的資料類型,應用程式可以使用適當的xrGetSpatialBuffer*函式擷取緩衝區的實際內容。
語意標籤設計和擴充功能指南
雖然這項擴充功能並未定義任何用於傳達實體語意標籤資訊的元件,但它為定義這類元件的任何擴充功能制定了設計規則和指南。在以下文字中,「應」和「必須」會限制這類功能的作者,而非限制執行階段實作或使用 API 的應用程式。
- 如果擴充功能為任何 XrSpatialCapabilityEXT 定義語意標籤,則應定義新的 XrSpatialComponentTypeEXT,以及含有標籤組合 (「語意標籤組合」) 的新列舉,做為該元件的資料。
- 代表語意標籤集的列舉必須有值,表示實體未歸類到這個集合的任何標籤。這個列舉值的名稱必須包含「UNCATEGORIZED」,例如
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT。這個值會向應用程式指出,執行階段確實能辨識這個實體,但這個實體已歸類到其他語意標籤組合。 - 在 xrEnumerateSpatialCapabilityComponentTypesEXT 中列舉這個新定義的 XrSpatialComponentTypeEXT,表示執行階段支援與該元件類型對應的語意標籤集 (以及該集合中定義的標籤)。
- 應用程式如要探索具有此語意標籤集標籤的實體,可在 XrSpatialCapabilityConfigurationBaseHeaderEXT ::
enabledComponents陣列中加入對應的 XrSpatialComponentTypeEXT,該陣列位於列舉元件類型的功能設定結構中。 - 單一空間實體可能有多個元件,每個元件都會從自己的語意標籤集提供標籤。請參考以下範例,其中包含一些假設的語意標籤集
XrSpatialObjectSemanticLabel,其值可能包括椅子、沙發、桌子等,XrSpatialSofaBrand(值可能為 IKEA、Wayfair 等) 和XrSpatialIkeaSofa(值可能為 IKEA 沙發的特定型號名稱)。在這個情境中,同一個沙發實體具有全部 3 個元件 (來自所有 3 個語意標籤集的標籤),每個元件都會提供不同精細程度的實體資訊。 - 如果擴充功能定義了新的 XrSpatialComponentTypeEXT,提供新的語意標籤集,其中包含多個標籤和
UNCATEGORIZED標籤,則擴充功能應考慮定義 XrSpatialCapabilityFeatureEXT,讓應用程式只啟用該元件類型對應的語意標籤集中定義的部分標籤。這個子集在功能設定的下一個鏈結中提供,可做為執行階段的最佳化提示,讓執行階段只追蹤提供的子集。這類特徵結構的範例如下所示。 - 擴充功能不得為現有的語意標籤集列舉新增標籤。他們必須定義新的列舉,其中包含具有相同語義的等效列舉,以及與其他集合中的值相等的值,以及新加入的列舉。新定義的語意標籤組合規格必須建立新舊標籤組合之間的對應關係。請參閱下方範例。
語意標籤子集的空間特徵定義範例
// New example semantic label set.
typedef enum XrSpatialExampleSemanticLabelEXT {
// ... label values
} XrSpatialExampleSemanticLabelEXT;
/*
typedef enum XrSpatialCapabilityFeatureEXT {
// .. existing values
// new spatial feature value
XR_SPATIAL_CAPABILITY_FEATURE_EXAMPLE_SEMANTIC_LABEL_SUBSET_EXT
// .. existing values
} XrSpatialCapabilityFeatureEXT;
*/
// New spatial feaure configuration structure
typedef struct XrSpatialFeatureExampleSemanticLabelSubsetEXT {
XrStructureType type;
const void* XR_MAY_ALIAS next;
uint32_t semanticLabelCount;
const XrSpatialExampleSemanticLabelEXT* semanticLabels;
} XrSpatialFeatureExampleSemanticLabelSubsetEXT;
空間語意標籤擴充功能範例
typedef enum XrSpatialExamplePlaneSemanticLabelExtensionEXT {
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_FLOOR_EXT = 2,
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_WALL_EXT = 3,
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_CEILING_EXT = 4,
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_TABLE_EXT = 5,
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_DOOR_EXT = 6,
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_WINDOW_EXT = 7,
XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialExamplePlaneSemanticLabelExtensionEXT;
以上述範例來說,擴充功能定義了列舉 XrSpatialExamplePlaneSemanticLabelExtensionEXT,以便使用代表門窗的值擴充現有的 XrSpatialPlaneSemanticLabelEXT。新列舉的規格必須包含下列格式的文字:
For all non-UNCATEGORIZED label enumerants in elink:XrSpatialPlaneSemanticLabelEXT,
the runtime must: return that enumerant if and only if it returns the corresponding
label enumerant from elink:XrSpatialExamplePlaneSemanticLabelExtensionEXT with the same value
i.e.
the ename:XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT value for that entity must:
correspond with the ename:XR_SPATIAL_COMPONENT_TYPE_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_EXT values
according to the following table -
[width="100%",options="header"]
|====
| XrSpatialExamplePlaneSemanticLabelExtensionEXT | XrSpatialPlaneSemanticLabelEXT
| XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_FLOOR_EXT | XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT
| XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_WALL_EXT | XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT
| XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_CEILING_EXT | XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT
| XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_TABLE_EXT | XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT
| XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_DOOR_EXT | XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
| XR_SPATIAL_EXAMPLE_PLANE_SEMANTIC_LABEL_EXTENSION_WINDOW_EXT | XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
|====
新巨集
新底座類型
XrSpatialBufferIdEXTXrSpatialEntityIdEXT
新物件類型
新指令
- xrCreateSpatialContextAsyncEXT
- xrCreateSpatialContextCompleteEXT
- xrCreateSpatialDiscoverySnapshotAsyncEXT
- xrCreateSpatialDiscoverySnapshotCompleteEXT
- xrCreateSpatialEntityFromIdEXT
- xrCreateSpatialUpdateSnapshotEXT
- xrDestroySpatialContextEXT
- xrDestroySpatialEntityEXT
- xrDestroySpatialSnapshotEXT
- xrEnumerateSpatialCapabilitiesEXT
- xrEnumerateSpatialCapabilityComponentTypesEXT
- xrEnumerateSpatialCapabilityFeaturesEXT
- xrGetSpatialBufferFloatEXT
- xrGetSpatialBufferStringEXT
- xrGetSpatialBufferUint16EXT
- xrGetSpatialBufferUint32EXT
- xrGetSpatialBufferUint8EXT
- xrGetSpatialBufferVector2fEXT
- xrGetSpatialBufferVector3fEXT
- xrQuerySpatialComponentDataEXT
新結構
- XrCreateSpatialContextCompletionEXT
- XrCreateSpatialDiscoverySnapshotCompletionEXT
- XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
- XrEventDataSpatialDiscoveryRecommendedEXT
- XrSpatialBounded2DDataEXT
- XrSpatialBufferEXT
- XrSpatialBufferGetInfoEXT
- XrSpatialCapabilityComponentTypesEXT
- XrSpatialCapabilityConfigurationBaseHeaderEXT
- XrSpatialComponentDataQueryConditionEXT
- XrSpatialComponentDataQueryResultEXT
- XrSpatialContextCreateInfoEXT
- XrSpatialDiscoverySnapshotCreateInfoEXT
- XrSpatialEntityFromIdCreateInfoEXT
- XrSpatialMeshDataEXT
- XrSpatialUpdateSnapshotCreateInfoEXT
擴充 XrSpatialDiscoverySnapshotCreateInfoEXT、XrSpatialComponentDataQueryConditionEXT:
新列舉
- XrSpatialBufferTypeEXT
- XrSpatialCapabilityEXT
- XrSpatialCapabilityFeatureEXT
- XrSpatialComponentTypeEXT
- XrSpatialEntityTrackingStateEXT
新列舉常數
XR_EXT_SPATIAL_ENTITY_EXTENSION_NAMEXR_EXT_spatial_entity_SPEC_VERSION擴充 XrObjectType:
XR_OBJECT_TYPE_SPATIAL_CONTEXT_EXTXR_OBJECT_TYPE_SPATIAL_ENTITY_EXTXR_OBJECT_TYPE_SPATIAL_SNAPSHOT_EXT
擴充 XrResult:
XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXTXR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXTXR_ERROR_SPATIAL_COMPONENT_UNSUPPORTED_FOR_CAPABILITY_EXTXR_ERROR_SPATIAL_ENTITY_ID_INVALID_EXT
擴充 XrStructureType:
XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXTXR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXTXR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXTXR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXTXR_TYPE_SPATIAL_BUFFER_GET_INFO_EXTXR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXTXR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXTXR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXTXR_TYPE_SPATIAL_COMPONENT_MESH_3D_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_PARENT_LIST_EXTXR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXTXR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXTXR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXTXR_TYPE_SPATIAL_FILTER_TRACKING_STATE_EXTXR_TYPE_SPATIAL_UPDATE_SNAPSHOT_CREATE_INFO_EXT
問題
單一實體是否一律只衍生自單一功能?
- 已解決
- 答案:否。這完全取決於執行階段,取決於其追蹤功能以及如何呈現偵測到的實體。規格並未規定空間實體的任何特定表示法,但保證特定功能元件會設定最低預期。執行階段「可能」可以合併不同功能偵測到的實體,並將其表示為單一實體,並保證所有有助於識別該實體的功能元件。舉例來說,平面追蹤和物件追蹤功能都能偵測到桌子,平面追蹤功能會提供實體的
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT元件,物件追蹤功能則會提供XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT。某些執行階段可能會將表格提供為 2 個獨立實體,每個實體都有各自的一組保證元件,而某些執行階段可能只會提供 1 個實體來代表表格,並在同一個實體上同時提供XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT和XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT。請注意,指定的空間實體最多只能有一個指定元件類型的元件。因此,如果不同功能產生的元件資料與特定實體衝突,執行階段必須將其表示為 2 個獨立實體。
版本記錄
修訂版本 1,2024-04-12 (Nihav Jain,Google)
- 初始擴充功能說明