XR_EXT_spatial_marker_tracking

이름 문자열

XR_EXT_spatial_marker_tracking

확장 프로그램 유형

인스턴스 확장

등록된 확장 프로그램 번호

744

버전

1

비준 상태

비준

확장 프로그램 및 버전 종속 항목

XR_EXT_spatial_entity

도움을 주신 분들

론 베셈스, Meta
니하브 제인, Google
나탈리 플뢰리, Meta
유이치 타구치, Meta
인 리, Microsoft
지미 알람파람빌, ByteDance
지펭 리우, ByteDance
준 얀, ByteDance

개요

이 확장 프로그램은 XR_EXT_spatial_entity를 기반으로 하며 애플리케이션이 환경에서 마커를 감지하고 추적할 수 있도록 지원합니다. 마커는 QR 코드, 마이크로 QR 코드, ArUco 마커 또는 AprilTag를 포함할 수 있는 2D 코드입니다.

추적된 마커는 다음 구성요소가 있는 공간 엔티티로 표현됩니다.

  • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

런타임 지원

런타임은 다음 기능 중 하나를 나열하여 xrEnumerateSpatialCapabilitiesEXT를 사용하여 다양한 마커 추적 기능 지원을 알려야 합니다.

  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT

구성

마커 유형의 감지를 사용 설정하려면 애플리케이션이 xrCreateSpatialContextAsyncEXT에 해당 구성 구조를 전달해야 합니다 .

마커 유형 구성

QR 코드

XrSpatialCapabilityConfigurationQrCodeEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialCapabilityConfigurationQrCodeEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
} XrSpatialCapabilityConfigurationQrCodeEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다.
  • capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT이어야 합니다 .
  • enabledComponentCountenabledComponents의 요소 수를 포함하는 uint32_t입니다 .
  • enabledComponents은 이 기능에 사용 설정할 구성요소 배열에 대한 포인터입니다.

QR 코드가 지원되는 경우 런타임은 xrCreateSpatialContextAsyncEXT 호출 시 XrSpatialContextCreateInfoEXT :: capabilityConfigsXrSpatialCapabilityConfigurationQrCodeEXT 구조체가 전달될 때 QR 코드 추적을 사용 설정해야 합니다 .

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXTxrEnumerateSpatialCapabilitiesEXT로 열거되지 않으면 런타임은 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT를 반환해야 합니다 .

유효한 사용 (암시적)

마이크로 QR 코드

XrSpatialCapabilityConfigurationMicroQrCodeEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialCapabilityConfigurationMicroQrCodeEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
} XrSpatialCapabilityConfigurationMicroQrCodeEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다.
  • capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT이어야 합니다 .
  • enabledComponentCountenabledComponents의 요소 수를 포함하는 uint32_t입니다 .
  • enabledComponents은 이 기능에 사용 설정할 구성요소 배열에 대한 포인터입니다.

마이크로 QR 코드가 지원되는 경우 런타임은 xrCreateSpatialContextAsyncEXT 호출 시 XrSpatialContextCreateInfoEXT :: capabilityConfigsXrSpatialCapabilityConfigurationMicroQrCodeEXT 구조체가 전달될 때 마이크로 QR 코드 추적을 사용 설정해야 합니다 .

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXTxrEnumerateSpatialCapabilitiesEXT로 열거되지 않으면 런타임은 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT를 반환해야 합니다 .

유효한 사용 (암시적)

ArUco 마커

XrSpatialCapabilityConfigurationArucoMarkerEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialCapabilityConfigurationArucoMarkerEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
    XrSpatialMarkerArucoDictEXT         arUcoDict;
} XrSpatialCapabilityConfigurationArucoMarkerEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다.
  • capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT이어야 합니다 .
  • enabledComponentCountenabledComponents의 요소 수를 포함하는 uint32_t입니다 .
  • enabledComponents은 이 기능에 사용 설정할 구성요소 배열에 대한 포인터입니다.
  • arUcoDict는 감지할 마커 사전입니다.

