XR_ANDROID_trackables_qr_code

이름 문자열

XR_ANDROID_trackables_qr_code

확장 프로그램 유형

인스턴스 확장 프로그램

등록된 내선 번호

709

버전

1

승인 상태

비준되지 않음

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

XR_ANDROID_trackables

지원 중단 상태

  • XR_EXT_spatial_marker_tracking 확장 프로그램에 의해 지원 중단됨

최종 수정일

2025-02-05

IP 상태

알려진 IP 소유권 주장이 없습니다.

도움을 주신 분들

크리스토퍼 도어, Google
레바나 첸, Google
자레드 파인더, Google
스펜서 퀸, Google
니하브 자인, Google
디에고 티팔디, Google
켄 맥케이, Google
다니엘 구텐베르크, Qualcomm

개요

이 확장 프로그램을 사용하면 실제 QR 코드 추적 및 QR 코드 데이터 디코딩이 가능합니다.

권한

이 확장 프로그램은 XR_ANDROID_trackables에 종속되고 환경의 도형을 노출하므로 Android 애플리케이션은 매니페스트에 android.permission.SCENE_UNDERSTANDING_COARSE 권한을 나열해야 합니다. android.permission.SCENE_UNDERSTANDING_COARSE 권한은 위험한 권한으로 간주됩니다.

(보호 수준: 위험)

시스템 기능 검사

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

typedef struct XrSystemQrCodeTrackingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsQrCodeTracking;
    XrBool32           supportsQrCodeSizeEstimation;
    uint16_t           maxQrCodeCount;
} XrSystemQrCodeTrackingPropertiesANDROID;

회원 설명

  • type는 이 구조의 XrStructureType입니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 포인터입니다. 핵심 OpenXR 또는 이 확장 프로그램에는 이러한 구조가 정의되어 있지 않습니다.
  • supportsQrCodeTracking는 현재 시스템에서 QR 코드 추적 기능을 제공하는지 나타내는 XrBool32입니다.
  • supportsQrCodeSizeEstimation는 현재 시스템에서 QR 코드 크기 추정을 제공하는지 나타내는 XrBool32입니다.
  • maxQrCodeCount은 동시에 추적할 수 있는 QR 코드의 총 최대 개수입니다.

애플리케이션은 xrGetSystemProperties를 호출할 때 XrSystemQrCodeTrackingPropertiesANDROID 구조로 XrSystemProperties를 확장하여 시스템이 QR 코드 추적을 지원하는지 검사할 수 있습니다. 런타임은 supportsQrCodeTracking가 XR_FALSE인 경우에만 QR 코드 추적기 생성에 대해 XR_ERROR_FEATURE_UNSUPPORTED를 반환해야 합니다(MUST).

런타임이 QR 코드 추적을 지원하는 경우 maxQrCodeCount는 1 이상이어야 합니다. 런타임이 QR 코드 추적을 지원하지 않는 경우 maxQrCodeCount은 0이어야 합니다(must).

올바른 사용 (암시적)

QR 코드 추적

이 확장 프로그램은 XrTrackableTypeANDROID에 XR_TRACKABLE_TYPE_QR_CODE_ANDROID를 추가합니다.

애플리케이션은 xrCreateTrackableTrackerANDROID를 호출하고 XrTrackableTrackerCreateInfoANDROID :: trackableType에서 추적 가능한 유형으로 XR_TRACKABLE_TYPE_QR_CODE_ANDROID를 지정하여 XrTrackableTrackerANDROID를 만들 수 있습니다(may).

XrTrackableTrackerCreateInfoANDROID :: trackableType가 XR_TRACKABLE_TYPE_QR_CODE_ANDROID이고 XrSystemQrCodeTrackingPropertiesANDROID :: supportsQrCodeTracking가 xrGetSystemProperties를 통해 XR_FALSE를 반환하는 경우 런타임은 XR_ERROR_FEATURE_UNSUPPORTED를 반환해야 합니다(must).

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

