XR_ANDROID_trackables_qr_code OpenXR 拡張機能

Name String

XR_ANDROID_trackables_qr_code

拡張機能のタイプ

インスタンス拡張機能

Registered Extension Number

460

リビジョン

1

拡張機能とバージョンの依存関係

XR_ANDROID_trackables

最終更新日

2025-02-05

IP ステータス

既知の IP 申し立てはありません。

寄与者

Christopher Doer(Google)

Levana Chen(Google)

Jared Finder, Google

Spencer Quin(Google)

Nihav Jain、Google

Diego Tipaldi(Google)

Google の Ken Mackay

Daniel Guttenberg、Qualcomm

概要

この拡張機能により、物理的な QR コードのトラッキングと QR コードのデータのデコードが可能になります。

システムの機能を検証する

XrSystemQrCodeTrackingPropertiesANDROID

XrSystemQrCodeTrackingPropertiesANDROID 構造体は次のように定義されます。

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

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。
  • supportsQrCodeTracking は、現在のシステムが QR コード トラッキング機能を提供しているかどうかを示す XrBool32 です。
  • supportsQrCodeSizeEstimation は、現在のシステムが QR コードのサイズ推定を提供するかどうかを示す XrBool32 です。
  • maxQrCodeCount は、同時に追跡できる QR コードの合計最大数です。

アプリは、xrGetSystemProperties を呼び出すときに XrSystemPropertiesXrSystemQrCodeTrackingPropertiesANDROID 構造体で拡張することで、システムが QR コードのトラッキングに対応しているかどうかを確認できます。ランタイムは、supportsQrCodeTrackingXR_FALSE の場合にのみ、QR コード トラッカーの作成に対して XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。

ランタイムが QR コード トラッキングをサポートする場合、任意の時点で maxQrCodeCount 個のトラッキング対象 QR コードをサポートしなければなりません。

ランタイムが QR コードのサイズ推定をサポートしている場合、アプリは XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize 0 を設定して、サイズ推定の使用を示すことができます。それ以外の場合、アプリケーションは XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize を正の値に設定しなければなりません。そうしないと、XR_ERROR_VALIDATION_FAILURE が返されます。

有効な使用方法(暗黙的)

  • XrSystemQrCodeTrackingPropertiesANDROID を使用する前に、XR_ANDROID_trackables_qr_code 拡張機能を有効にする必要があります。
  • typeXR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID でなければなりません。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。

QR コードのトラッキング

この拡張機能は、XrTrackableTypeANDROIDXR_TRACKABLE_TYPE_QR_CODE_ANDROID を追加します。

アプリケーションは、xrCreateTrackableTrackerANDROID を呼び出し、XrTrackableTrackerCreateInfoANDROID::trackableType の追跡可能なタイプとして XR_TRACKABLE_TYPE_QR_CODE_ANDROID を指定して、QR コードを追跡することにより、XrTrackableTrackerANDROID を作成しても構いません

XrTrackableTrackerCreateInfoANDROID::trackableTypeXR_TRACKABLE_TYPE_QR_CODE_ANDROID で、XrSystemQrCodeTrackingPropertiesANDROID::supportsQrCodeTrackingxrGetSystemProperties を介して XR_FALSE を返す場合、ランタイムは XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。

XrTrackableQrCodeConfigurationANDROID

XrTrackableQrCodeConfigurationANDROID 構造体は次のように定義されます。

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

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。
  • trackingMode は、トラッキングの目的のモードを示す XrQrCodeTrackingModeANDROID です。
  • qrCodeEdgeSize は、QR コードの辺の長さをメートル単位で示します。0 の場合、QR コードのサイズはオンラインで推定されます。

アプリケーションは、XrTrackableTrackerCreateInfoANDROID の次のチェーンに XrTrackableQrCodeConfigurationANDROID を追加して、有効な構成を設定しなければなりません。それ以外の場合、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

ランタイムが QR コードのサイズ推定をサポートしている場合、アプリは XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize0 に設定して、サイズ推定の使用を示すことができます。それ以外の場合、アプリケーションは XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize を正の値に設定しなければなりません。そうしないと、XR_ERROR_VALIDATION_FAILURE が返されます。

ランタイムは、xrGetAllTrackablesANDROID からの出力をフィルタして、trackingMode および qrCodeEdgeSize と一致させなければなりません。

有効な使用方法(暗黙的)

  • XrTrackableQrCodeConfigurationANDROID を使用する前に、XR_ANDROID_trackables_qr_code 拡張機能を有効にする必要があります。
  • typeXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID でなければなりません。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • trackingMode は有効な XrQrCodeTrackingModeANDROID 値でなければなりません。