ArUco 마커가 지원되는 경우 런타임은 xrCreateSpatialContextAsyncEXT 호출 시 XrSpatialContextCreateInfoEXT :: capabilityConfigsXrSpatialCapabilityConfigurationArucoMarkerEXT 구조체가 전달될 때 ArUco 마커 추적을 사용 설정해야 합니다 .

런타임은 XrSpatialCapabilityConfigurationArucoMarkerEXT 구조가 XrSpatialContextCreateInfoEXT :: capabilityConfigs에 있지만 XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXTxrEnumerateSpatialCapabilitiesEXT에 의해 열거되지 않는 경우 xrCreateSpatialContextAsyncEXT에서 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT을 반환해야 합니다 .

유효한 사용 (암시적)

XrSpatialMarkerArucoDictEXT 열거형은 다음과 같이 정의됩니다.

typedef enum XrSpatialMarkerArucoDictEXT {
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT = 1,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT = 2,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT = 3,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT = 4,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT = 5,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT = 6,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT = 7,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT = 8,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT = 9,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT = 10,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT = 11,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT = 12,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT = 13,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT = 14,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT = 15,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT = 16,
    XR_SPATIAL_MARKER_ARUCO_DICT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMarkerArucoDictEXT;

지원되는 사전 정의된 ArUco 사전:

열거형 설명

  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT - ID가 50개인 4x4 픽셀 Aruco 마커 사전
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT - ID가 100개인 4x4 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT - ID가 250개인 4x4 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT - ID가 1,000개인 4x4 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT - ID가 50개인 5x5 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT - ID가 100개인 5x5 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT - ID가 250개인 5x5 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT - ID가 1,000개인 5x5 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT - ID가 50개인 6x6 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT - ID가 100개인 6x6 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT - ID가 250개인 6x6 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT - ID가 1,000개인 6x6 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT - ID가 50개인 7x7 픽셀 Aruco 마커 사전
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT - ID가 100개인 7x7 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT - ID가 250개인 7x7 픽셀 Aruco 마커 사전입니다.
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT - ID가 1,000개인 7x7 픽셀 Aruco 마커 사전입니다.
AprilTags

XrSpatialCapabilityConfigurationAprilTagEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialCapabilityConfigurationAprilTagEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
    XrSpatialMarkerAprilTagDictEXT      aprilDict;
} XrSpatialCapabilityConfigurationAprilTagEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다.
  • capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT이어야 합니다 .
  • enabledComponentCountenabledComponents의 요소 수를 포함하는 uint32_t입니다 .
  • enabledComponents은 이 기능에 사용 설정할 구성요소 배열에 대한 포인터입니다.
  • aprilDict는 감지할 마커 사전입니다.

AprilTag가 지원되는 경우 런타임은 xrCreateSpatialContextAsyncEXT 호출 시 XrSpatialContextCreateInfoEXT :: capabilityConfigsXrSpatialCapabilityConfigurationAprilTagEXT 구조체가 전달되면 AprilTag 추적을 사용 설정해야 합니다 .

런타임은 XrSpatialCapabilityConfigurationAprilTagEXT 구조가 XrSpatialContextCreateInfoEXT :: capabilityConfigs에 있지만 XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXTxrEnumerateSpatialCapabilitiesEXT에 의해 열거되지 않는 경우 xrCreateSpatialContextAsyncEXT에서 XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT을 반환해야 합니다 .

유효한 사용 (암시적)

XrSpatialMarkerAprilTagDictEXT 열거형은 다음과 같이 정의됩니다.