typedef struct XrTrackableQrCodeConfigurationANDROID {
    XrStructureType                type;
    void*                          next;
    XrQrCodeTrackingModeANDROID    trackingMode;
    float                          qrCodeEdgeSize;
} XrTrackableQrCodeConfigurationANDROID;

회원 설명

  • type는 이 구조의 XrStructureType입니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 포인터입니다. 핵심 OpenXR 또는 이 확장 프로그램에는 이러한 구조가 정의되어 있지 않습니다.
  • trackingMode는 원하는 추적 모드를 나타내는 XrQrCodeTrackingModeANDROID입니다.
  • qrCodeEdgeSize는 QR 코드 가장자리의 크기를 미터 단위로 나타냅니다. 0이면 런타임이 온라인에서 QR 코드 크기를 추정합니다.

애플리케이션은 XrTrackableQrCodeConfigurationANDROID를 XrTrackableTrackerCreateInfoANDROID의 다음 체인에 추가하여 유효한 구성을 설정해야 합니다. 그 외의 경우에는 런타임이 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(MUST).

런타임이 QR 코드 크기 추정을 지원하는 경우 애플리케이션은 XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize를 0.0로 설정하여 크기 추정 사용을 나타낼 수 있습니다.

런타임이 QR 코드 크기 추정을 지원하지 않는 경우 애플리케이션은 XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize를 양수 값으로 설정해야 합니다. 그렇지 않으면 런타임은 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다.

런타임은 xrGetAllTrackablesANDROID의 출력을 필터링하여 trackingMode와 일치시켜야 합니다(MUST). XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize가 0.0로 설정되지 않은 경우 런타임은 이 크기와 일치하는 QR 코드만 반환해야 합니다(must). XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize가 0.0로 설정된 경우 런타임은 예상 크기의 모든 QR 코드를 반환해야 합니다(must).

올바른 사용 (암시적)

XrQrCodeTrackingModeANDROID enum은 지원되는 QR 코드 추적 모드를 설명합니다.