XrQrCodeTrackingModeANDROID

XrQrCodeTrackingModeANDROID 列挙型は、QR コードのサポートされているトラッキング モードを表します。

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

| 列挙型 | 説明 ================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================XR_QR_CODE_TRACKING_MODE_STATIC_ANDROID' | XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID | QR コードは動的で、移動する可能性があります。 |

QR コードを取得する

xrGetTrackableQrCodeANDROID

xrGetTrackableQrCodeANDROID 関数は次のように定義されます。

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

パラメータの説明

  • tracker は、クエリする XrTrackableTrackerANDROID です。
  • getInfo は、追跡可能な QR コードを取得するために使用される情報を含む XrTrackableGetInfoANDROID です。
  • qrCodeOutput は、追跡可能な QR コードが返される XrTrackableQrCodeANDROID 構造体へのポインタです。

XrTrackableANDROID の追跡可能な型が XR_TRACKABLE_TYPE_QR_CODE_ANDROID でない場合、または XrTrackableTrackerANDROID の追跡可能な型が XR_TRACKABLE_TYPE_QR_CODE_ANDROID でない場合、ランタイムは XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID を返さなければなりません。

有効な使用方法(暗黙的)

  • xrGetTrackableQrCodeANDROID を呼び出す前に XR_ANDROID_trackables_qr_code 拡張機能を有効にする必要があります。
  • tracker は有効な XrTrackableTrackerANDROID ハンドルでなければなりません。
  • getInfo は、有効な XrTrackableGetInfoANDROID 構造体へのポインタでなければなりません。
  • qrCodeOutputXrTrackableQrCodeANDROID 構造体へのポインタでなければなりません。

XrTrackableQrCodeANDROID

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 です。
  • centerPose は、XrTrackableGetInfoANDROID::baseSpace にある QR コードの XrPosef です。QR コードは XZ 平面にあり、X は QR コードの右を指し、Z は QR コードの下を指します。
  • extents は QR コードの XrExtent2Df ディメンションです。境界ボックスの境界は、centerPose +/-(extents / 2)のポイントにあります。
  • bufferCapacityInput は、必要な機能を buffer または 0 で取得する機能です。
  • bufferCountOutput bufferCapacityInput0 の場合、ランタイムは必要なバッファサイズを bufferCountOutput に書き込みます。それ以外の場合は、buffer に書き込まれた要素の合計が含まれます。
  • buffer は、デコードされた QR コードデータを書き込む char の配列へのポインタです。アプリケーションは、必要なバッファサイズを決定するため、または QR コードデータのデコードをリクエストしない場合に、nullptr を渡すことができます。QR コードデータは、null 終端の UTF-8 文字列として返されます。
  • 必要な buffer サイズの取得について詳しくは、バッファサイズ パラメータのセクションをご覧ください。

有効な使用方法(暗黙的)

  • XrTrackableQrCodeANDROID を使用する前に、XR_ANDROID_trackables_qr_code 拡張機能を有効にする必要があります。
  • typeXR_TYPE_TRACKABLE_QR_CODE_ANDROID でなければなりません。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • trackingState は有効な XrTrackingStateANDROID 値でなければなりません。
  • bufferCapacityInput0 でない場合、bufferbufferCapacityInput 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);
uint32_t qrCodeSize = 0;
CHK_XR(xrGetAllTrackablesANDROID(qrCodeTracker, qrCodeProperty.maxQrCodeCount, &qrCodeSize,
                                 trackables.data()));
for (int i = 0; i < qrCodeSize; i++) {
    qrCodes[i].type = XR_TYPE_TRACKABLE_QR_CODE_ANDROID;
    qrCodes[i].next = nullptr;
    qrCodes[i].bufferCountOutput = 0;
    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));

新しい列挙型定数

XrStructureType 列挙型が拡張され、次の値が追加されました。

  • XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID
  • XR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID
  • XR_TYPE_TRACKABLE_QR_CODE_ANDROID

XrTrackableTypeANDROID 列挙型が拡張され、次の値が追加されました。

  • XR_TRACKABLE_TYPE_QR_CODE_ANDROID

新しい列挙型

  • XrQrCodeTrackingModeANDROID

新しい構造

  • XrSystemQrCodeTrackingPropertiesANDROID
  • XrTrackableQrCodeConfigurationANDROID
  • XrTrackableQrCodeANDROID

新機能

  • xrGetTrackableQrCodeANDROID

問題

変更履歴

  • リビジョン 1、2025 年 2 月 5 日(Levana Chen)
    • 拡張機能の初期の説明。

OpenXR™ および OpenXR のロゴは、Khronos Group Inc. が所有する商標であり、中国、欧州連合、日本、英国で商標として登録されています。