typedef enum XrSpatialMarkerAprilTagDictEXT {
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT = 1,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT = 2,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT = 3,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT = 4,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMarkerAprilTagDictEXT;

지원되는 사전 정의된 AprilTag 사전:

열거형 설명

  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT — 4x4비트, 두 코드 간 최소 해밍 거리 = 5, 30개 코드
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT — 5x5비트, 두 코드 간 최소 해밍 거리 = 9, 35개 코드
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT - 6x6비트, 두 코드 간 최소 해밍 거리 = 10, 2320개 코드
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT - 6x6비트, 두 코드 간 최소 해밍 거리 = 11, 587개 코드

선택적 마커 구성

애플리케이션은 xrEnumerateSpatialCapabilityFeaturesEXT를 호출하여 지원되는 선택적 기능 목록을 가져와야 합니다.

확장에서 지원하는 모든 공간 기능의 전체 목록은 XrSpatialCapabilityFeatureEXT를 참고하세요.

마커 크기

XrSpatialMarkerSizeEXT 구조체는 다음과 같이 정의됩니다.

typedef struct XrSpatialMarkerSizeEXT {
    XrStructureType    type;
    const void*        next;
    float              markerSideLength;
} XrSpatialMarkerSizeEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다.
  • markerSideLength는 모든 마커의 크기(미터)입니다.

XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT이 특정 기능에 대해 xrEnumerateSpatialCapabilityFeaturesEXT로 열거되고 애플리케이션이 XrSpatialMarkerSizeEXT를 해당 기능의 해당 구성 구조에 연결하는 경우 런타임은 감지된 모든 마커의 너비와 높이가 markerSideLength이라고 가정해야 합니다 . 런타임에 이 정보를 제공하면 런타임에서 더 정확한 포즈와 크기를 반환할 수 있습니다. 이 구조는 XrSpatialCapabilityConfigurationQrCodeEXT, XrSpatialCapabilityConfigurationMicroQrCodeEXT, XrSpatialCapabilityConfigurationArucoMarkerEXT 또는 XrSpatialCapabilityConfigurationAprilTagEXTnext 체인에 연결해야 합니다 .

유효한 사용 (암시적)

  • XrSpatialMarkerSizeEXT를 사용하기 전에 XR_EXT_spatial_marker_tracking 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_SPATIAL_MARKER_SIZE_EXT이어야 합니다.
  • nextNULL이거나 구조체 체인의 다음 구조체를 가리키는 유효한 포인터여야 합니다.
정적 마커 최적화

XrSpatialMarkerStaticOptimizationEXT 구조체는 다음과 같이 정의됩니다.

typedef struct XrSpatialMarkerStaticOptimizationEXT {
    XrStructureType    type;
    const void*        next;
    XrBool32           optimizeForStaticMarker;
} XrSpatialMarkerStaticOptimizationEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다.
  • optimizeForStaticMarker는 공간의 모든 마커가 이동하지 않아야 하는지 여부를 나타냅니다.

XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT이 특정 기능에 대해 xrEnumerateSpatialCapabilityFeaturesEXT에 의해 열거되고 애플리케이션이 XrSpatialMarkerStaticOptimizationEXT를 해당 기능의 해당 구성 구조에 연결하는 경우 optimizeForStaticMarkerXR_TRUE로 설정되면 런타임은 감지된 모든 마커가 정적이라고 가정해야 합니다 . 이를 통해 런타임에서 더 정확한 포즈와 크기를 생성할 수 있습니다. 이 구조는 XrSpatialCapabilityConfigurationQrCodeEXT, XrSpatialCapabilityConfigurationMicroQrCodeEXT, XrSpatialCapabilityConfigurationArucoMarkerEXT 또는 XrSpatialCapabilityConfigurationAprilTagEXTnext 체인에 연결해야 합니다 .

유효한 사용 (암시적)

보장된 구성요소

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT 또는 XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT를 지원하는 런타임은 이러한 기능으로 검색된 모든 엔티티의 보장된 구성요소로 다음 공간 구성요소를 제공해야 합니다. 또한 xrEnumerateSpatialCapabilityComponentTypesEXT에서 이를 열거해야 합니다.

  • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

마커 구성요소

구성요소 데이터

XrSpatialMarkerDataEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialMarkerDataEXT {
    XrSpatialCapabilityEXT    capability;
    uint32_t                  markerId;
    XrSpatialBufferEXT        data;
} XrSpatialMarkerDataEXT;

회원 설명

  • capability는 마커를 감지한 XrSpatialCapabilityEXT입니다.
  • markerId는 마커에서 인코딩된 식별자입니다. ArUco 마커와 AprilTag의 경우 이 필드는 유효해야 하며 인코딩된 ID로 채워져야 합니다. QR 코드의 경우 이 필드는 0이어야 합니다.
  • data는 마커에 포함된 추가 정보의 버퍼 ID와 유형입니다.

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXTXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT은 추가 데이터를 지원합니다. capability이 다음 중 하나인 경우

  • 런타임이 마커의 데이터를 성공적으로 디코딩한 경우 마커의 데이터에 따라 data 버퍼 유형을 XR_SPATIAL_BUFFER_TYPE_UINT8_EXT 또는 XR_SPATIAL_BUFFER_TYPE_STRING_EXT로 설정해야 합니다. 런타임은 애플리케이션이 적절한 xrGetSpatialBuffer* 함수와 함께 사용하여 데이터를 가져올 수 있는 유효한 버퍼 ID도 data에 설정해야 합니다.
  • 런타임이 아직 마커의 데이터를 디코딩하지 않은 경우 data 버퍼 ID를 XR_NULL_SPATIAL_BUFFER_ID_EXT로, 버퍼 유형을 XR_SPATIAL_BUFFER_TYPE_UNKNOWN_EXT로 설정해야 합니다 .

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXTXR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT는 추가 데이터를 지원하지 않으며 런타임은 data의 버퍼 ID를 XR_NULL_SPATIAL_BUFFER_ID_EXT로 설정해야 합니다 .

유효한 사용 (암시적)

데이터를 쿼리하는 구성요소 목록 구조

XrSpatialComponentMarkerListEXT 구조체는 다음과 같이 정의됩니다.

typedef struct XrSpatialComponentMarkerListEXT {
    XrStructureType            type;
    void*                      next;
    uint32_t                   markerCount;
    XrSpatialMarkerDataEXT*    markers;
} XrSpatialComponentMarkerListEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • markerCountmarkers 멤버의 요소 수입니다.
  • markersXrSpatialMarkerDataEXT 배열입니다 .

애플리케이션은 XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_MARKER_EXT를 추가하고 XrSpatialComponentDataQueryResultEXT의 다음 포인터 체인에 XrSpatialComponentMarkerListEXT를 추가하여 XrSpatialSnapshotEXT의 공간 엔티티 마커 구성요소를 쿼리할 수 있습니다 .

런타임은 XrSpatialComponentMarkerListEXTXrSpatialComponentDataQueryResultEXT :: next의 다음 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_MARKER_EXTXrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다 .

런타임은 markerCountXrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다 .

유효한 사용 (암시적)

  • XrSpatialComponentMarkerListEXT를 사용하기 전에 XR_EXT_spatial_marker_tracking 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT이어야 합니다.
  • nextNULL이거나 구조체 체인의 다음 구조체를 가리키는 유효한 포인터여야 합니다.
  • markersmarkerCount XrSpatialMarkerDataEXT 구조의 배열을 가리키는 포인터여야 합니다.
  • markerCount 매개변수는 0보다 커야 합니다.
구성

XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT가 일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 수 있습니다.

이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함되기 위해 특별한 구성을 요구하지 않습니다.

제한된 2D 구성요소

바운드된 2D 구성요소는 마커의 중심과 범위를 제공합니다. 마커는 구성요소가 있는 항목으로 표현됩니다. 바운드 2D 구성요소에 관한 자세한 내용은 바운드 2D를 참고하세요.

XrSpatialBounded2DDataEXT :: center는 마커의 중심을 가리켜야 합니다(must). 마커의 앞면을 볼 때 X축은 오른쪽을 가리켜야 합니다. Y축은 마커의 상단을 가리켜야 합니다. 런타임은 오른손 좌표계 규칙을 따라야 합니다. 따라서 Z축은 마커의 앞면에서 나옵니다. 즉, 위치가 {0, 0, 0}, 회전이 {0, 0, 0, 1} (회전 없음), 범위가 {1, 1}인 마커는 구성요소 공간에서 앞면 법선 벡터가 +Z 방향을 향하는 {0, 0, 0}에 중심이 있는 1미터 x 1미터 마커를 나타냅니다.

마커 방향의 표현은 아래와 같습니다.

xr ml 마커 이해 축

그림 25. 축이 있는 QR 코드 마커

테스트 코드

다음 코드는 문서 내에 X-Y 평면이 있고 Z축이 뷰어를 향해야 합니다. 축 원점은 각 마커의 중앙에 표시되어야 합니다. X축은 오른쪽을 향해야 합니다. Y축은 문서의 상단을 향해야 합니다.

ext 마커 추적 qr

그림 26. 'OpenXR' 텍스트가 포함된 QR 코드

ext 마커 추적 apriltag

그림 27. ID가 42인 AprilTag XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT

ext marker tracking aruco

그림 28. ID가 43인 ArUco 마커 XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT

예제 코드

QR 코드 추적 기능 구성

다음 예시 코드에서는 공간 컨텍스트를 만들 때 QR 코드 추적 기능을 구성하는 방법을 보여줍니다.

// Check if marker 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_MARKER_TRACKING_QR_CODE_EXT) == capabilities.end()) {
  return;
}

