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_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).

올바른 사용 (암시적)

구성

일부 기능의 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)에 표시됩니다.

ext 공간 객체 추적 키보드 방향

그림 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).

올바른 사용 (암시적)

구성

일부 기능의 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: semanticLabelCount XrSpatialMouseSemanticLabelEXT 값 배열에 대한 포인터여야 합니다.
  • 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_NAME
  • XR_EXT_spatial_object_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT 확장:

    • XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
  • XrSpatialCapabilityFeatureEXT 확장:

    • XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
  • XrSpatialComponentTypeEXT 확장:

    • XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
  • XrStructureType 확장:

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT
    • XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT

문제

버전 기록

  • 버전 1, 2025-06-03 (Nihav Jain, Google)

    • 초기 확장 프로그램 설명