XR_ANDROID_trackables_marker
Строка имени
XR_ANDROID_trackables_marker
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
708
Пересмотр
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
XR_ANDROID_trackables
Состояние деморализации
- Устарело в расширении
XR_EXT_spatial_marker_tracking
Дата последнего изменения
2025-07-23
Статус IP
Известных претензий на интеллектуальную собственность нет.
Авторы
Кристофер Доер, Google
Диего Типальди, Google
Левана Чен, Google
Джаред Финдер, Google
Спенсер Куин, Google
Нихав Джайн, Google
Кен Маккей, Google
Даниэль Гуттенберг, Qualcomm
Обзор
Это расширение обеспечивает отслеживание физических маркеров и позволяет приложениям эффективно прикреплять XR-контент к физическим маркерам.
Расширение поддерживает широко известные типы маркеров, в частности, ArUco и April Tags. Оно позволяет средам выполнения опционально поддерживать оценку размера маркеров.
Разрешения
В манифесте Android-приложений должно быть указано разрешение android.permission.SCENE_UNDERSTANDING_COARSE, поскольку это расширение зависит от XR_ANDROID_trackables и предоставляет доступ к геометрии окружающей среды. Разрешение 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— это максимальное количество маркеров, которые среда выполнения может отслеживать одновременно.
Приложение может проверить, способна ли система отслеживать маркеры, расширив структуру XrSystemProperties структурой XrSystemMarkerTrackingPropertiesANDROID при вызове функции xrGetSystemProperties . Среда выполнения должна возвращать XR_ERROR_FEATURE_UNSUPPORTED для создания средства отслеживания маркеров только в том случае, если supportsMarkerTracking имеет значение XR_FALSE .
Если среда выполнения поддерживает отслеживание маркеров, maxMarkerCount должно быть не менее 1.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_markerнеобходимо включить перед использованием XrSystemMarkerTrackingPropertiesANDROID. -
typeдолжен бытьXR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур.
Маркеры слежения
Это расширение добавляет XR_TRACKABLE_TYPE_MARKER_ANDROID к XrTrackableTypeANDROID .
Приложение создает объект XrTrackableTrackerANDROID , вызывая метод xrCreateTrackableTrackerANDROID и указывая тип отслеживания XR_TRACKABLE_TYPE_MARKER_ANDROID в функции XrTrackableTrackerCreateInfoANDROID :: trackableType , а также устанавливая допустимую конфигурацию путем добавления объекта XrTrackableMarkerConfigurationANDROID в следующую цепочку вызовов XrTrackableTrackerCreateInfoANDROID .
Если функция XrTrackableTrackerCreateInfoANDROID :: trackableType имеет значение XR_TRACKABLE_TYPE_MARKER_ANDROID , а функция XrSystemMarkerTrackingPropertiesANDROID :: supportsMarkerTracking возвращает значение XR_FALSE через xrGetSystemProperties , среда выполнения должна возвращать 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— это тип данныхuint32_t, описывающий количество элементов в массивеdatabases. -
databases— это указатель на массив объектов XrTrackableMarkerDatabaseANDROID , каждый из которых содержит необходимые маркеры из заданного словаря для отслеживания.
Приложение должно установить допустимую конфигурацию, добавив XrTrackableMarkerConfigurationANDROID в цепочку XrTrackableTrackerCreateInfoANDROID :: next при вызове xrCreateTrackableTrackerANDROID с параметром XrTrackableTrackerCreateInfoANDROID :: trackableType установленным в значение XR_TRACKABLE_TYPE_MARKER_ANDROID . В противном случае, если тип трекера установлен, как указано выше, но структура конфигурации отсутствует или недействительна, среда выполнения должна вернуть XR_ERROR_VALIDATION_FAILURE .
Если среда выполнения поддерживает оценку размера маркера, приложение может установить значение XrTrackableMarkerDatabaseEntryANDROID :: edgeSize равным 0 в записях XrTrackableMarkerDatabaseANDROID :: entries , чтобы указать на использование оценки размера. В противном случае приложение должно установить значение XrTrackableMarkerDatabaseEntryANDROID :: edgeSize положительным значением, или среда выполнения должна вернуть XR_ERROR_VALIDATION_FAILURE .
Среда выполнения должна фильтровать выходные данные из xrGetAllTrackablesANDROID, чтобы они соответствовали trackingMode и XrTrackableMarkerDatabaseEntryANDROID :: edgeSize .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_markerнеобходимо включить перед использованием XrTrackableMarkerConfigurationANDROID. -
typeдолжен бытьXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
trackingModeдолжен быть допустимым значением XrTrackableMarkerTrackingModeANDROID. -
databasesдолжен быть указателем на массив допустимых структур XrTrackableMarkerDatabaseANDROID, содержащихdatabaseCount - Параметр
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 определяет словарь и соответствующие идентификаторы маркеров, которые необходимо отслеживать.
typedef struct XrTrackableMarkerDatabaseANDROID {
XrTrackableMarkerDictionaryANDROID dictionary;
uint32_t entryCount;
const XrTrackableMarkerDatabaseEntryANDROID* entries;
} XrTrackableMarkerDatabaseANDROID;
Описание участников
-
dictionaryXrTrackableMarkerDictionaryANDROID — это словарь, к которому относятся всеentries. -
entryCount— это тип данных uint32_t, описывающий количество элементов в массивеentries. Приложение может установитьentryCount0чтобы отслеживать все маркеры вdictionary. -
entriesпредставляет собой указатель на массив объектов XrTrackableMarkerDatabaseEntryANDROID , каждый из которых содержит конфигурацию отслеживаемого маркера.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_markerнеобходимо включить перед использованием XrTrackableMarkerDatabaseANDROID. -
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 позволяет задать единственный идентификатор маркера в словаре.
typedef struct XrTrackableMarkerDatabaseEntryANDROID {
int32_t id;
float edgeSize;
} XrTrackableMarkerDatabaseEntryANDROID;
Описание участников
-
id— это идентификатор маркера, указанный в словаре. -
edgeSizeобозначает размер края маркера в метрах. Если среда выполнения поддерживает оценку размера маркера, приложение может установить это значение равным нулю, и размер маркера будет оцениваться в режиме реального времени. Если же значение равно нулю, но среда выполнения не поддерживает оценку размера маркера, она должна вернутьXR_ERROR_VALIDATION_FAILURE.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_markerнеобходимо включить перед использованием XrTrackableMarkerDatabaseEntryANDROID.
Получите маркеры
Функция xrGetTrackableMarkerANDROID определена следующим образом:
XrResult xrGetTrackableMarkerANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableMarkerANDROID* markerOutput);
Описание параметров
- Для запроса используется
trackerXrTrackableTrackerANDROID . -
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_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_TIME_INVALID -
XR_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— это идентификатор маркера, указанный в словаре. -
centerPose— это XrPosef маркера, расположенного в XrTrackableGetInfoANDROID ::baseSpace. Маркер находится в плоскости XZ, при этом X направлен вправо от маркера, Z — к его нижней части, а Y — перпендикуляр к маркеру. -
extents— это размеры маркера по XrExtent2Df . Граница ограничивающего прямоугольника определяется точками:centerPose+/- (extents/ 2).
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_markerнеобходимо включить перед использованием XrTrackableMarkerANDROID. -
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 :
Расширение XrTrackableTrackerCreateInfoANDROID :
Новые перечисления
Новые константы перечислений
-
XR_ANDROID_TRACKABLES_MARKER_EXTENSION_NAME -
XR_ANDROID_trackables_marker_SPEC_VERSION Расширение XrStructureType :
-
XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID -
XR_TYPE_TRACKABLE_MARKER_ANDROID -
XR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID
-
Расширение XrTrackableTypeANDROID :
-
XR_TRACKABLE_TYPE_MARKER_ANDROID
-
Проблемы
История версий
Редакция 1, 23 июля 2025 г. (Левана Чен)
- Первоначальное описание расширения.