XR_ANDROID_trackables_qr_code
Name String
XR_ANDROID_trackables_qr_code
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
709
Revision
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
XR_ANDROID_trackables
Статус прекращения поддержки
- Устарело из-за расширения
XR_EXT_spatial_marker_tracking
Дата последнего изменения
2025-02-05
Статус IP-адреса
Нет известных претензий в отношении интеллектуальной собственности.
Авторы
Кристофер Дёр (Christopher Doer), Google
Левана Чэнь (Levana Chen), Google
Джаред Финдер (Jared Finder), Google
Спенсер Куин (Spencer Quin), Google
Нихав Джайн (Nihav Jain), Google
Диего Типальди (Diego Tipaldi), Google
Кен Маккей (Ken Mackay), Google
Дэниел Гуттенберг (Daniel Guttenberg), Qualcomm
Обзор
Это расширение позволяет отслеживать физические QR-коды и декодировать данные QR-кодов.
Разрешения
В манифесте приложений для Android должно быть указано разрешение android.permission.SCENE_UNDERSTANDING_COARSE, поскольку это расширение зависит от XR_ANDROID_trackables и раскрывает геометрию среды. Разрешение 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– этоXrBool32, указывающее, поддерживает ли текущая система отслеживание QR-кодов.supportsQrCodeSizeEstimation–XrBool32, указывающее, предоставляет ли текущая система оценку размера QR-кода.maxQrCodeCount– максимальное количество QR-кодов, которые можно отслеживать одновременно.
Приложение может проверить, способна ли система отслеживать QR-коды, расширив XrSystemProperties с помощью структуры XrSystemQrCodeTrackingPropertiesANDROID при вызове xrGetSystemProperties . Среда выполнения должна возвращать XR_ERROR_FEATURE_UNSUPPORTED для создания счетчика QR-кодов, если и только если supportsQrCodeTracking – это XR_FALSE .
Если среда выполнения поддерживает отслеживание QR-кодов, значение maxQrCodeCount должно быть не меньше 1. Если среда выполнения не поддерживает отслеживание QR-кодов, значение maxQrCodeCount должно быть равно 0.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_qr_codeдолжно быть включено до использования XrSystemQrCodeTrackingPropertiesANDROID. -
typeдолжно бытьXR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур.
Отслеживание QR-кодов
Это расширение добавляет XR_TRACKABLE_TYPE_QR_CODE_ANDROID в XrTrackableTypeANDROID .
Приложение может создать XrTrackableTrackerANDROID, вызвав xrCreateTrackableTrackerANDROID и указав XR_TRACKABLE_TYPE_QR_CODE_ANDROID в качестве отслеживаемого типа в XrTrackableTrackerCreateInfoANDROID :: trackableType, чтобы отслеживать QR-коды.
Среда выполнения должна возвращать XR_ERROR_FEATURE_UNSUPPORTED, если XrTrackableTrackerCreateInfoANDROID :: trackableType – это XR_TRACKABLE_TYPE_QR_CODE_ANDROID, а XrSystemQrCodeTrackingPropertiesANDROID :: supportsQrCodeTracking возвращает XR_FALSE через xrGetSystemProperties .
Структура XrTrackableQrCodeConfigurationANDROID определяется следующим образом:
typedef struct XrTrackableQrCodeConfigurationANDROID {
XrStructureType type;
void* next;
XrQrCodeTrackingModeANDROID trackingMode;
float qrCodeEdgeSize;
} XrTrackableQrCodeConfigurationANDROID;
Описания участников
type– это XrStructureType этой структуры.next– этоNULLили указатель на следующую структуру в цепочке. Такие структуры не определены в ядре OpenXR или этом расширении.trackingMode– это XrQrCodeTrackingModeANDROID, указывающий нужный режим отслеживания.qrCodeEdgeSize– размер стороны QR-кода в метрах. Если указан ноль, среда выполнения оценивает размер QR-кода онлайн.
Приложение должно задать действительную конфигурацию, добавив XrTrackableQrCodeConfigurationANDROID в следующую цепочку XrTrackableTrackerCreateInfoANDROID . В противном случае среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE .
Если среда выполнения поддерживает оценку размера QR-кода, приложение может установить для XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize значение 0.0, чтобы указать на использование оценки размера.
Если среда выполнения не поддерживает оценку размера QR-кода, приложение должно задать для XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize положительное значение. В противном случае среда выполнения должна вернуть XR_ERROR_VALIDATION_FAILURE .
Среда выполнения должна фильтровать выходные данные из xrGetAllTrackablesANDROID, чтобы они соответствовали trackingMode . Если для XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize не задано значение 0.0, среда выполнения должна возвращать только QR-коды, соответствующие этому размеру. Если для XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize задано значение 0.0, среда выполнения должна возвращать все QR-коды с приблизительным размером.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_qr_codeдолжно быть включено до использования XrTrackableQrCodeConfigurationANDROID. -
typeдолжно бытьXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID -
nextдолжен бытьNULLили действительным указателем на следующую структуру в цепочке структур . См. также XrTrackableQrCodeVersionFilterQCOM. -
trackingModeдолжно быть действительным значением XrQrCodeTrackingModeANDROID.
Перечисление XrQrCodeTrackingModeANDROID описывает поддерживаемые режимы отслеживания 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-кодами, но при этом потребляет больше всего энергии.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);
Описание параметров
tracker– XrTrackableTrackerANDROID для запроса.getInfo– это XrTrackableGetInfoANDROID с информацией, которая используется для получения отслеживаемого QR-кода.qrCodeOutput– указатель на структуру XrTrackableQrCodeANDROID, в которой возвращается отслеживаемый QR-код.
Среда выполнения должна возвращать XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID, если отслеживаемый тип XrTrackableANDROID не равен XR_TRACKABLE_TYPE_QR_CODE_ANDROID или если отслеживаемый тип XrTrackableTrackerANDROID не равен XR_TRACKABLE_TYPE_QR_CODE_ANDROID .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_qr_codeдолжно быть включено до вызова xrGetTrackableQrCodeANDROID. -
trackerдолжен быть действительным дескриптором XrTrackableTrackerANDROID. -
getInfoдолжен быть указателем на действительную структуру XrTrackableGetInfoANDROID. -
qrCodeOutputдолжен быть указателем на структуру XrTrackableQrCodeANDROID.
Коды возврата
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_SIZE_INSUFFICIENTXR_ERROR_TIME_INVALIDXR_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– XrTrackingStateANDROID QR-кода.lastUpdatedTime–XrTimeпоследнего обновления QR-кода. Если значениеlastUpdatedTimeизменилось с момента последнего вызова, то могли измениться и все остальные поля.centerPose– это XrPosef QR-кода, расположенного в XrTrackableGetInfoANDROID ::baseSpace. QR-код находится в плоскости XZ, где X указывает на правую сторону QR-кода, Z – на его нижнюю часть, а Y выходит из QR-кода как нормаль.extents– размеры QR-кода XrExtent2Df. Границы рамки находятся в точкахcenterPose+/- (extents/ 2).bufferCapacityInput– это функцияbufferили0для получения нужной функции.bufferCountOutputЕслиbufferCapacityInput–0, среда выполнения запишет требуемый размер буфера вbufferCountOutput. В противном случае в нем содержится общее количество элементов, записанных вbuffer. Если данные QR-кода ещё не декодированы, среда выполнения должна установить для bufferCountOutput значение 0.buffer– указатель на массивcharдля записи декодированных данных QR-кода. Если приложению не нужны декодированные данные QR-кода, оно может передатьnullptrи пропустить второй вызов. Данные QR-кода возвращаются в виде строки UTF-8 с нулевым символом в конце.- Подробное описание того, как получить нужный размер
buffer, приведено в разделе Параметры размера буфера.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_trackables_qr_codeдолжно быть включено до использования XrTrackableQrCodeANDROID. -
typeдолжно бытьXR_TYPE_TRACKABLE_QR_CODE_ANDROID -
nextдолжен бытьNULLили действительным указателем на следующую структуру в цепочке структур . См. также XrTrackableQrCodeVersionQCOM. -
trackingStateдолжно быть допустимым значением XrTrackingStateANDROID. - Если
bufferCapacityInputне равно0,bufferдолжен быть указателем на массив значений charbufferCapacityInput.
Пример кода для получения отслеживаемых 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));
Новые команды
Новые структуры
- XrTrackableQrCodeANDROID
Расширение XrSystemProperties :
Расширение XrTrackableTrackerCreateInfoANDROID :
Новые перечисления
Новые константы перечисления
XR_ANDROID_TRACKABLES_QR_CODE_EXTENSION_NAMEXR_ANDROID_trackables_qr_code_SPEC_VERSIONРасширение XrStructureType :
XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID
Расширение XrTrackableTypeANDROID :
XR_TRACKABLE_TYPE_QR_CODE_ANDROID
Проблемы
История версий
Версия 1, 5 февраля 2025 г. (Левана Чен)
- Начальное описание расширения.