Имя Строка
XR_ANDROID_trackables_qr_code
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
460
Пересмотр
1
Зависимости расширений и версий
Дата последнего изменения
2025-02-05
Статус IP
Известных претензий на права интеллектуальной собственности нет.
Авторы
Кристофер Доер, Google
Левана Чен, Google
Джаред Файндер, Google
Спенсер Куин, Google
Нихав Джайн, Google
Диего Типальди, Google
Кен Маккей, Google
Дэниел Гуттенберг, 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
— этоXrBool32
указывающий, предоставляет ли текущая система возможность отслеживания QR-кодов. -
supportsQrCodeSizeEstimation
— этоXrBool32
указывающий, обеспечивает ли текущая система оценку размера QR-кода. -
maxQrCodeCount
— максимальное количество QR-кодов, которые можно отслеживать одновременно.
Приложение может проверить, поддерживает ли система отслеживание QR-кодов, расширив XrSystemProperties
структурой XrSystemQrCodeTrackingPropertiesANDROID
при вызове xrGetSystemProperties
. Среда выполнения должна вернуть XR_ERROR_FEATURE_UNSUPPORTED
для создания трекера QR-кодов только в том случае, если supportsQrCodeTracking
имеет значение XR_FALSE
.
Если среда выполнения поддерживает отслеживание QR-кодов, она должна поддерживать maxQrCodeCount
отслеживаемых QR-кодов в любой момент времени.
Если среда выполнения поддерживает оценку размера QR-кода, приложение может установить значение XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize
0
чтобы указать на использование оценки размера. В противном случае приложение должно установить значение XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize
равным положительному значению, иначе будет возвращено исключение XR_ERROR_VALIDATION_FAILURE
.
Допустимое использование (неявное)
- Расширение
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
Структура XrTrackableQrCodeConfigurationANDROID
определяется как:
typedef struct XrTrackableQrCodeConfigurationANDROID {
XrStructureType type;
const 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
чтобы указать на использование оценки размера. В противном случае приложение должно установить XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize
равным положительному значению, иначе будет возвращено исключение XR_ERROR_VALIDATION_FAILURE
.
Среда выполнения должна фильтровать выходные данные xrGetAllTrackablesANDROID
для соответствия trackingMode
и qrCodeEdgeSize
.
Допустимое использование (неявное)
- Перед использованием
XrTrackableQrCodeConfigurationANDROID
необходимо включить расширениеXR_ANDROID_trackables_qr_code
-
type
должен бытьXR_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
| QR-код статичен и не перемещается. | XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID
| QR-код динамичен и может перемещаться. |
Получить QR-коды
xrGetTrackableQrCodeANDROID
Функция 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
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
— этоXrTrackingStateANDROID
QR-кода. -
lastUpdatedTime
— этоXrTime
последнего обновления QR-кода. -
centerPose
— этоXrPosef
QR-кода, расположенного вXrTrackableGetInfoANDROID::baseSpace
. QR-код расположен в плоскости XZ, при этом ось X направлена вправо от QR-кода, а ось Z — вниз. - Размеры QR-кода
XrExtent2Df
)extents
QR-кода. Граница ограничивающего прямоугольника определяется точками:centerPose
+/- (extents
/ 2). -
bufferCapacityInput
— емкостьbuffer
или0
для получения требуемой емкости. - Если
bufferCapacityInput
bufferCountOutput
0
, среда выполнения запишет требуемый размер буфера вbufferCountOutput
. В противном случае он будет содержать общее количество элементов, записанных вbuffer
. -
buffer
— это указатель на массивchar
для записи декодированных данных QR-кода. Приложение может передать значениеnullptr
для определения необходимого размера буфера или, если декодирование данных QR-кода не требуется, передать данные QR-кода. Данные QR-кода возвращаются в виде строки UTF-8 с завершающим нулем. - Подробное описание получения необходимого размера буфера см. в разделе «Параметры размера
buffer
.
Допустимое использование (неявное)
- Перед использованием
XrTrackableQrCodeANDROID
необходимо включить расширениеXR_ANDROID_trackables_qr_code
-
type
должен бытьXR_TYPE_TRACKABLE_QR_CODE_ANDROID
-
next
должен бытьNULL
или действительным указателем на следующую структуру в цепочке структур -
trackingState
должно быть допустимым значениемXrTrackingStateANDROID
- Если
bufferCapacityInput
не равен0
,buffer
должен быть указателем на массив значений типаbufferCapacityInput
Пример кода для получения отслеживаемых 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, 05 февраля 2025 г. (Левана Чен)
- Первоначальное описание расширения.
OpenXR™ и логотип OpenXR являются товарными знаками компании Khronos Group Inc. и зарегистрированы в качестве товарных знаков в Китае, Европейском Союзе, Японии и Великобритании.