typedef enum XrQrCodeTrackingModeANDROID {
    XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID = 0,
    XR_QR_CODE_TRACKING_MODE_STATIC_ANDROID = 1,
    XR_QR_CODE_TRACKING_MODE_ANCHORED_QCOM = 1000314000,
    XR_QR_CODE_TRACKING_MODE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrQrCodeTrackingModeANDROID;

열거형 설명

  • XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID — 동적 QR 코드 추적 이 모드는 정확도가 가장 높으며 움직이는 QR 코드와 정적 QR 코드에서 작동하지만 전력 소비도 가장 높습니다.
  • XR_QR_CODE_TRACKING_MODE_STATIC_ANDROID: 정적 QR 코드를 추적합니다. 이 모드는 주로 정적인 것으로 알려진 QR 코드에 유용하며, 동적 모드에 비해 전력 소비가 적습니다.
  • XR_QR_CODE_TRACKING_MODE_ANCHORED_QCOM: 정적 QR 코드에 사용해야 하는 모드입니다. 정적 모드와 달리 이 모드는 QR 코드를 한 번만 추적한 다음 기기의 위치만을 기반으로 추적된 인스턴스의 위치를 업데이트합니다. 따라서 QR 코드가 참조 프레임의 시야에서 벗어나더라도 추적이 계속됩니다. 이렇게 하면 QR 코드가 추적된 후 전력 소모가 최소화됩니다. (XR_QCOM_trackables_qr_code_operations 확장 프로그램에서 추가됨)

QR 코드 받기

xrGetTrackableQrCodeANDROID 함수는 다음과 같이 정의됩니다.

XrResult xrGetTrackableQrCodeANDROID(
    XrTrackableTrackerANDROID                   tracker,
    const XrTrackableGetInfoANDROID*            getInfo,
    XrTrackableQrCodeANDROID*                   qrCodeOutput);

파라미터 설명

XrTrackableANDROID의 추적 가능한 유형이 XR_TRACKABLE_TYPE_QR_CODE_ANDROID가 아니거나 XrTrackableTrackerANDROID의 추적 가능한 유형이 XR_TRACKABLE_TYPE_QR_CODE_ANDROID가 아닌 경우 런타임은 XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID를 반환해야 합니다(must).

올바른 사용 (암시적)

반품 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE

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

typedef struct XrTrackableQrCodeANDROID {
    XrStructureType           type;
    void*                     next;
    XrTrackingStateANDROID    trackingState;
    XrTime                    lastUpdatedTime;
    XrPosef                   centerPose;
    XrExtent2Df               extents;
    uint32_t                  bufferCapacityInput;
    uint32_t                  bufferCountOutput;
    char*                     buffer;
} XrTrackableQrCodeANDROID;

회원 설명

  • type는 이 구조의 XrStructureType입니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 포인터입니다. 핵심 OpenXR 또는 이 확장 프로그램에는 이러한 구조가 정의되어 있지 않습니다.
  • trackingState는 QR 코드의 XrTrackingStateANDROID입니다.
  • lastUpdatedTime는 QR 코드의 마지막 업데이트 XrTime입니다. 마지막 호출 이후 lastUpdatedTime가 변경되면 다른 모든 필드가 변경되었을 수 있습니다.
  • centerPose는 XrTrackableGetInfoANDROID :: baseSpace에 있는 QR 코드의 XrPosef입니다. QR 코드는 XZ 평면에 있으며, X는 QR 코드의 오른쪽을 가리키고, Z는 하단을 가리키며, Y는 QR 코드에서 법선으로 나옵니다.
  • extents는 QR 코드의 XrExtent2Df 크기입니다. 경계 상자의 경계는 centerPose +/- ( extents / 2) 지점에 있습니다.
  • bufferCapacityInput는 buffer의 기능이거나 필요한 기능을 가져오는 0입니다.
  • bufferCountOutput bufferCapacityInput가 0이면 런타임은 필요한 버퍼 크기를 bufferCountOutput에 씁니다. 그렇지 않으면 buffer에 작성된 총 요소가 포함됩니다. QR 코드 데이터가 아직 디코딩되지 않은 경우 런타임은 bufferCountOutput을 0으로 설정해야 합니다(must).
  • buffer는 디코딩된 QR 코드 데이터를 작성할 char 배열의 포인터입니다. 애플리케이션이 디코딩된 QR 코드 데이터에 관심이 없는 경우 nullptr를 전달하고 두 번째 2회 호출을 생략할 수 있습니다. QR 코드 데이터는 null로 끝나는 UTF-8 문자열로 반환됩니다.
  • 필요한 buffer 크기를 가져오는 방법에 관한 자세한 설명은 버퍼 크기 매개변수 섹션을 참고하세요.

올바른 사용 (암시적)

  • XrTrackableQrCodeANDROID를 사용하기 전에 XR_ANDROID_trackables_qr_code 확장 프로그램을 사용 설정해야 합니다.
  • type은(는) XR_TYPE_TRACKABLE_QR_CODE_ANDROID여야 합니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다. 참고: XrTrackableQrCodeVersionQCOM
  • trackingState는 유효한 XrTrackingStateANDROID 값이어야 합니다.
  • bufferCapacityInput가 0가 아닌 경우 buffer는 bufferCapacityInput char 값 배열의 포인터여야 합니다.

추적 가능한 QR 코드를 가져오는 예시 코드

다음 코드 예는 추적 가능한 QR 코드를 가져오는 방법을 보여줍니다.

XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session;   // previously initialized

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrGetSystemProperties xrGetSystemProperties;                       // previously initialized
PFN_xrCreateTrackableTrackerANDROID xrCreateTrackableTrackerANDROID;   // previously initialized
PFN_xrGetAllTrackablesANDROID xrGetAllTrackablesANDROID;               // previously initialized
PFN_xrGetTrackableQrCodeANDROID xrGetTrackableQrCodeANDROID;           // previously initialized
PFN_xrDestroyTrackableTrackerANDROID xrDestroyTrackableTrackerANDROID; // previously initialized

XrTime updateTime; // Time used for the current frame's simulation update.
XrSpace appSpace;  // Space created for XR_REFERENCE_SPACE_TYPE_LOCAL.

// Inspect system capability
XrSystemQrCodeTrackingPropertiesANDROID qrCodeProperty {
  .type = XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID,
  .next = nullptr,
};
XrSystemProperties systemProperties {
  .type = XR_TYPE_SYSTEM_PROPERTIES,
  .next = &qrCodeProperty,
};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (!qrCodeProperty.supportsQrCodeTracking) {
    // QR code tracking is not supported.
    return;
}

// Create a trackable tracker for QR code tracking.
// If the runtime does not support size estimation, configures QR code edge size of 0.1m.
XrTrackableQrCodeConfigurationANDROID configuration {
  .type = XR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID,
  .next = nullptr,
  .trackingMode = XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID,
  .qrCodeEdgeSize = qrCodeProperty.supportsQrCodeSizeEstimation ? 0.0f : 0.1f,
};
XrTrackableTrackerCreateInfoANDROID createInfo {
  .type = XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID,
  .next = &configuration,
  .trackableType = XR_TRACKABLE_TYPE_QR_CODE_ANDROID
};
XrTrackableTrackerANDROID qrCodeTracker;
auto res = xrCreateTrackableTrackerANDROID(session, &createInfo, &qrCodeTracker);
if (res == XR_ERROR_PERMISSION_INSUFFICIENT) {
    // Handle permission requests.
}
CHK_XR(res);

// Get QR codes.
std::vector<XrTrackableANDROID> trackables(qrCodeProperty.maxQrCodeCount);
std::vector<XrTrackableQrCodeANDROID> qrCodes(qrCodeProperty.maxQrCodeCount, {
  .type = XR_TYPE_TRACKABLE_QR_CODE_ANDROID,
  .next = nullptr,
  .bufferCountOutput = 0,
});
uint32_t qrCodeSize = 0;
CHK_XR(xrGetAllTrackablesANDROID(qrCodeTracker, qrCodeProperty.maxQrCodeCount, &qrCodeSize,
                                 trackables.data()));
for (int i = 0; i < qrCodeSize; i++) {
    XrTrackableGetInfoANDROID getInfo {
      .type = XR_TYPE_TRACKABLE_GET_INFO_ANDROID,
      .next = nullptr,
      .trackable = trackables.at(i),
      .baseSpace = appSpace,
      .time = updateTime,
    };
    CHK_XR(xrGetTrackableQrCodeANDROID(qrCodeTracker, &getInfo, &qrCodes[i]));
    if (qrCodes[i].bufferCountOutput > 0) {
        // Allocate the buffer if it is not already allocated.
        if (qrCodes[i].bufferCapacityInput == 0) {
            qrCodes[i].buffer = new char[qrCodes[i].bufferCountOutput];
            qrCodes[i].bufferCapacityInput = qrCodes[i].bufferCountOutput;
            CHK_XR(xrGetTrackableQrCodeANDROID(qrCodeTracker, &getInfo, &qrCodes[i]));
        }
    }
}

// Release trackable tracker.
CHK_XR(xrDestroyTrackableTrackerANDROID(qrCodeTracker));

새 명령어

새로운 구조

새 enum

새 enum 상수

  • XR_ANDROID_TRACKABLES_QR_CODE_EXTENSION_NAME
  • XR_ANDROID_trackables_qr_code_SPEC_VERSION
  • XrStructureType 확장:

    • XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID
    • XR_TYPE_TRACKABLE_QR_CODE_ANDROID
    • XR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID
  • XrTrackableTypeANDROID 확장:

    • XR_TRACKABLE_TYPE_QR_CODE_ANDROID

문제

버전 기록

  • 버전 1, 2025-02-05 (레바나 첸)

    • 초기 확장 프로그램 설명입니다.