Chaîne de nom
XR_ANDROID_trackables_qr_code
Type d'extension
Extension d'instance
Numéro d'extension enregistré
460
Révision
1
Dépendances des extensions et des versions
Date de dernière modification
2025-02-05
État de l'adresse IP
Aucune réclamation connue pour atteinte à la propriété intellectuelle.
Contributeurs
Christopher Doer, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Diego Tipaldi, Google
Ken Mackay, Google
Daniel Gutenberg, Qualcomm
Présentation
Cette extension permet le suivi des codes QR physiques et le décodage des données des codes QR.
Inspecter les capacités du système
XrSystemQrCodeTrackingPropertiesANDROID
La structure XrSystemQrCodeTrackingPropertiesANDROID est définie comme suit :
typedef struct XrSystemQrCodeTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsQrCodeTracking;
XrBool32 supportsQrCodeSizeEstimation;
uint32_t maxQrCodeCount;
} XrSystemQrCodeTrackingPropertiesANDROID;
Descriptions des membres
typeest leXrStructureTypede cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.supportsQrCodeTrackingest unXrBool32indiquant si le système actuel permet le suivi par code QR.supportsQrCodeSizeEstimationest unXrBool32indiquant si le système actuel fournit une estimation de la taille du code QR.maxQrCodeCountcorrespond au nombre total maximal de codes QR pouvant être suivis en même temps.
Une application peut vérifier si le système est capable de suivre les codes QR en étendant XrSystemProperties avec la structure XrSystemQrCodeTrackingPropertiesANDROID lors de l'appel de xrGetSystemProperties.
Le runtime doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED pour la création d'un tracker de code QR si et seulement si supportsQrCodeTracking est XR_FALSE.
Si un environnement d'exécution est compatible avec le suivi des codes QR, il doit être compatible avec le suivi de maxQrCodeCount codes QR à tout moment.
Si un environnement d'exécution est compatible avec l'estimation de la taille du code QR, l'application peut définir XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize 0 pour indiquer l'utilisation de l'estimation de la taille.
Sinon, l'application doit définir XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize sur une valeur positive. Dans le cas contraire, XR_ERROR_VALIDATION_FAILURE sera renvoyé.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant d'utiliserXrSystemQrCodeTrackingPropertiesANDROID. typedoit êtreXR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROIDnextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures.
Suivre les codes QR
Cette extension ajoute XR_TRACKABLE_TYPE_QR_CODE_ANDROID à XrTrackableTypeANDROID.
L'application peut créer un XrTrackableTrackerANDROID en appelant xrCreateTrackableTrackerANDROID et en spécifiant XR_TRACKABLE_TYPE_QR_CODE_ANDROID comme type de suivi dans XrTrackableTrackerCreateInfoANDROID::trackableType pour suivre les codes QR.
L'exécution doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED si XrTrackableTrackerCreateInfoANDROID::trackableType est XR_TRACKABLE_TYPE_QR_CODE_ANDROID et que XrSystemQrCodeTrackingPropertiesANDROID::supportsQrCodeTracking renvoie XR_FALSE via xrGetSystemProperties.
XrTrackableQrCodeConfigurationANDROID
La structure XrTrackableQrCodeConfigurationANDROID est définie comme suit :
typedef struct XrTrackableQrCodeConfigurationANDROID {
XrStructureType type;
const void* next;
XrQrCodeTrackingModeANDROID trackingMode;
float qrCodeEdgeSize;
} XrTrackableQrCodeConfigurationANDROID;
Descriptions des membres
typeest leXrStructureTypede cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.trackingModeest unXrQrCodeTrackingModeANDROIDqui indique le mode de suivi souhaité.qrCodeEdgeSizeindique la taille du bord du code QR en mètres. Si la valeur est zéro, la taille du code QR sera estimée en ligne.
L'application doit définir une configuration valide en ajoutant un XrTrackableQrCodeConfigurationANDROID à la chaîne suivante de XrTrackableTrackerCreateInfoANDROID.
Sinon, le runtime doit renvoyer XR_ERROR_VALIDATION_FAILURE.
Si l'environnement d'exécution est compatible avec l'estimation de la taille du code QR, l'application peut définir XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize sur 0 pour indiquer l'utilisation de l'estimation de la taille.
Sinon, l'application doit définir XrTrackableQrCodeConfigurationANDROID::qrCodeEdgeSize sur une valeur positive. Dans le cas contraire, XR_ERROR_VALIDATION_FAILURE sera renvoyé.
L'exécution doit filtrer la sortie de xrGetAllTrackablesANDROID pour qu'elle corresponde à trackingMode et qrCodeEdgeSize.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant d'utiliserXrTrackableQrCodeConfigurationANDROID. typedoit êtreXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROIDnextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures.trackingModedoit être une valeurXrQrCodeTrackingModeANDROIDvalide
XrQrCodeTrackingModeANDROID
L'énumération XrQrCodeTrackingModeANDROID décrit les modes de suivi des codes QR compatibles.
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;
| Enum | Description , and unlock your rideXR_QR_CODE_TRACKING_MODE_STATIC_ANDROID '
| XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID | Le code QR est dynamique et peut se déplacer. |
Obtenir des codes QR
xrGetTrackableQrCodeANDROID
La fonction xrGetTrackableQrCodeANDROID est définie comme suit :
XrResult xrGetTrackableQrCodeANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableQrCodeANDROID* qrCodeOutput);
Descriptions des paramètres
trackerest leXrTrackableTrackerANDROIDà interroger.getInfoest leXrTrackableGetInfoANDROIDavec les informations utilisées pour obtenir le code QR traçable.qrCodeOutputest un pointeur vers la structureXrTrackableQrCodeANDROIDdans laquelle le code QR suivi est renvoyé.
Le runtime doit renvoyer XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID si le type de suivi de XrTrackableANDROID n'est pas XR_TRACKABLE_TYPE_QR_CODE_ANDROID ou si le type de suivi de XrTrackableTrackerANDROID n'est pas XR_TRACKABLE_TYPE_QR_CODE_ANDROID.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant l'appel dexrGetTrackableQrCodeANDROID. trackerdoit être un identifiantXrTrackableTrackerANDROIDvalidegetInfodoit être un pointeur vers une structureXrTrackableGetInfoANDROIDvalide.qrCodeOutputdoit être un pointeur vers une structureXrTrackableQrCodeANDROID.
XrTrackableQrCodeANDROID
La structure XrTrackableQrCodeANDROID est définie comme suit :
typedef struct XrTrackableQrCodeANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrPosef centerPose;
XrExtent2Df extents;
uint32_t bufferCapacityInput;
uint32_t bufferCountOutput;
char* buffer;
} XrTrackableQrCodeANDROID;
Descriptions des membres
typeest leXrStructureTypede cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.trackingStatecorrespond auXrTrackingStateANDROIDdu code QR.lastUpdatedTimecorrespond àXrTimede la dernière mise à jour du code QR.centerPosecorrespond àXrPosefdu code QR situé dansXrTrackableGetInfoANDROID::baseSpace. Le code QR se trouve dans le plan XZ, avec l'axe X pointant vers la droite du code QR et l'axe Z pointant vers le bas.extentscorrespond aux dimensionsXrExtent2Dfdu code QR. La limite du cadre de sélection se trouve aux points suivants :centerPose+/- (extents/ 2).bufferCapacityInputcorrespond à la capacité debufferou0à récupérer la capacité requise.bufferCountOutputSibufferCapacityInputest défini sur0, le runtime écrit la taille de mémoire tampon requise dansbufferCountOutput. Sinon, il contient le nombre total d'éléments écrits dansbuffer.bufferest un pointeur vers un tableau decharpour écrire les données du code QR décodé. L'application peut transmettre unnullptrpour déterminer la taille de mémoire tampon requise ou si elle ne demande pas les données du code QR à décoder. Les données du code QR sont renvoyées sous forme de chaîne UTF-8 terminée par un caractère nul.- Pour obtenir une description détaillée de la récupération de la taille
bufferrequise, consultez la section Paramètres de taille du tampon.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant d'utiliserXrTrackableQrCodeANDROID. typedoit êtreXR_TYPE_TRACKABLE_QR_CODE_ANDROIDnextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures.trackingStatedoit être une valeurXrTrackingStateANDROIDvalide- Si
bufferCapacityInputn'est pas0,bufferdoit être un pointeur vers un tableau de valeurs charbufferCapacityInput.
Exemple de code pour obtenir des codes QR traçables
L'exemple de code suivant montre comment obtenir des codes QR traçables.
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));
Nouvelles constantes d'énumération
L'énumération XrStructureType est étendue avec les éléments suivants :
XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_ANDROID
L'énumération XrTrackableTypeANDROID est étendue avec les éléments suivants :
XR_TRACKABLE_TYPE_QR_CODE_ANDROID
Nouvelles énumérations
XrQrCodeTrackingModeANDROID
Nouvelles structures
XrSystemQrCodeTrackingPropertiesANDROIDXrTrackableQrCodeConfigurationANDROIDXrTrackableQrCodeANDROID
Nouvelles fonctions
xrGetTrackableQrCodeANDROID
Problèmes
Historique des versions
- Révision 1, 2025-02-05 (Levana Chen)
- Description initiale de l'extension.
OpenXR™ et le logo OpenXR sont des marques déposées appartenant à The Khronos Group Inc. et sont enregistrées en Chine, dans l'Union européenne, au Japon et au Royaume-Uni.