XR_ANDROID_trackables_marker
Name String
XR_ANDROID_trackables_marker
拡張機能のタイプ
インスタンス拡張機能
Registered Extension Number
708
リビジョン
1
Ratification Status(批准ステータス)
未批准
拡張機能とバージョンの依存関係
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 と April タグ)をサポートしています。これにより、ランタイムでマーカー サイズの推定を任意でサポートできるようになります。
権限
この拡張機能は XR_ANDROID_trackables に依存し、環境のジオメトリを公開するため、Android アプリケーションはマニフェストに android.permission.SCENE_UNDERSTANDING_COARSE 権限を記載しなければなりません。android.permission.SCENE_UNDERSTANDING_COARSE 権限は危険な権限とみなされます。つまり、アプリは明示的に権限をリクエストする必要があります。
(保護レベル: 危険)
システムの機能を検証する
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 を呼び出すときに XrSystemProperties を XrSystemMarkerTrackingPropertiesANDROID 構造体で拡張することで、システムがマーカー トラッキングに対応しているかどうかを検査できます。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 を返さなければなりません。
ランタイムは、trackingMode および XrTrackableMarkerDatabaseEntryANDROID :: edgeSize に一致するように xrGetAllTrackablesANDROID からの出力をフィルタしなければなりません。
有効な使用方法(暗黙的)
- 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はentryCountXrTrackableMarkerDatabaseEntryANDROID 構造体の配列へのポインタでなければなりません。
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を返さなければなりません。
有効な使用方法(暗黙的)
-
XR_ANDROID_trackables_marker拡張機能は、XrTrackableMarkerDatabaseEntryANDROID を使用する前に有効にしなければなりません。
マーカーを取得する
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 を返さなければなりません。
有効な使用方法(暗黙的)
- xrGetTrackableMarkerANDROID を呼び出す前に、
XR_ANDROID_trackables_marker拡張機能を有効にする必要があります。 -
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
XrTrackableTypeANDROID を拡張する :
XR_TRACKABLE_TYPE_MARKER_ANDROID
問題
変更履歴
リビジョン 1、2025-07-23(Levana Chen)
- 拡張機能の初回説明。