XR_ANDROID_trackables_qr_code
String do nome
XR_ANDROID_trackables_qr_code
Tipo de extensão
Extensão de instância
Número de extensão registrada
709
Revisão
1
Status de ratificação
Não ratificado
Dependências de extensão e versão
XR_ANDROID_trackables
Estado de descontinuação
- Descontinuado pela extensão
XR_EXT_spatial_marker_tracking
Data da última modificação
2025-02-05
Status de IP
Nenhuma reivindicação de IP conhecida.
Colaboradores
Christopher Doer, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Diego Tipaldi, Google
Ken Mackay, Google
Daniel Guttenberg, Qualcomm
Visão geral
Essa extensão permite o rastreamento de QR codes físicos e a decodificação de dados de QR codes.
Permissões
Os aplicativos Android precisam ter a permissão android.permission.SCENE_UNDERSTANDING_COARSE listada no manifesto, já que essa extensão depende de XR_ANDROID_trackables e expõe a geometria do ambiente. A permissão android.permission.SCENE_UNDERSTANDING_COARSE é considerada perigosa.
(nível de proteção: perigoso)
Inspecionar a capacidade do sistema
A estrutura XrSystemQrCodeTrackingPropertiesANDROID é definida como:
typedef struct XrSystemQrCodeTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsQrCodeTracking;
XrBool32 supportsQrCodeSizeEstimation;
uint16_t maxQrCodeCount;
} XrSystemQrCodeTrackingPropertiesANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nessa extensão.supportsQrCodeTrackingé umXrBool32que indica se o sistema atual oferece capacidade de rastreamento de QR code.supportsQrCodeSizeEstimationé umXrBool32que indica se o sistema atual oferece estimativa de tamanho de QR code.maxQrCodeCounté o número máximo total de QR codes que podem ser rastreados ao mesmo tempo.
Um aplicativo pode inspecionar se o sistema é capaz de rastrear QR codes estendendo o XrSystemProperties com a estrutura XrSystemQrCodeTrackingPropertiesANDROID ao chamar xrGetSystemProperties . O ambiente de execução precisa retornar XR_ERROR_FEATURE_UNSUPPORTED para a criação do rastreador de QR code se e somente se supportsQrCodeTracking for XR_FALSE .
Se um ambiente de execução oferece suporte ao rastreamento de QR code, maxQrCodeCount precisa ser pelo menos 1. Se um ambiente de execução não oferece suporte ao rastreamento de QR code, maxQrCodeCount precisa ser 0.
Uso válido (implícito)
- A extensão
XR_ANDROID_trackables_qr_codeprecisa ser ativada antes de usar XrSystemQrCodeTrackingPropertiesANDROID -
typeprecisa serXR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas
Rastrear QR codes
Essa extensão adiciona XR_TRACKABLE_TYPE_QR_CODE_ANDROID a XrTrackableTypeANDROID .
O aplicativo pode criar um XrTrackableTrackerANDROID chamando xrCreateTrackableTrackerANDROID e especificando XR_TRACKABLE_TYPE_QR_CODE_ANDROID como o tipo rastreável em XrTrackableTrackerCreateInfoANDROID :: trackableType para rastrear QR codes.
O ambiente de execução precisa retornar XR_ERROR_FEATURE_UNSUPPORTED se XrTrackableTrackerCreateInfoANDROID :: trackableType for XR_TRACKABLE_TYPE_QR_CODE_ANDROID e XrSystemQrCodeTrackingPropertiesANDROID :: supportsQrCodeTracking retornar XR_FALSE via xrGetSystemProperties .
A estrutura XrTrackableQrCodeConfigurationANDROID é definida como:
typedef struct XrTrackableQrCodeConfigurationANDROID {
XrStructureType type;
void* next;
XrQrCodeTrackingModeANDROID trackingMode;
float qrCodeEdgeSize;
} XrTrackableQrCodeConfigurationANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nessa extensão.trackingModeé um XrQrCodeTrackingModeANDROID que indica o modo desejado para rastreamento.qrCodeEdgeSizeindica o tamanho da borda do QR code em metros. Se for zero, o ambiente de execução estima o tamanho do QR code on-line.
O aplicativo precisa definir uma configuração válida adicionando um XrTrackableQrCodeConfigurationANDROID à próxima cadeia de XrTrackableTrackerCreateInfoANDROID . Caso contrário, o ambiente de execução precisa retornar XR_ERROR_VALIDATION_FAILURE .
Se o ambiente de execução oferece suporte à estimativa de tamanho de QR code, o aplicativo pode definir XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize como 0.0 para indicar o uso da estimativa de tamanho.
Se o ambiente de execução não oferece suporte à estimativa de tamanho de QR code, o aplicativo precisa definir XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize como um valor positivo. Caso contrário, o ambiente de execução precisa retornar XR_ERROR_VALIDATION_FAILURE.
O ambiente de execução precisa filtrar a saída de xrGetAllTrackablesANDROID para corresponder ao trackingMode . Se XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize não estiver definido como 0.0, o ambiente de execução precisa retornar apenas QR codes que correspondam a esse tamanho. Se XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize estiver definido como 0.0, o ambiente de execução precisa retornar todos os QR codes com tamanho estimado.
Uso válido (implícito)
- A extensão
XR_ANDROID_trackables_qr_codeprecisa ser ativada antes de usar XrTrackableQrCodeConfigurationANDROID. -
typeprecisa serXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas . Consulte também: XrTrackableQrCodeVersionFilterQCOM -
trackingModeprecisa ser um valor XrQrCodeTrackingModeANDROID válido.
O tipo enumerado XrQrCodeTrackingModeANDROID descreve os modos de rastreamento compatíveis de QR codes.
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;
Descrições de enumeradores
XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID: rastreamento de QR codes dinâmicos. Esse modo tem a maior precisão e funciona em QR codes estáticos e em movimento, mas também tem o maior consumo de energia.XR_QR_CODE_TRACKING_MODE_STATIC_ANDROID: rastreamento de QR codes estáticos. Esse modo é útil principalmente para QR codes conhecidos como estáticos, o que leva a um menor consumo de energia em comparação com o modo dinâmico.XR_QR_CODE_TRACKING_MODE_ANCHORED_QCOM: esse modo deve ser usado para QR codes estáticos. Ao contrário do modo estático, esse modo rastreia o QR code apenas uma vez e atualiza as posições das instâncias rastreadas com base na posição do dispositivo. Como resultado, o rastreamento continua mesmo que o QR code saia da visualização do frame de referência. Isso leva a um consumo mínimo de energia depois que o QR code é rastreado. (Adicionado pela extensãoXR_QCOM_trackables_qr_code_operations)
Receber QR codes
A função xrGetTrackableQrCodeANDROID é definida como:
XrResult xrGetTrackableQrCodeANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableQrCodeANDROID* qrCodeOutput);
Descrições dos parâmetros
trackeré o XrTrackableTrackerANDROID a ser consultado.getInfoé o XrTrackableGetInfoANDROID com as informações usadas para receber o QR code rastreável.qrCodeOutputé um ponteiro para a estrutura XrTrackableQrCodeANDROID em que o QR code rastreável é retornado.
O ambiente de execução precisa retornar XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID se o tipo rastreável do XrTrackableANDROID não for XR_TRACKABLE_TYPE_QR_CODE_ANDROID ou se o tipo rastreável do XrTrackableTrackerANDROID não for XR_TRACKABLE_TYPE_QR_CODE_ANDROID .
Uso válido (implícito)
- A extensão
XR_ANDROID_trackables_qr_codeprecisa ser ativada antes de chamar xrGetTrackableQrCodeANDROID. -
trackerprecisa ser um identificador XrTrackableTrackerANDROID válido. -
getInfoprecisa ser um ponteiro para uma estrutura XrTrackableGetInfoANDROID válida. -
qrCodeOutputprecisa ser um ponteiro para uma estrutura XrTrackableQrCodeANDROID.
Códigos de retorno
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
A estrutura XrTrackableQrCodeANDROID é definida como:
typedef struct XrTrackableQrCodeANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrPosef centerPose;
XrExtent2Df extents;
uint32_t bufferCapacityInput;
uint32_t bufferCountOutput;
char* buffer;
} XrTrackableQrCodeANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nessa extensão.trackingStateé o XrTrackingStateANDROID do QR code.lastUpdatedTimeé oXrTimeda última atualização do QR code. SelastUpdatedTimefor alterado da última chamada, todos os outros campos poderão ter sido alterados.centerPoseé o XrPosef do QR code localizado em XrTrackableGetInfoANDROID ::baseSpace. O QR code fica no plano XZ com X apontando para a direita do QR code, Z apontando para a parte de baixo e Y saindo do QR code como o normal.extentssão as dimensões XrExtent2Df do QR code. O limite da caixa delimitadora está nos pontos:centerPose+/- (extents/ 2).bufferCapacityInputé a capacidade dobufferou0para recuperar a capacidade necessária.bufferCountOutput: sebufferCapacityInputfor0, o ambiente de execução vai gravar o tamanho do buffer necessário embufferCountOutput. Caso contrário, ele contém o total de elementos gravados embuffer. Se os dados do QR code ainda não tiverem sido decodificados, o ambiente de execução precisa definir bufferCountOutput como 0.bufferé um ponteiro para uma matriz decharpara gravar os dados decodificados do QR code. Se o aplicativo não se importa com os dados decodificados do QR code, ele pode transmitirnullptre omitir a segunda chamada de duas chamadas. Os dados do QR code são retornados como uma string UTF-8 terminada em nulo.- Consulte a seção Parâmetros de tamanho do buffer para uma descrição detalhada de como recuperar o tamanho
buffernecessário.
Uso válido (implícito)
- A extensão
XR_ANDROID_trackables_qr_codeprecisa ser ativada antes de usar XrTrackableQrCodeANDROID -
typeprecisa serXR_TYPE_TRACKABLE_QR_CODE_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas . Consulte também: XrTrackableQrCodeVersionQCOM -
trackingStateprecisa ser um valor XrTrackingStateANDROID válido. - Se
bufferCapacityInputnão for0,bufferprecisa ser um ponteiro para uma matriz de valores de caracterebufferCapacityInput.
Exemplo de código para receber QR codes rastreáveis
O exemplo de código a seguir demonstra como receber QR codes rastreáveis.
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));
Novos comandos
Novas estruturas
- XrTrackableQrCodeANDROID
Estendendo XrSystemProperties :
Estendendo XrTrackableTrackerCreateInfoANDROID :
Novos tipos enumerados
Novas constantes de tipo enumerado
XR_ANDROID_TRACKABLES_QR_CODE_EXTENSION_NAMEXR_ANDROID_trackables_qr_code_SPEC_VERSIONEstendendo XrStructureType :
XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID
Estendendo XrTrackableTypeANDROID :
XR_TRACKABLE_TYPE_QR_CODE_ANDROID
Problemas
Histórico de versões
Revisão 1, 05/02/2025 (Levana Chen)
- Descrição inicial da extensão.