XR_EXT_spatial_entity
名稱字串
XR_EXT_spatial_entity
擴充功能類型
執行個體擴充功能
擴充功能註冊編號
741
修訂版本
1
批准狀態
批准
擴充功能和版本依附元件
XR_EXT_future
著作人
Nihav Jain (Google)
Jared Finder (Google)
Natalie Fleury (Meta)
田口雄一 (Meta)
Ron Bessems (Meta)
Yin Li (Microsoft)
Karthik Kadappan (Magic Leap)
Jimmy Alamparambil (ByteDance)
Zhipeng Liu (ByteDance)
Jun Yan (ByteDance)
總覽
這項擴充功能介紹 OpenXR 中的場景理解和空間推理概念與基礎。這項擴充功能會以大致統一的方式,列舉、設定及互動多個相關但不同的功能領域,進而整合這些領域。由於這個擴充功能缺少任何一個功能領域的具體定義,正式規格文字往往有些抽象。本擴充功能規格文字中包含的範例有時會參照即將推出或假設的相關擴充功能中定義的功能,僅供說明用途,並非本質上限制或指定這類額外功能。
這項擴充功能大致可分為以下幾部分:
- 空間實體:這項功能以實體為中心,但實體本身提供的功能極少。
- 空間元件:這些實體會與提供資料和行為的元件建立關聯。
- 空間元件類型:每個空間元件都屬於特定元件類型,任何指定實體最多只能有一個指定元件類型的元件。
- 空間脈絡:所有空間實體互動都會在初始化和設定階段後發生的脈絡中進行。
- 空間功能:空間實體操控功能大致由功能提供。功能是指功能單元,例如 (但不限於) 應用程式定義的錨點、平面偵測或圖片追蹤。每個功能通常會在個別擴充功能中定義 (照常在例項建立時啟用),並在建立時針對特定情境啟用。
- 每項「功能」都與一組「元件類型」相關聯,這些「元件」會出現在該「功能」公開的每個實體上。定義「功能」的擴充功能會指定功能必須具備的「元件類型」 (「保證」),而相同或其他擴充功能「可能」會指定某些潛在實作項目提供的「選用」「元件類型」。任意數量的功能可能會為實體提供特定元件類型的元件,無論是哪個功能產生這些元件,都能以相同方式使用。
- 空間功能:此外,部分功能需要設定,因此會以功能做為參數。
這項擴充功能提供列舉機制,可列舉目前系統支援的每個功能提供的元件,包括必要元件和任何選用 元件。
由於部分實作項目可能需要不同程度的功能參數化,因此這項擴充功能提供一種機制,可列舉與目前系統中指定功能相關聯的支援功能特徵。
這項擴充功能也定義了數個常見的元件,預計會用於各種功能。
空間實體
空間實體是指存在於某個空間的實體,這類實體具有各種相關聯的資料,並以元件的形式整理。可能是下列任一值:
- 實體 (例如牆壁和地板等平面、椅子和書櫃等物體)
- 虛擬 (例如由其他應用程式或使用者放置及分享的內容),
- 應用程式定義 (例如應用程式將某個區域標示為「客廳」或「廚房」,或將某個點標示為電視擺放位置等)
透過動作系統公開的項目 (例如控制器或眼球注視) 不應模擬為空間實體。
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_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 擴充功能新增)
空間功能和設定
空間功能可定義執行階段的能力,以探索具有一組保證元件的實體。應用程式會在建立 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 建立 XrSpatialContextEXT 時,判斷 capability 的有效設定。
如果 xrEnumerateSpatialCapabilitiesEXT 未列舉 capability,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT。
執行階段不得列舉擴充功能未針對 instance 啟用的空間元件類型。
有效使用 (隱含)
- 呼叫 xrEnumerateSpatialCapabilityComponentTypesEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用。 -
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大小,請參閱「緩衝區大小參數」一節。
有效使用 (隱含)
- 使用 XrSpatialCapabilityComponentTypesEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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。空間脈絡控制代碼至少需要一項功能。
如果 xrEnumerateSpatialCapabilitiesEXT 未列舉 XrSpatialContextCreateInfoEXT :: capabilityConfigs 陣列中的任何功能,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT。
如果 XrSpatialContextCreateInfoEXT :: capabilityConfigs 中的任何 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponentCount 為 0,執行階段必須傳回 XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT。如未提供要為功能啟用的元件類型清單,功能設定就不完整。
如果 xrEnumerateSpatialCapabilityComponentTypesEXT 中未列舉 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 中列出的任何元件類型,執行階段必須傳回 XR_ERROR_SPATIAL_COMPONENT_UNSUPPORTED_FOR_CAPABILITY_EXT。capability
如果下一個 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,當這個函式的未來狀態為 READY 時即可使用,輸出內容會由該函式填入完成結構 XrCreateSpatialContextCompletionEXT 中。
有效使用 (隱含)
- 呼叫 xrCreateSpatialContextAsyncEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
sessionmust be a valid XrSession handle -
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_FAILURE
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 控制代碼的資訊。
有效使用 (隱含)
- 使用 XrSpatialContextCreateInfoEXT 前,必須先啟用
XR_EXT_spatial_entity擴充功能 -
type必須為XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT -
nextmust 為NULL,或指向結構體鏈結中下一個結構體的有效指標。另請參閱:XrSpatialContextPersistenceConfigEXT -
capabilityConfigs必須是指向以capabilityConfigCount有效 XrSpatialCapabilityConfigurationBaseHeaderEXT 為基礎的結構體陣列指標。另請參閱:XrSpatialCapabilityConfigurationAnchorEXT、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。
有效使用 (隱含)
- 使用 XrSpatialCapabilityConfigurationBaseHeaderEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
next必須是NULL,或是結構體鏈結中下一個結構體的有效指標 -
capability必須是有效的 XrSpatialCapabilityEXT 值 -
enabledComponents必須是指向enabledComponentCount個有效 XrSpatialComponentTypeEXT 值的陣列的指標 -
enabledComponentCount參數必須大於0
xrCreateSpatialContextCompleteEXT 函式定義如下:
XrResult xrCreateSpatialContextCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialContextCompletionEXT* completion);
參數說明
- 是先前傳遞至 xrCreateSpatialContextAsyncEXT 的 XrSession:
session。session - 是從 xrCreateSpatialContextAsyncEXT 收到的
XrFutureEXT。future completion是 XrCreateSpatialContextCompletionEXT 的指標。
xrCreateSpatialContextCompleteEXT 會完成 xrCreateSpatialContextAsyncEXT 啟動的非同步作業。如果 future 未處於就緒狀態,執行階段必須傳回 XR_ERROR_FUTURE_PENDING_EXT。如果 future 已完成或取消,執行階段必須傳回 XR_ERROR_FUTURE_INVALID_EXT。
有效使用 (隱含)
- 呼叫 xrCreateSpatialContextCompleteEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
sessionmust be a valid XrSession handle -
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 中的資料和設定建立的 XrSpatialContextEXT ::createInfo。
日後推出的退貨代碼
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 相同的空間功能建立,這項呼叫會建議執行階段停用這些功能所需的追蹤服務,以節省系統資源。
有效使用 (隱含)
- 呼叫 xrDestroySpatialContextEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
spatialContext必須是有效的 XrSpatialContextEXT 控制代碼
執行緒安全
- 對
spatialContext和任何子項控制代碼的存取權必須從外部同步處理
傳回代碼
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
空間實體表示法
空間實體 ID
XR_DEFINE_ATOM(XrSpatialEntityIdEXT)
XrSpatialEntityIdEXT 用於表示執行階段在使用者空間環境中探索到的任何實體。XrSpatialEntityIdEXT 對於發現該 XrSpatialEntityIdEXT 的 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 控制代碼 -
createInfomust 是指向有效 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。
有效使用 (隱含)
- 使用 XrSpatialEntityFromIdCreateInfoEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
type必須為XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT -
next必須是NULL,或是結構體鏈結中下一個結構體的有效指標
銷毀空間實體控制代碼
xrDestroySpatialEntityEXT 函式的定義如下:
XrResult xrDestroySpatialEntityEXT(
XrSpatialEntityEXT spatialEntity);
參數說明
spatialEntity是 xrCreateSpatialEntityFromIdEXT 等函式先前建立的 XrSpatialEntityEXT 控制代碼。
應用程式可以使用 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 中提供。此外,執行階段必須只在快照中納入這些元件的資料。
如果傳遞至 XrSpatialContextCreateInfoEXT :: capabilityConfigs 的空間功能未啟用 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes 中的任何 XrSpatialComponentTypeEXT,則執行階段「必須」傳回 XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT,才能建立 spatialContext。
如果應用程式未在 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes 中提供空間元件類型清單,執行階段必須在快照中納入所有空間實體,這些實體具有 XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents 中列舉的元件組合,適用於為 spatialContext 設定的功能。執行階段必須包含為 spatialContext 設定的功能中,所有已啟用元件的資料。
如果在 future 完成前將 XrEventDataReferenceSpaceChangePending 加入佇列,且 XrEventDataReferenceSpaceChangePending :: poseValid 為 false,則執行階段可能會建立不含任何實體的 XrSpatialSnapshotEXT,或將 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace 中不再可定位的實體 XrSpatialEntityTrackingStateEXT 設為 XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT 或 XR_SPATIAL_ENTITY_TRACKING_STATE_STOPPED_EXT。time執行階段不得因 XrEventDataReferenceSpaceChangePending 而將 XrCreateSpatialContextCompletionEXT :: futureResult 設為錯誤代碼。
有效使用 (隱含)
- 呼叫 xrCreateSpatialDiscoverySnapshotAsyncEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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 控制代碼時的資訊,用於探索空間實體。
有效使用 (隱含)
- 使用 XrSpatialDiscoverySnapshotCreateInfoEXT 前,必須先啟用
XR_EXT_spatial_entity擴充功能 -
type必須為XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT -
nextmust 為NULL,或指向結構體鏈結中下一個結構體的有效指標。另請參閱:XrSpatialBoundsBoxfANDROID、XrSpatialBoundsFrustumfANDROID、XrSpatialBoundsSpherefANDROID、XrSpatialDiscoveryPersistenceUuidFilterEXT、XrSpatialDiscoveryRoomBoundaryFilterANDROIDSYS、XrSpatialDiscoveryUniqueEntitiesFilterANDROID、XrSpatialFilterTrackingStateEXT、XrSpatialRaycastInfoANDROID - 如果
componentTypeCount不是0,componentTypes必須是指向componentTypeCount個有效 XrSpatialComponentTypeEXT 值的陣列指標
xrCreateSpatialDiscoverySnapshotCompleteEXT 函式定義如下:
XrResult xrCreateSpatialDiscoverySnapshotCompleteEXT(
XrSpatialContextEXT spatialContext,
const XrCreateSpatialDiscoverySnapshotCompletionInfoEXT* createSnapshotCompletionInfo,
XrCreateSpatialDiscoverySnapshotCompletionEXT* completion);
參數說明
- 是先前傳遞至 xrCreateSpatialDiscoverySnapshotAsyncEXT 的 XrSpatialContextEXT:
spatialContext。spatialContext createSnapshotCompletionInfo是 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT 的指標,可提供探索快照建立要求完成的相關資訊。completion是 XrCreateSpatialDiscoverySnapshotCompletionEXT 的指標。
xrCreateSpatialDiscoverySnapshotCompleteEXT 會完成 xrCreateSpatialDiscoverySnapshotAsyncEXT 啟動的非同步作業。如果 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: future 未處於就緒狀態,執行階段必須傳回 XR_ERROR_FUTURE_PENDING_EXT。如果 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: future 已完成或取消,執行階段必須傳回 XR_ERROR_FUTURE_INVALID_EXT。
有效使用 (隱含)
- 呼叫 xrCreateSpatialDiscoverySnapshotCompleteEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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是所有探索到的 XrSpatialSnapshotEXT 位置所在位置的XrTime。future是從 xrCreateSpatialDiscoverySnapshotAsyncEXT 收到的XrFutureEXT
建立的快照中包含的各種元件資料位置,會以 baseSpace 表示,位於 time。
有效使用 (隱含)
- 使用 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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
有效使用 (隱含)
- 使用 XrCreateSpatialDiscoverySnapshotCompletionEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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);
參數說明
- 是先前由 xrCreateSpatialDiscoverySnapshotCompleteEXT 或 xrCreateSpatialUpdateSnapshotEXT 提供的 XrSpatialSnapshotEXT。
snapshot 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 已過,應用程式可能會使用事件資料相應調整姿勢。
執行階段必須只使用具有 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中指定的所有元件的實體,填入 XrSpatialComponentDataQueryResultEXT :: entityIds。如果 XrSpatialComponentDataQueryConditionEXT :: componentTypeCount 為 0,執行階段「必須」在快照中填入所有實體 (及其追蹤狀態)。queryResult如果將額外的查詢條件新增至 XrSpatialComponentDataQueryConditionEXT :: next,執行階段必須將這些條件視為與元件類型可用性「AND」運算,也就是說,執行階段必須只使用符合所有提供條件的實體,填入 XrSpatialComponentDataQueryResultEXT ::entityIds。執行階段必須按照 XrSpatialComponentDataQueryResultEXT :: entityIds i 中的實體順序,在清單結構中填入元件資料,也就是清單結構陣列中特定索引的元件資料必須對應至相同索引的實體。
如果實體的追蹤狀態不是 XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT,執行階段「不得」變更 XrSpatialComponentDataQueryResultEXT 所附加清單結構中,與該實體對應的索引資料。
有效使用 (隱含)
- 呼叫 xrQuerySpatialComponentDataEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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
否
否
否
否
是
是
是
是
否
圖 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
實體 ID #1 的資料
實體資料...
實體 ID #2 的資料
實體資料...
實體 ID #5 的資料
實體資料...
entityIds
entityIds
下一個
下一個
XrSpatialComponent DataQueryResultEXT
XrSpatialComponent Dat...
界限
界限
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
實體 ID #3 的資料
實體資料...
實體 ID #4 的資料
實體資料...
Mesh3D
Mesh3D
實體 ID #3 的資料
實體資料...
實體 ID #4 的資料
實體資料...
entityIds
entityIds
下一個
下一個
XrSpatialComponent DataQueryResultEXT
XrSpatialComponent Da...
界限
界限
下一個
下一個
XrSpatialComponent Bounded3DListEXT
XrSpatialComponent Bo...
XrSpatialComponent Mesh3DListEXT
XrSpatialComponent Me...
網格
圖 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 -
nextmust 為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是XrSpatialEntityIdEXT中的entityIds數量,或在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 -
nextmust 為NULL,或指向結構體鏈結中下一個結構體的有效指標。另請參閱:XrSpatialComponentAnchorListEXT、XrSpatialComponentAnnotationQuadListANDROID、XrSpatialComponentBounded2DListEXT、XrSpatialComponentBounded3DListEXT、XrSpatialComponentConfidenceListANDROIDSYS、XrSpatialComponentImage2DListEXT、XrSpatialComponentKeyboardSemanticLabelListEXT、XrSpatialComponentMarkerListEXT、XrSpatialComponentMaterialTypeListANDROIDSYS、XrSpatialComponentMesh2DListEXT、XrSpatialComponentMesh3DListEXT、XrSpatialComponentMesh3DNormalsListEXT、XrSpatialComponentMesh3DTriangleSemanticLabelsListEXT、XrSpatialComponentMesh3DVertexSemanticLabelsListEXT、XrSpatialComponentMouseSemanticLabelListEXT、XrSpatialComponentObjectSemanticLabelListANDROID、XrSpatialComponentObjectSemanticLabelListEXT、XrSpatialComponentOccupancyGridListANDROIDX1、XrSpatialComponentParentListEXT、XrSpatialComponentPersistenceListEXT、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 不同,表示該元件的資料可能已變更。
有效使用 (隱含)
- 使用 XrSpatialBufferEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
bufferType必須是有效的 XrSpatialBufferTypeEXT 值
XR_DEFINE_ATOM(XrSpatialBufferIdEXT)
XrSpatialBufferIdEXT 用於表示空間元件的任何大小可變資料。
執行階段必須將 XrSpatialBufferIdEXT 及其資料保留在記憶體中,至少要保留到包含該資料的 XrSpatialSnapshotEXT 生命週期結束為止。為了傳回相同的 ID,做為應用程式稍後建立的快照一部分,執行階段可能會將 XrSpatialBufferIdEXT 及其資料保留在記憶體中,時間長度超出 XrSpatialSnapshotEXT 的生命週期。對於相同的 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。XrSpatialBufferIdEXTcan 可傳遞至 xrGetSpatialBufferStringEXT,以擷取字串緩衝區。XR_SPATIAL_BUFFER_TYPE_UINT8_EXT。XrSpatialBufferIdEXTcan 可傳遞至 xrGetSpatialBufferUint8EXT,以擷取uint8_t緩衝區。XR_SPATIAL_BUFFER_TYPE_UINT16_EXT。XrSpatialBufferIdEXTcan 傳遞至 xrGetSpatialBufferUint16EXT,以擷取uint16_t緩衝區。XR_SPATIAL_BUFFER_TYPE_UINT32_EXT。XrSpatialBufferIdEXTcan 可傳遞至 xrGetSpatialBufferUint32EXT,以擷取uint32_t緩衝區。XR_SPATIAL_BUFFER_TYPE_FLOAT_EXT。XrSpatialBufferIdEXTcan 可傳遞至 xrGetSpatialBufferFloatEXT,以擷取float緩衝區。XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT。XrSpatialBufferIdEXTcan 傳遞至 xrGetSpatialBufferVector2fEXT,即可擷取 XrVector2f 緩衝區。XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT。XrSpatialBufferIdEXTcan 可傳遞至 xrGetSpatialBufferVector3fEXT,以擷取 XrVector3f 緩衝區。
xrGetSpatialBufferStringEXT 函式定義如下:
XrResult xrGetSpatialBufferStringEXT(
XrSpatialSnapshotEXT snapshot,
const XrSpatialBufferGetInfoEXT* info,
uint32_t bufferCapacityInput,
uint32_t* bufferCountOutput,
char* buffer);
參數說明
- 是 XrSpatialSnapshotEXT 的控制代碼。
snapshot info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 (表示要求擷取必要容量)。bufferCountOutput是字元數,或在bufferCapacityInput不足時的必要容量。buffer是char的陣列。如果bufferCapacityInput為 0,則 可以是NULL。- 如要詳細瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 是 XR_SPATIAL_BUFFER_TYPE_STRING_EXT,方法是使用 xrGetSpatialBufferStringEXT。
如果 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必須是指向bufferCapacityInputchar 值陣列的指標
傳回代碼
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);
參數說明
- 是 XrSpatialSnapshotEXT 的控制代碼。
snapshot info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 (表示要求擷取必要容量)。bufferCountOutput是buffer陣列中的元素數量,或在bufferCapacityInput不足時的必要容量。buffer是uint8_t的陣列。如果bufferCapacityInput為 0,則 可以是NULL。- 如要詳細瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 是 XR_SPATIAL_BUFFER_TYPE_UINT8_EXT 使用 xrGetSpatialBufferUint8EXT。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_UINT8_EXT,則執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效使用 (隱含)
- 呼叫 xrGetSpatialBufferUint8EXT 前,
XR_EXT_spatial_entity擴充功能必須啟用。 -
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);
參數說明
- 是 XrSpatialSnapshotEXT 的控制代碼。
snapshot info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 (表示要求擷取必要容量)。bufferCountOutput是buffer陣列中的元素數量,或在bufferCapacityInput不足時的必要容量。buffer是uint16_t的陣列。如果bufferCapacityInput為 0,則 可以是NULL。- 如要詳細瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 是 XR_SPATIAL_BUFFER_TYPE_UINT16_EXT,方法是使用 xrGetSpatialBufferUint16EXT。
如果 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);
參數說明
- 是 XrSpatialSnapshotEXT 的控制代碼。
snapshot info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 (表示要求擷取必要容量)。bufferCountOutput是buffer陣列中的元素數量,或在bufferCapacityInput不足時的必要容量。buffer是uint32_t的陣列。如果bufferCapacityInput為 0,則 可以是NULL。- 如要詳細瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 是 XR_SPATIAL_BUFFER_TYPE_UINT32_EXT,方法是使用 xrGetSpatialBufferUint32EXT。
如果 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大小,請參閱「緩衝區大小參數」一節。
應用程式可以取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 是使用 XR_SPATIAL_BUFFER_TYPE_FLOAT_EXT 透過 xrGetSpatialBufferFloatEXT 取得。
如果 XrSpatialBufferGetInfoEXT :: bufferId 的 XrSpatialBufferTypeEXT 不是 XR_SPATIAL_BUFFER_TYPE_FLOAT_EXT,則執行階段必須傳回 XR_ERROR_VALIDATION_FAILURE。
如果 XrSpatialBufferGetInfoEXT :: bufferId 不屬於 snapshot,執行階段必須傳回 XR_ERROR_SPATIAL_BUFFER_ID_INVALID_EXT。
有效使用 (隱含)
- 呼叫 xrGetSpatialBufferFloatEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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);
參數說明
- 是 XrSpatialSnapshotEXT 的控制代碼。
snapshot info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 (表示要求擷取必要容量)。bufferCountOutput是buffer陣列中的元素數量,或在bufferCapacityInput不足時的必要容量。buffer是 XrVector2f 的陣列。如果bufferCapacityInput為 0,則 可以是NULL。- 如要詳細瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 是 XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT,方法是使用 xrGetSpatialBufferVector2fEXT。
如果 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必須是指向bufferCapacityInput個 XrVector2f 結構體的陣列指標
傳回代碼
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);
參數說明
- 是 XrSpatialSnapshotEXT 的控制代碼。
snapshot info包含要查詢的緩衝區資訊。bufferCapacityInput是陣列的容量,或 0 (表示要求擷取必要容量)。bufferCountOutput是buffer陣列中的元素數量,或在bufferCapacityInput不足時的必要容量。buffer是 XrVector3f 的陣列。如果bufferCapacityInput為 0,則 可以是NULL。- 如要詳細瞭解如何擷取必要的
buffer大小,請參閱「緩衝區大小參數」一節。
應用程式可以取得元件提供的 XrSpatialBufferEXT 資料,其中 XrSpatialBufferEXT :: bufferType 是 XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT,方法是使用 xrGetSpatialBufferVector3fEXT。
如果 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必須是指向bufferCapacityInput個 XrVector3f 結構體的陣列指標
傳回代碼
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,用於擷取資料。
有效使用 (隱含)
- 使用 XrSpatialBufferGetInfoEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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 的指標。- 是指向結果 XrSpatialSnapshotEXT 的指標。
snapshot
應用程式可以使用 xrCreateSpatialUpdateSnapshotEXT 建立快照,並取得執行階段所知的特定實體最新元件資料。應用程式可以在建立快照時,提供 XrSpatialEntityEXT 控制代碼和感興趣的元件類型。
應用程式可以使用 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 篩選出資料必須納入快照的元件清單。如果應用程式在 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中提供有效的空間元件類型清單,則執行階段必須只在快照中納入至少有一個元件的空間實體,而這些元件是在 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中提供。此外,執行階段「必須」只在快照中納入這些元件的資料。
如果傳遞至 XrSpatialContextCreateInfoEXT :: capabilityConfigs 的空間功能未啟用 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中的任何 XrSpatialComponentTypeEXT,則執行階段必須傳回 XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT (建立 spatialContext 時)。
如果應用程式未在 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes 中提供空間元件類型清單,則執行階段必須在快照中納入 XrSpatialUpdateSnapshotCreateInfoEXT :: entities 中列出的所有空間實體,且必須納入為 spatialContext 設定的功能中所有已啟用元件的資料。
執行階段不得包含 XrSpatialUpdateSnapshotCreateInfoEXT :: entities 中 snapshot 未列出的空間實體。
應用程式可以建立任意數量的快照,但必須留意為每個新快照分配的記憶體,並在不再需要快照時必須刪除快照。
有效使用 (隱含)
- 呼叫 xrCreateSpatialUpdateSnapshotEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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是更新 XrSpatialSnapshotEXT 所有位置的XrTime。
有效使用 (隱含)
- 使用 XrSpatialUpdateSnapshotCreateInfoEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
type必須為XR_TYPE_SPATIAL_UPDATE_SNAPSHOT_CREATE_INFO_EXT -
next必須是NULL,或是結構體鏈結中下一個結構體的有效指標 -
entities必須是指向有效entityCountXrSpatialEntityEXT 控制代碼陣列的指標 - 如果
componentTypeCount不是0,componentTypes必須是指向componentTypeCount個有效 XrSpatialComponentTypeEXT 值的陣列指標 -
baseSpace必須是有效的 XrSpace 控制代碼 -
entityCount參數必須大於0 -
baseSpace和entities的元素必須已從相同的 XrSession 建立、分配或擷取
銷毀快照
xrDestroySpatialSnapshotEXT 函式定義如下:
XrResult xrDestroySpatialSnapshotEXT(
XrSpatialSnapshotEXT snapshot);
參數說明
- 是先前由 xrCreateSpatialDiscoverySnapshotCompleteEXT 或 xrCreateSpatialUpdateSnapshotEXT 提供的 XrSpatialSnapshotEXT。
snapshot
應用程式「可以」呼叫 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是沿著 x 軸 (extents.width)、y 軸 (extents.height) 的有界 2D 元件範圍,以center為中心。
extents 的 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT 是指實體在平面座標系統的 x-y 平面中的大小。位置為 {0, 0, 0}、旋轉為 {0, 0, 0, 1} (無旋轉) 且範圍為 {1, 1} 的平面,是指以 {0, 0, 0} 為中心、1 公尺 x 1 公尺的平面,且正面法線向量指向元件空間中的 +Z 方向。
X X Y Y Z Z Height Height Y Y Z Z X X Vertical plane Vertical plane Horizontal Plane Horizontal Plane Width Width Width Width Height Height
圖 24. Bounded2D 元件座標系統
注意事項
OpenXR 使用 X-Y 平面,+Z 為平面法線,但其他 API 可能使用 X-Z 平面,+Y 為平面法線。X-Y 平面可以透過繞 +X 軸旋轉 -π/2 弧度,轉換為 X-Z 平面。
有效使用 (隱含)
- 使用 XrSpatialBounded2DDataEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用
查詢資料的元件清單結構
XrSpatialComponentBounded2DListEXT 結構體的定義如下:
typedef struct XrSpatialComponentBounded2DListEXT {
XrStructureType type;
void* next;
uint32_t boundCount;
XrSpatialBounded2DDataEXT* bounds;
} XrSpatialComponentBounded2DListEXT;
成員說明
type是這個結構的 XrStructureType。next是NULL,或是指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。boundCount是uint32_t,說明bounds陣列中的元素數量。- 是 XrSpatialBounded2DDataEXT 的陣列。
bounds
如果 XrSpatialComponentBounded2DListEXT 位於 XrSpatialComponentDataQueryResultEXT 的下一個鏈結中,但 XrSpatialComponentDataQueryConditionEXT ::componentTypeCount 不為零,且 XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT 不包含在 XrSpatialComponentDataQueryConditionEXT :: componentTypes 中,則執行階段「必須」從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_VALIDATION_FAILURE。next
如果 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。
有效使用 (隱含)
- 使用 XrSpatialComponentBounded2DListEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用。 -
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 :: baseSpace 的 XrSpatialUpdateSnapshotCreateInfoEXT :: time 中提供 XrBoxf :: center。
有效使用 (隱含)
- 使用 XrSpatialComponentBounded3DListEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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。
有效使用 (隱含)
- 使用 XrSpatialMeshDataEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用 -
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 的下一個鏈結中,但 XrSpatialComponentDataQueryConditionEXT ::componentTypeCount 不為零,且 XR_SPATIAL_COMPONENT_TYPE_MESH_3D_EXT 未納入 XrSpatialComponentDataQueryConditionEXT :: componentTypes,則執行階段「必須」從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_VALIDATION_FAILURE。next
如果 meshCount 小於 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput,執行階段必須從 xrQuerySpatialComponentDataEXT 傳回 XR_ERROR_SIZE_INSUFFICIENT。
在 meshes 陣列中,由執行階段填入的 XrSpatialMeshDataEXT,XrSpatialBufferEXT :: bufferType (適用於 XrSpatialMeshDataEXT :: vertexBuffer) 必須為 XR_SPATIAL_BUFFER_TYPE_VECTOR3F_EXT,而 XrSpatialBufferEXT :: bufferType (適用於 XrSpatialMeshDataEXT :: indexBuffer) 必須為 XR_SPATIAL_BUFFER_TYPE_UINT32_EXT。
有效使用 (隱含)
- 使用 XrSpatialComponentMesh3DListEXT 前,
XR_EXT_spatial_entity擴充功能必須啟用。 -
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,表示執行階段支援與該元件類型對應的語意標籤集 (以及該集合中定義的標籤)。
- 應用程式會在元件類型列舉的元件功能設定結構體中,加入對應的 XrSpatialComponentTypeEXT,藉此表示希望探索具有屬於這個語意標籤集的標籤的實體。XrSpatialCapabilityConfigurationBaseHeaderEXT ::
enabledComponents陣列。 - 單一空間實體可能有多個元件,每個元件都會從自己的語意標籤集提供標籤。請參考以下範例,其中包含一些假設的語意標籤集 -
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 (Google 的 Nihav Jain)
- 擴充功能初始說明