XR_EXT_spatial_object_tracking
이름 문자열
XR_EXT_spatial_object_tracking
확장 프로그램 유형
인스턴스 확장 프로그램
등록된 내선 번호
745
버전
1
승인 상태
비준되지 않음
확장 프로그램 및 버전 종속 항목
XR_EXT_spatial_entity
IP 상태
알려진 IP 소유권 주장이 없습니다.
도움을 주신 분들
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Andy Biar, Unity Technologies
Rebecca Nordhauser, Unity Technologies
개요
이 확장 프로그램은 XR_EXT_spatial_entity를 기반으로 하며 애플리케이션의 입력 데이터 세트 없이 사전 정의된 객체 집합을 추적하는 공간 기능을 정의합니다.
런타임 지원
런타임이 객체 추적을 지원하는 경우 xrEnumerateSpatialCapabilitiesEXT에서 XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT를 열거하여 이를 나타내야 합니다(must).
구성
XrSpatialCapabilityConfigurationObjectTrackingEXT 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialCapabilityConfigurationObjectTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationObjectTrackingEXT;
회원 설명
type는 이 구조의 XrStructureType입니다.next는NULL또는 구조 체인의 다음 구조에 대한 포인터입니다.capability은 XrSpatialCapabilityEXT이며XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT여야 합니다.enabledComponentCount은enabledComponents배열의 요소 수를 설명하는uint32_t입니다.enabledComponents는 XrSpatialComponentTypeEXT 배열의 포인터입니다.
애플리케이션은 XrSpatialContextCreateInfoEXT :: capabilityConfigs의 XrSpatialCapabilityConfigurationObjectTrackingEXT 구조에 포인터를 추가하여 XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT 공간 기능을 사용 설정할 수 있습니다.
capability가 XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT가 아닌 경우 런타임은 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).
올바른 사용 (암시적)
-
XR_EXT_spatial_object_tracking확장 프로그램은 XrSpatialCapabilityConfigurationObjectTrackingEXT를 사용하기 전에 사용 설정해야 합니다. -
type은(는)XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT여야 합니다. -
next는NULL또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다. 참고: XrSpatialFeatureObjectSemanticLabelSubsetEXT -
capability는 유효한 XrSpatialCapabilityEXT 값이어야 합니다. -
enabledComponents는 유효한 XrSpatialComponentTypeEXT 값enabledComponentCount개의 배열에 대한 포인터여야 합니다. -
enabledComponentCount매개변수는0보다 커야 합니다.
보장 구성요소
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT를 지원하는 런타임은 이 기능으로 검색된 항목의 보장된 구성요소로 다음 공간 구성요소를 지원해야 하며(must) xrEnumerateSpatialCapabilityComponentTypesEXT에서 열거해야 합니다(must).
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT- 추적된 객체에 대한 시맨틱 라벨 집합을 제공하는 구성요소 유형이 하나 이상 있어야 합니다. 객체 추적 기능은 시맨틱 라벨 구성요소가 없으면 의미가 없습니다. 이 확장 프로그램은 런타임에서 지원할 수 있는 시맨틱 라벨 구성요소로
XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT및XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT를 정의하지만, 다른 확장 프로그램은 추적된 객체를 설명하는 다양한 클래스의 시맨틱 라벨을 제공하기 위해 새로운 구성요소 유형을 정의할 수 있습니다. 시맨틱 라벨 세트 및 구성요소 유형 디자인에 관한 자세한 내용은 [ext_spatial_semantic_labels_guidelines]을 참고하세요. 런타임은 객체 추적 기능에 대해XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT또는XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT를 지원하지 않을 수 있지만(may) 시맨틱 라벨을 제공하는 구성요소 유형을 하나 이상 지원해야 합니다(must).
제한된 3D 구성요소
경계가 지정된 3D 구성요소는 해당 구성요소가 있는 항목이 나타내는 객체의 중심과 범위를 제공합니다. 자세한 내용은 제한된 3D를 참고하세요.
선택적 구성요소
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT를 지원하는 런타임은 보장된 구성요소 섹션에 나열된 구성요소 외에도 공간 구성요소를 지원할 수 있습니다(may). 애플리케이션은 xrEnumerateSpatialCapabilityComponentTypesEXT를 사용하여 런타임에서 지원하는 전체 구성요소 목록을 가져올 수 있으며, 공간 컨텍스트를 만들 때 관심 있는 구성요소를 구성할 수 있습니다.
객체 시맨틱 라벨
구성요소 데이터
typedef enum XrSpatialObjectSemanticLabelEXT {
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT = 2,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT = 3,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT = 4,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT = 5,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT = 6,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT = 7,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT = 8,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT = 9,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT = 10,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialObjectSemanticLabelEXT;
XrSpatialObjectSemanticLabelEXT 열거형은 객체의 시맨틱 라벨 집합을 설명합니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT 라벨이 있는 항목의 경우 경계가 지정된 3D 구성요소의 +Z축이 화면의 표면 법선과 대략 일치해야 합니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT 라벨이 있는 항목의 경우 경계가 있는 3D 구성요소의 +Z축이 예술품이 발견된 벽의 표면 법선과 일치해야 합니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT 라벨이 있는 항목의 경우 경계가 있는 3D 구성요소의 +Z축이 테이블의 표면 법선과 일치해야 합니다.
XrSpatialObjectSemanticLabelEXT의 다른 모든 라벨의 경우 애플리케이션은 항목의 제한된 3D 구성요소에서 제공하는 XrBoxf :: center :: orientation가 해당 객체의 물리적 속성과 어떻게 정렬되는지에 관해 어떠한 가정도 해서는 안 됩니다(must).
열거형 값의 의미는 다음과 같습니다.
enum 설명
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT
런타임에서 이 항목을 분류할 수 없습니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT
항목은 소파입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT
항목은 침대입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT
항목은 의자입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT
항목은 테이블입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT
항목은 램프입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT
항목이 식물입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT
항목이 모니터나 TV와 같은 디스플레이 화면입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT
항목은 벽화입니다.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT
항목은 캐비닛입니다.
데이터를 쿼리하는 구성요소 목록 구조
XrSpatialComponentObjectSemanticLabelListEXT 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialComponentObjectSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialObjectSemanticLabelEXT* semanticLabels;
} XrSpatialComponentObjectSemanticLabelListEXT;
회원 설명
type는 이 구조의 XrStructureType입니다.next는NULL또는 구조 체인의 다음 구조에 대한 포인터입니다. 핵심 OpenXR 또는 이 확장 프로그램에는 이러한 구조가 정의되어 있지 않습니다.semanticLabelCount은semanticLabels배열의 요소 수를 설명하는uint32_t입니다.semanticLabels는 XrSpatialObjectSemanticLabelEXT의 배열입니다.
XrSpatialSnapshotEXT에서 공간 항목의 객체 시맨틱 라벨 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT를 포함하고 XrSpatialComponentDataQueryResultEXT :: next 체인에 XrSpatialComponentObjectSemanticLabelListEXT를 추가합니다.
XrSpatialComponentObjectSemanticLabelListEXT가 XrSpatialComponentDataQueryResultEXT :: next 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT가 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(MUST).
semanticLabelCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다(must).
올바른 사용 (암시적)
-
XR_EXT_spatial_object_tracking확장 프로그램은 XrSpatialComponentObjectSemanticLabelListEXT를 사용하기 전에 사용 설정해야 합니다. -
type은(는)XR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT여야 합니다. -
next는NULL또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다. -
semanticLabels:semanticLabelCountXrSpatialObjectSemanticLabelEXT 값 배열의 포인터여야 함 -
semanticLabelCount매개변수는0보다 커야 합니다.
구성
일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT가 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 수 있습니다.
이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함하기 위해 특별한 구성이 필요하지 않지만 애플리케이션에서 제공할 수 있는 선택적 구성을 제공합니다.
XrSpatialFeatureObjectSemanticLabelSubsetEXT 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialFeatureObjectSemanticLabelSubsetEXT {
XrStructureType type;
const void* next;
uint32_t semanticLabelCount;
const XrSpatialObjectSemanticLabelEXT* semanticLabels;
} XrSpatialFeatureObjectSemanticLabelSubsetEXT;
회원 설명
type는 이 구조의 XrStructureType입니다.next는NULL또는 구조 체인의 다음 구조에 대한 포인터입니다.semanticLabelCount은semanticLabels배열의 요소 수를 설명하는uint32_t입니다.semanticLabels는 XrSpatialObjectSemanticLabelEXT의 배열입니다.
런타임이 특정 기능의 xrEnumerateSpatialCapabilityComponentTypesEXT에서 XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT를 열거하는 경우 동일한 기능의 xrEnumerateSpatialCapabilityFeaturesEXT에서 XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT도 열거해야 합니다. 애플리케이션이 기능을 구성할 때 XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT를 사용 설정하는 경우 XrSpatialFeatureObjectSemanticLabelSubsetEXT를 해당 기능의 해당 구성 구조에 연결하여 XrSpatialObjectSemanticLabelEXT에 정의된 라벨의 하위 집합을 런타임에 제공할 수 있습니다. 런타임은 이 라벨 하위 집합을 사용하여 추적 파이프라인을 최적화할 수 있습니다.
semanticLabels에 XrSpatialObjectSemanticLabelEXT에 정의되지 않은 라벨이 포함되어 있거나 semanticLabels에 XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT이 포함된 경우 런타임은 xrCreateSpatialContextAsyncEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).
애플리케이션이 semanticLabels에 유효한 라벨 목록을 제공하지만 XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT가 XrSpatialFeatureObjectSemanticLabelSubsetEXT가 연결된 구성 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 배열에 포함되지 않은 경우 런타임은 xrCreateSpatialContextAsyncEXT에서 XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT를 반환해야 합니다(must).
애플리케이션이 유효한 XrSpatialFeatureObjectSemanticLabelSubsetEXT로 기능을 구성하는 경우 런타임은 구성된 공간 컨텍스트에 대해 생성된 검색 스냅샷에 semanticLabels에 나열되지 않은 시맨틱 라벨이 있는 항목을 포함해서는 안 됩니다.
올바른 사용 (암시적)
-
XR_EXT_spatial_object_tracking확장 프로그램은 XrSpatialFeatureObjectSemanticLabelSubsetEXT를 사용하기 전에 사용 설정해야 합니다. -
type은(는)XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT여야 합니다. -
next는NULL또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다. -
semanticLabels는 유효한 XrSpatialObjectSemanticLabelEXT 값semanticLabelCount개의 배열에 대한 포인터여야 합니다. -
semanticLabelCount매개변수는0보다 커야 합니다.
키보드 시맨틱 라벨
구성요소 데이터
typedef enum XrSpatialKeyboardSemanticLabelEXT {
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT = 2,
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialKeyboardSemanticLabelEXT;
XrSpatialKeyboardSemanticLabelEXT 열거형은 키보드의 시맨틱 라벨을 설명합니다.
동일한 항목의 Bounded 3D 구성요소로 표현되는 XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT의 범위와 방향은 객체 중심에서 시작하는 다음 이미지 (xyz = rgb)에 표시됩니다.
그림 30. 키보드 방향입니다.
enum 설명
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT
런타임에서 이 항목을 분류할 수 없습니다.
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT
키보드 항목입니다.
데이터를 쿼리하는 구성요소 목록 구조체
XrSpatialComponentKeyboardSemanticLabelListEXT 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialComponentKeyboardSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialKeyboardSemanticLabelEXT* semanticLabels;
} XrSpatialComponentKeyboardSemanticLabelListEXT;
회원 설명
type는 이 구조의 XrStructureType입니다.next는NULL또는 구조 체인의 다음 구조에 대한 포인터입니다. 핵심 OpenXR 또는 이 확장 프로그램에는 이러한 구조가 정의되어 있지 않습니다.semanticLabelCount은semanticLabels배열의 요소 수를 설명하는uint32_t입니다.semanticLabels는 XrSpatialKeyboardSemanticLabelEXT의 배열입니다.
XrSpatialSnapshotEXT에서 공간 항목의 키보드 시맨틱 라벨 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT를 포함하고 XrSpatialComponentDataQueryResultEXT :: next 체인에 XrSpatialComponentKeyboardSemanticLabelListEXT를 추가합니다.
XrSpatialComponentKeyboardSemanticLabelListEXT가 XrSpatialComponentDataQueryResultEXT :: next 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT가 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).
semanticLabelCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다(must).
올바른 사용 (암시적)
- XrSpatialComponentKeyboardSemanticLabelListEXT를 사용하기 전에
XR_EXT_spatial_object_tracking확장 프로그램을 사용 설정해야 합니다. -
type은(는)XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT여야 합니다. -
next는NULL또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다. -
semanticLabels:semanticLabelCountXrSpatialKeyboardSemanticLabelEXT 값 배열의 포인터여야 합니다. -
semanticLabelCount매개변수는0보다 커야 합니다.
구성
일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT가 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 수 있습니다.
이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함하기 위해 특별한 구성이 필요하지 않습니다.
마우스 시맨틱 라벨
구성요소 데이터
typedef enum XrSpatialMouseSemanticLabelEXT {
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT = 2,
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMouseSemanticLabelEXT;
XrSpatialMouseSemanticLabelEXT 열거형은 마우스의 시맨틱 라벨을 설명합니다.
enum 설명
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
런타임에서 이 항목을 분류할 수 없습니다.
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT
항목은 마우스입니다.
데이터를 쿼리하는 구성요소 목록 구조체
XrSpatialComponentMouseSemanticLabelListEXT 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialComponentMouseSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialMouseSemanticLabelEXT* semanticLabels;
} XrSpatialComponentMouseSemanticLabelListEXT;
회원 설명
type는 이 구조의 XrStructureType입니다.next는NULL또는 구조 체인의 다음 구조에 대한 포인터입니다. 핵심 OpenXR 또는 이 확장 프로그램에는 이러한 구조가 정의되어 있지 않습니다.semanticLabelCount은semanticLabels배열의 요소 수를 설명하는uint32_t입니다.semanticLabels는 XrSpatialMouseSemanticLabelEXT의 배열입니다.
XrSpatialSnapshotEXT에서 공간 항목의 마우스 시맨틱 라벨 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT를 포함하고 XrSpatialComponentDataQueryResultEXT :: next 체인에 XrSpatialComponentMouseSemanticLabelListEXT를 추가합니다.
XrSpatialComponentMouseSemanticLabelListEXT가 XrSpatialComponentDataQueryResultEXT :: next 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT가 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다.
semanticLabelCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다(must).
올바른 사용 (암시적)
-
XR_EXT_spatial_object_tracking확장 프로그램은 XrSpatialComponentMouseSemanticLabelListEXT를 사용하기 전에 사용 설정해야 합니다(MUST). -
type은(는)XR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT여야 합니다. -
next는NULL또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다. -
semanticLabels:semanticLabelCountXrSpatialMouseSemanticLabelEXT 값 배열에 대한 포인터여야 합니다. -
semanticLabelCount매개변수는0보다 커야 합니다.
구성
일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT가 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 수 있습니다.
이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함하기 위해 특별한 구성이 필요하지 않습니다.
예시 코드
객체 추적 기능 구성
다음 예시 코드는 공간 컨텍스트를 만들 때 객체 추적 기능을 구성하는 방법을 보여줍니다.
// Check if object tracking capability is supported
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT) == capabilities.end()) {
return;
}
// Enumerate supported components for object tracking capability
XrSpatialCapabilityComponentTypesEXT objectComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));
std::vector<XrSpatialComponentTypeEXT> objectCapabilityComponents(objectComponents.componentTypeCountOutput);
objectComponents.componentTypeCapacityInput = objectCapabilityComponents.size();
objectComponents.componentTypes = objectCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));
// Check if the object & keyboard semantic labels component is supported
const auto supportsComponent = [&objectCapabilityComponents](XrSpatialComponentTypeEXT component) {
return std::find(objectCapabilityComponents.begin(), objectCapabilityComponents.end(), component) != objectCapabilityComponents.end();
};
const bool supportsObjectSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
const bool supportsKeyboardSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
// Enumerate supported features for object tracking capability
uint32_t featureCount;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> features(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, featureCount, &featureCount, features.data()));
const bool supportsObjectSemanticLabelSubsetFeature = std::find(features.begin(), features.end(), XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT) != features.end();
// Create a spatial context
XrSpatialContextEXT spatialContext{};
// Enable the guaranteed components of the object tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
// Optionally enable the supported semantic labels
if (supportsObjectSemanticLabel) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
}
if (supportsKeyboardSemanticLabel) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}
// We only want to track sofa and table.
std::vector<XrSpatialObjectSemanticLabelEXT> objectSemanticLabelSubset = {
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT
};
XrSpatialFeatureObjectSemanticLabelSubsetEXT subsetFeature{XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT};
subsetFeature.semanticLabelCount = objectSemanticLabelSubset.size();
subsetFeature.semanticLabels = objectSemanticLabelSubset.data();
XrSpatialCapabilityConfigurationObjectTrackingEXT objectTrackingConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT};
objectTrackingConfig.capability = XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT;
objectTrackingConfig.enabledComponentCount = enabledComponents.size();
objectTrackingConfig.enabledComponents = enabledComponents.data();
if (supportsObjectSemanticLabelSubsetFeature) {
objectTrackingConfig.next = &subsetFeature;
}
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&objectTrackingConfig),
};
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;
// ...
// Discovery entities with the spatial context
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
공간 항목 및 쿼리 구성요소 데이터 탐색
다음 예시 코드는 XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT로 구성된 컨텍스트의 공간 항목을 검색하고 구성요소 데이터를 쿼리하는 방법을 보여줍니다.
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
if (supportsKeyboardSemanticLabel) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
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 semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrBoxf> bounded3D(queryResult.entityIdCountOutput);
XrSpatialComponentBounded3DListEXT bounded3DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXT};
bounded3DList.boundCount = bounded3D.size();
bounded3DList.bounds = bounded3D.data();
queryResult.next = &bounded3DList;
std::vector<XrSpatialKeyboardSemanticLabelEXT> semanticLabels;
XrSpatialComponentKeyboardSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT};
if (supportsKeyboardSemanticLabel) {
semanticLabels.resize(queryResult.entityIdCountOutput);
semanticLabelsList.semanticLabelCount = semanticLabels.size();
semanticLabelsList.semanticLabels = semanticLabels.data();
semanticLabelsList.next = queryResult.next;
queryResult.next = &semanticLabelsList;
}
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) {
continue;
}
// 3D bounds for entity entityIds[i] is bounded3D[i].extents centered on bounded3D[i].center.
if (supportsKeyboardSemanticLabel) {
// semantic label for entity entityIds[i] is semanticLabels[i].
}
}
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
// ...
}
새로운 구조
새 enum
새 enum 상수
XR_EXT_SPATIAL_OBJECT_TRACKING_EXTENSION_NAMEXR_EXT_spatial_object_tracking_SPEC_VERSION-
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
XrSpatialCapabilityFeatureEXT 확장:
XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
-
XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
XrStructureType 확장:
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
문제
버전 기록
버전 1, 2025-06-03 (Nihav Jain, Google)
- 초기 확장 프로그램 설명