XR_ANDROID_trackables_marker
Name String
XR_ANDROID_trackables_marker
拡張機能の種類
インスタンス拡張
登録済みの内線番号
708
リビジョン
1
承認ステータス
未批准
拡張機能とバージョンの依存関係
XR_ANDROID_trackables
サポート終了の状態
XR_EXT_spatial_marker_tracking拡張機能によって非推奨
最終更新日
2025-07-23
IP ステータス
既知の IP 申し立てはありません。
寄与者
Christopher Doer、Google
Diego Tipaldi、Google
Levana Chen、Google
Jared Finder、Google
Spencer Quin、Google
Nihav Jain、Google
Ken Mackay、Google
Daniel Guttenberg、Qualcomm
概要
この拡張機能により、物理マーカーのトラッキングが可能になり、アプリは XR コンテンツを物理マーカーに効率的にアタッチできるようになります。
この拡張機能は、よく知られているマーカータイプ(具体的には ArUco と AprilTag)をサポートしています。これにより、ランタイムは必要に応じてマーカーサイズの推定をサポートできます。
権限
この拡張機能は XR_ANDROID_trackables に依存し、環境のジオメトリを公開するため、Android アプリのマニフェストに android.permission.SCENE_UNDERSTANDING_COARSE 権限を記載する必要があります。android.permission.SCENE_UNDERSTANDING_COARSE 権限は危険な権限と見なされます。つまり、アプリは明示的に権限をリクエストしなければなりません。
(保護レベル: dangerous)
システム機能を検査する
XrSystemMarkerTrackingPropertiesANDROID 構造体は次のように定義されます。
typedef struct XrSystemMarkerTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsMarkerTracking;
XrBool32 supportsMarkerSizeEstimation;
uint16_t maxMarkerCount;
} XrSystemMarkerTrackingPropertiesANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造体は、コア OpenXR またはこの拡張機能では定義されていません。構造チェーンの詳細については、拡張される構造(XrSystemProperties)をご覧ください。supportsMarkerTrackingは、現在のシステムがマーカー トラッキング機能を提供しているかどうかを示すXrBool32です。supportsMarkerSizeEstimationは、現在のシステムがマーカーサイズの推定を提供するかどうかを示すXrBool32です。maxMarkerCountは、ランタイムが同時に追跡できるマーカーの最大数です。
アプリは、xrGetSystemProperties を呼び出すときに、XrSystemMarkerTrackingPropertiesANDROID 構造体を使用して XrSystemProperties を拡張することで、システムがマーカー トラッキングに対応しているかどうかを検査できます。ランタイムは、supportsMarkerTracking が XR_FALSE の場合に限り、マーカー トラッカーの作成に対して XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。
ランタイムがマーカー トラッキングをサポートしている場合、maxMarkerCount は 1 以上でなければなりません。
有効な使用方法(暗黙的)
- XrSystemMarkerTrackingPropertiesANDROID を使用する前に、
XR_ANDROID_trackables_marker拡張機能を有効にする必要があります。 -
typeはXR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROIDにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
トラッキング マーカー
この拡張機能により、XrTrackableTypeANDROID に XR_TRACKABLE_TYPE_MARKER_ANDROID が追加されます。
アプリは、xrCreateTrackableTrackerANDROID を呼び出し、XrTrackableTrackerCreateInfoANDROID :: trackableType でトラッキング可能なタイプとして XR_TRACKABLE_TYPE_MARKER_ANDROID を指定し、XrTrackableTrackerCreateInfoANDROID の次のチェーンに XrTrackableMarkerConfigurationANDROID を追加して有効な構成を設定することで、XrTrackableTrackerANDROID を作成します。
XrTrackableTrackerCreateInfoANDROID :: trackableType が XR_TRACKABLE_TYPE_MARKER_ANDROID で、XrSystemMarkerTrackingPropertiesANDROID :: supportsMarkerTracking が xrGetSystemProperties を介して XR_FALSE を返す場合、ランタイムは XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。
XrTrackableMarkerConfigurationANDROID 構造体は次のように定義されます。
typedef struct XrTrackableMarkerConfigurationANDROID {
XrStructureType type;
void* next;
XrTrackableMarkerTrackingModeANDROID trackingMode;
uint32_t databaseCount;
const XrTrackableMarkerDatabaseANDROID* databases;
} XrTrackableMarkerConfigurationANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。trackingModeは、トラッキングの目的のモードを示す XrTrackableMarkerTrackingModeANDROID です。databaseCountは、databases配列内の要素の数を表すuint32_tです。databasesは、XrTrackableMarkerDatabaseANDROID の配列へのポインタです。各配列には、特定の辞書から追跡する目的のマーカーが含まれています。
XrTrackableTrackerCreateInfoANDROID :: trackableType を XR_TRACKABLE_TYPE_MARKER_ANDROID に設定して xrCreateTrackableTrackerANDROID を呼び出す場合、アプリケーションは XrTrackableTrackerCreateInfoANDROID :: next チェーンに XrTrackableMarkerConfigurationANDROID を追加して、有効な構成を設定する必要があります。それ以外の場合、トラッカー タイプが上記のように設定されているが、構成構造が存在しないか無効である場合、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
ランタイムがマーカーサイズ推定をサポートしている場合、アプリケーションは XrTrackableMarkerDatabaseANDROID :: entries の XrTrackableMarkerDatabaseEntryANDROID :: edgeSize を 0 に設定して、サイズ推定の使用を示すことができます。それ以外の場合、アプリは XrTrackableMarkerDatabaseEntryANDROID :: edgeSize を正の値に設定しなければなりません。または、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
ランタイムは、xrGetAllTrackablesANDROID からの出力をフィルタして、trackingMode と XrTrackableMarkerDatabaseEntryANDROID :: edgeSize に一致させる必要があります。
有効な使用方法(暗黙的)
- XrTrackableMarkerConfigurationANDROID を使用する前に、
XR_ANDROID_trackables_marker拡張機能を有効にする必要があります。 -
typeはXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROIDにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
trackingModeは、有効な XrTrackableMarkerTrackingModeANDROID 値でなければ -
databasesは、databaseCount個の有効な XrTrackableMarkerDatabaseANDROID 構造体の配列へのポインタでなければなりません -
databaseCountパラメータは0より大きい値にする必要があります。
XrTrackableMarkerTrackingModeANDROID 列挙型は、サポートされているマーカーのトラッキング モードを示します。
typedef enum XrTrackableMarkerTrackingModeANDROID {
XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID = 0,
XR_TRACKABLE_MARKER_TRACKING_MODE_STATIC_ANDROID = 1,
XR_TRACKABLE_MARKER_TRACKING_MODE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrTrackableMarkerTrackingModeANDROID;
列挙子の説明
XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID- 動的マーカーのトラッキング。このモードは精度が最も高く、移動するマーカーと静止したマーカーの両方に対応しますが、消費電力も最も高くなります。XR_TRACKABLE_MARKER_TRACKING_MODE_STATIC_ANDROID- 静的マーカーをトラッキングします。このモードは、主に静的であることがわかっているマーカーに役立ちます。動的モードと比較して消費電力が少なくなります。
XrTrackableMarkerDatabaseANDROID 構造体は、追跡する辞書と対応するマーカー ID を定義します。
typedef struct XrTrackableMarkerDatabaseANDROID {
XrTrackableMarkerDictionaryANDROID dictionary;
uint32_t entryCount;
const XrTrackableMarkerDatabaseEntryANDROID* entries;
} XrTrackableMarkerDatabaseANDROID;
メンバーの説明
dictionaryは、すべてのentriesが属する XrTrackableMarkerDictionaryANDROID です。entryCountは、entries配列内の要素の数を表す uint32_t です。アプリケーションは、entryCount0を設定して、dictionary内のすべてのマーカーを追跡できます。entriesは XrTrackableMarkerDatabaseEntryANDROID の配列へのポインタです。各エントリには、追跡するマーカーの構成が含まれています。
有効な使用方法(暗黙的)
- XrTrackableMarkerDatabaseANDROID を使用する前に、
XR_ANDROID_trackables_marker拡張機能を有効にする必要があります。 -
dictionaryは、有効な XrTrackableMarkerDictionaryANDROID 値でなければ -
entryCountが0でない場合、entriesはentryCount個の XrTrackableMarkerDatabaseEntryANDROID 構造体の配列へのポインタでなければなりません。
XrTrackableMarkerDictionaryANDROID 列挙型は、サポートされているマーカー辞書を記述します。
typedef enum XrTrackableMarkerDictionaryANDROID {
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_50_ANDROID = 0,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_100_ANDROID = 1,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_250_ANDROID = 2,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_1000_ANDROID = 3,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_50_ANDROID = 4,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_100_ANDROID = 5,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_250_ANDROID = 6,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_1000_ANDROID = 7,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_50_ANDROID = 8,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_100_ANDROID = 9,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_250_ANDROID = 10,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_1000_ANDROID = 11,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_50_ANDROID = 12,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_100_ANDROID = 13,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_250_ANDROID = 14,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_1000_ANDROID = 15,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_16H5_ANDROID = 16,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_25H9_ANDROID = 17,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_36H10_ANDROID = 18,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_36H11_ANDROID = 19,
XR_TRACKABLE_MARKER_DICTIONARY_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrTrackableMarkerDictionaryANDROID;
XrTrackableMarkerDatabaseEntryANDROID 構造体は、辞書の単一のマーカー ID を構成します。
typedef struct XrTrackableMarkerDatabaseEntryANDROID {
int32_t id;
float edgeSize;
} XrTrackableMarkerDatabaseEntryANDROID;
メンバーの説明
idは、辞書で指定されたマーカー ID です。edgeSizeは、マーカーのエッジのサイズをメートル単位で表します。ランタイムがマーカーサイズの推定をサポートしている場合、アプリケーションはこれをゼロに設定できます。マーカーサイズはオンラインで推定されます。この値が 0 に設定されているが、ランタイムがマーカーサイズの推定をサポートしていない場合、ランタイムはXR_ERROR_VALIDATION_FAILUREを返さなければなりません。
有効な使用方法(暗黙的)
- XrTrackableMarkerDatabaseEntryANDROID を使用する前に、
XR_ANDROID_trackables_marker拡張機能を有効にする必要があります。
マーカーを取得する
xrGetTrackableMarkerANDROID 関数は次のように定義されます。
XrResult xrGetTrackableMarkerANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableMarkerANDROID* markerOutput);
パラメータの説明
trackerは、クエリする XrTrackableTrackerANDROID です。getInfoは、トラッキング可能なマーカーの取得に使用される情報を含む XrTrackableGetInfoANDROID です。markerOutputは、トラッキング可能なマーカーが返される XrTrackableMarkerANDROID 構造体へのポインタです。
XrTrackableANDROID のトラッキング可能なタイプが XR_TRACKABLE_TYPE_MARKER_ANDROID でない場合、または XrTrackableTrackerANDROID のトラッキング可能なタイプが XR_TRACKABLE_TYPE_MARKER_ANDROID でない場合、ランタイムは XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID を返さなければなりません。
有効な使用方法(暗黙的)
-
XR_ANDROID_trackables_marker拡張機能は、xrGetTrackableMarkerANDROID を呼び出す前に有効にする必要があります。 -
trackerは、有効な XrTrackableTrackerANDROID ハンドルでなければなりません。 -
getInfoは、有効な XrTrackableGetInfoANDROID 構造体へのポインタでなければなりません。 -
markerOutputは XrTrackableMarkerANDROID 構造体へのポインタでなければなりません
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
XrTrackableMarkerANDROID 構造体は次のように定義されます。
typedef struct XrTrackableMarkerANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrTrackableMarkerDictionaryANDROID dictionary;
int32_t markerId;
XrPosef centerPose;
XrExtent2Df extents;
} XrTrackableMarkerANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造体は、コア OpenXR またはこの拡張機能では定義されていません。trackingStateは、マーカーの XrTrackingStateANDROID です。lastUpdatedTimeは、マーカーの最終更新のXrTimeです。dictionaryは、マーカーの XrTrackableMarkerDictionaryANDROID です。markerIdは、辞書で指定されたマーカー ID です。centerPoseは、XrTrackableGetInfoANDROID ::baseSpaceにあるマーカーの XrPosef です。マーカーは XZ 平面にあり、X はマーカーの右側、Z はマーカーの下部、Y はマーカーから法線として出ています。extentsは、マーカーの XrExtent2Df ディメンションです。境界ボックスの境界は、centerPose+/-(extents/ 2)のポイントにあります。
有効な使用方法(暗黙的)
- XrTrackableMarkerANDROID を使用する前に、
XR_ANDROID_trackables_marker拡張機能を有効にする必要があります。 -
typeはXR_TYPE_TRACKABLE_MARKER_ANDROIDにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
trackingStateは、有効な XrTrackingStateANDROID 値でなければなりません。 -
dictionaryは、有効な XrTrackableMarkerDictionaryANDROID 値でなければ
追跡可能なマーカーを取得するサンプルコード
次のサンプルコードは、追跡可能なマーカーを取得する方法を示しています。
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_xrGetTrackableMarkerANDROID xrGetTrackableMarkerANDROID; // 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
XrSystemMarkerTrackingPropertiesANDROID markerProperty {
.type = XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID,
.next = nullptr,
};
XrSystemProperties systemProperties {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &markerProperty,
};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (!markerProperty.supportsMarkerTracking) {
// Marker tracking is not supported.
return;
}
// Create a trackable tracker for marker tracking.
// If the runtime does not support size estimation, configures marker edge size of 0.1m.
XrTrackableMarkerDatabaseEntryANDROID markerEntries {
.id = 0,
.edgeSize = markerProperty.supportsMarkerSizeEstimation ? 0.0f : 0.1f,
};
XrTrackableMarkerDatabaseANDROID markerDatabases {
.dictionary = XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_50_ANDROID,
.entryCount = 1,
.entries = &markerEntries,
};
XrTrackableMarkerConfigurationANDROID configuration {
.type = XR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID,
.next = nullptr,
.trackingMode = XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID,
.databaseCount = 1,
.databases = &markerDatabases,
};
XrTrackableTrackerCreateInfoANDROID createInfo {
.type = XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID,
.next = &configuration,
.trackableType = XR_TRACKABLE_TYPE_MARKER_ANDROID,
};
XrTrackableTrackerANDROID markerTracker;
auto res = xrCreateTrackableTrackerANDROID(session, &createInfo, &markerTracker);
if (res == XR_ERROR_PERMISSION_INSUFFICIENT) {
// Handle permission requests.
}
CHK_XR(res);
// Get markers.
std::vector<XrTrackableANDROID> trackables(markerProperty.maxMarkerCount);
std::vector<XrTrackableMarkerANDROID> markers(markerProperty.maxMarkerCount, {
.type = XR_TYPE_TRACKABLE_MARKER_ANDROID,
.next = nullptr,
});
uint32_t markerSize = 0;
CHK_XR(xrGetAllTrackablesANDROID(markerTracker, markerProperty.maxMarkerCount, &markerSize,
trackables.data()));
for (int i = 0; i < markerSize; i++) {
XrTrackableGetInfoANDROID getInfo {
.type = XR_TYPE_TRACKABLE_GET_INFO_ANDROID,
.next = nullptr,
.trackable = trackables[i],
.baseSpace = appSpace,
.time = updateTime,
};
CHK_XR(xrGetTrackableMarkerANDROID(markerTracker, &getInfo, &markers[i]));
// Handle markers.
}
// Release trackable tracker.
CHK_XR(xrDestroyTrackableTrackerANDROID(markerTracker));
新しいコマンド
新しい構造
- XrTrackableMarkerANDROID
- XrTrackableMarkerDatabaseANDROID
- XrTrackableMarkerDatabaseEntryANDROID
XrSystemProperties の拡張:
新しい列挙型
新しい列挙型定数
XR_ANDROID_TRACKABLES_MARKER_EXTENSION_NAMEXR_ANDROID_trackables_marker_SPEC_VERSIONXrStructureType の拡張:
XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_MARKER_ANDROIDXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID
-
XR_TRACKABLE_TYPE_MARKER_ANDROID
問題
変更履歴
リビジョン 1、2025-07-23(Levana Chen)
- 拡張機能の初期説明。