uint32_t featureCount = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> capabilityFeatures(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, featureCount, &featureCount, capabilityFeatures.data()));

bool supportsFixedMarkerSize = std::find(capabilityFeatures.begin(), capabilityFeatures.end(), XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT) != capabilityFeatures.end();

// Create a spatial context
XrSpatialContextEXT spatialContext{};

// Enable the 2 guaranteed components of the qr code tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT,
};
XrSpatialCapabilityConfigurationQrCodeEXT markerConfiguration{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT};
markerConfiguration.capability = XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT;
markerConfiguration.enabledComponentCount = static_cast<uint32_t>(enabledComponents.size());
markerConfiguration.enabledComponents = enabledComponents.data();

// only chained if features.markerSideLength is true.
XrSpatialMarkerSizeEXT markerSize{XR_TYPE_SPATIAL_MARKER_SIZE_EXT};
markerSize.markerSideLength = 0.10f;
if (supportsFixedMarkerSize) {
  markerConfiguration.next = &markerSize;
}


std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
  reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&markerConfiguration),
};

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_MARKER_TRACKING_QR_CODE_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_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_MARKER_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 bounded2D and marker 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<XrSpatialBounded2DDataEXT> bounded2D(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded2DListEXT bounded2DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
    bounded2DList.boundCount = bounded2D.size();
    bounded2DList.bounds = bounded2D.data();
    queryResult.next = &bounded2DList;

    std::vector<XrSpatialMarkerDataEXT> markers;
    XrSpatialComponentMarkerListEXT markerList{XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT};
    markers.resize(queryResult.entityIdCountOutput);
    markerList.markerCount = markers.size();
    markerList.markers = markers.data();
    bounded2DList.next = &markerList;

    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;
      }

      // 2D bounds for entity entityIds[i] is bounded2D[i].extents centered on bounded2D[i].center.

      if (markers[i].capability == XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT) {
        // Check if marker data has been decoded.
        if (markers[i].data.bufferId != XR_NULL_SPATIAL_BUFFER_ID_EXT) {
          if (markers[i].data.bufferType == XR_SPATIAL_BUFFER_TYPE_STRING_EXT) {
            // Qr Code data can be queried using
            // XrSpatialBufferGetInfoEXT getInfo{XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT};
            // info.bufferId = markers[i].data.bufferId;
            // xrGetSpatialBufferStringEXT(completion.snapshot, &getInfo, ...)
          } else if (markers[i].data.bufferType == XR_SPATIAL_BUFFER_TYPE_UINT8_EXT) {
            // Qr Code data can be queried using
            // XrSpatialBufferGetInfoEXT getInfo{XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT};
            // info.bufferId = markers[i].data.bufferId;
            // xrGetSpatialBufferUint8(completion.snapshot, &getInfo, ...)
          }
        }
      }
    }

    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
  // ...
}

새 구조

새 열거형

새 열거형 상수

  • XR_EXT_SPATIAL_MARKER_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_marker_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT 확장 :

    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
  • XrSpatialCapabilityFeatureEXT 확장 :

    • XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT
    • XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
  • XrSpatialComponentTypeEXT 확장 :

    • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XrStructureType 확장 :

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT
    • XR_TYPE_SPATIAL_MARKER_SIZE_EXT
    • XR_TYPE_SPATIAL_MARKER_STATIC_OPTIMIZATION_EXT

버전 기록

  • 버전 1, 2024년 7월 29일 (론 베셈스, Meta)

    • 초기 확장 프로그램 설명