XR_ANDROID_trackables_marker
Name String
XR_ANDROID_trackables_marker
Type d'extension
Extension d'instance
Numéro d'extension enregistré
708
Révision
1
État de la ratification
Non ratifié
Dépendances d'extension et de version
XR_ANDROID_trackables
État d'abandon
- Obsolète par l'extension
XR_EXT_spatial_marker_tracking
Date de dernière modification
03/07/2025
État de l'adresse IP
Aucune réclamation de propriété intellectuelle connue.
Participants
Christopher Doer, Google
Diego Tipaldi, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Ken Mackay, Google
Daniel Guttenberg, Qualcomm
Présentation
Cette extension permet de suivre les marqueurs physiques et permet aux applications d'associer du contenu XR à des marqueurs physiques de manière efficace.
L'extension est compatible avec les types de repères bien connus, en particulier les tags ArUco et April. Il permet aux environnements d'exécution de prendre en charge l'estimation de la taille des repères.
Autorisations
Les applications Android doivent inclure l'autorisation android.permission.SCENE_UNDERSTANDING_COARSE dans leur fichier manifeste, car cette extension dépend de XR_ANDROID_trackables et expose la géométrie de l'environnement. L'autorisation android.permission.SCENE_UNDERSTANDING_COARSE est considérée comme une autorisation dangereuse, ce qui signifie que les applications doivent la demander explicitement.
(niveau de protection : dangereux)
Inspecter les capacités du système
La structure XrSystemMarkerTrackingPropertiesANDROID est définie comme suit :
typedef struct XrSystemMarkerTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsMarkerTracking;
XrBool32 supportsMarkerSizeEstimation;
uint16_t maxMarkerCount;
} XrSystemMarkerTrackingPropertiesANDROID;
Descriptions des membres
typeest le XrStructureType de 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 OpenXR de base ou dans cette extension. Pour en savoir plus sur la chaîne de structure, consultez la structure étendue ( XrSystemProperties).supportsMarkerTrackingest unXrBool32indiquant si le système actuel fournit une fonctionnalité de suivi des marqueurs.supportsMarkerSizeEstimationest unXrBool32indiquant si le système actuel fournit une estimation de la taille du repère.maxMarkerCountest le nombre maximal de repères que l'environnement d'exécution peut suivre en même temps.
Une application peut vérifier si le système est capable de suivre les repères en étendant XrSystemProperties avec la structure XrSystemMarkerTrackingPropertiesANDROID lors de l'appel de xrGetSystemProperties . L'environnement d'exécution doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED pour la création du tracker de repères si et seulement si supportsMarkerTracking est XR_FALSE .
Si un environnement d'exécution accepte le suivi des repères, maxMarkerCount doit être supérieur ou égal à 1.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrSystemMarkerTrackingPropertiesANDROID. -
typedoit êtreXR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Marqueurs de suivi
Cette extension ajoute XR_TRACKABLE_TYPE_MARKER_ANDROID à XrTrackableTypeANDROID .
L'application crée un XrTrackableTrackerANDROID en appelant xrCreateTrackableTrackerANDROID et en spécifiant XR_TRACKABLE_TYPE_MARKER_ANDROID comme type d'élément traçable dans XrTrackableTrackerCreateInfoANDROID :: trackableType, et en définissant une configuration valide en ajoutant un XrTrackableMarkerConfigurationANDROID à la chaîne suivante de XrTrackableTrackerCreateInfoANDROID .
L'environnement d'exécution doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED si XrTrackableTrackerCreateInfoANDROID :: trackableType est XR_TRACKABLE_TYPE_MARKER_ANDROID et que XrSystemMarkerTrackingPropertiesANDROID :: supportsMarkerTracking renvoie XR_FALSE via xrGetSystemProperties .
La structure XrTrackableMarkerConfigurationANDROID est définie comme suit :
typedef struct XrTrackableMarkerConfigurationANDROID {
XrStructureType type;
void* next;
XrTrackableMarkerTrackingModeANDROID trackingMode;
uint32_t databaseCount;
const XrTrackableMarkerDatabaseANDROID* databases;
} XrTrackableMarkerConfigurationANDROID;
Descriptions des membres
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures.trackingModeest un XrTrackableMarkerTrackingModeANDROID indiquant le mode de suivi souhaité.databaseCountest unuint32_tdécrivant le nombre d'éléments dans le tableaudatabases.databasesest un pointeur vers un tableau de XrTrackableMarkerDatabaseANDROID , chacun contenant les repères souhaités d'un dictionnaire donné à suivre.
L'application doit définir une configuration valide en ajoutant un XrTrackableMarkerConfigurationANDROID à la chaîne XrTrackableTrackerCreateInfoANDROID :: next lors de l'appel de xrCreateTrackableTrackerANDROID avec XrTrackableTrackerCreateInfoANDROID :: trackableType défini sur XR_TRACKABLE_TYPE_MARKER_ANDROID . Sinon, si le type de traceur est défini comme ci-dessus, mais que la structure de configuration n'est pas présente ou n'est pas valide, l'environnement d'exécution doit renvoyer XR_ERROR_VALIDATION_FAILURE .
Si un environnement d'exécution est compatible avec l'estimation de la taille des repères, l'application peut définir XrTrackableMarkerDatabaseEntryANDROID :: edgeSize sur 0 dans XrTrackableMarkerDatabaseANDROID :: entries pour indiquer l'utilisation de l'estimation de la taille. Sinon, l'application doit définir XrTrackableMarkerDatabaseEntryANDROID :: edgeSize sur une valeur positive, ou l'environnement d'exécution doit renvoyer XR_ERROR_VALIDATION_FAILURE .
L'environnement d'exécution doit filtrer la sortie de xrGetAllTrackablesANDROID pour qu'elle corresponde à trackingMode et XrTrackableMarkerDatabaseEntryANDROID :: edgeSize .
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerConfigurationANDROID. -
typedoit êtreXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
trackingModedoit être une valeur XrTrackableMarkerTrackingModeANDROID valide -
databasesdoit être un pointeur vers un tableau de structures XrTrackableMarkerDatabaseANDROID validesdatabaseCount - Le paramètre
databaseCountdoit être supérieur à0.
L'énumération XrTrackableMarkerTrackingModeANDROID décrit les modes de suivi compatibles des repères.
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;
Descriptions des énumérants
XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID: suivi des repères dynamiques. Ce mode offre la plus grande précision et fonctionne sur les repères mobiles et statiques, mais il consomme également le plus d'énergie.XR_TRACKABLE_MARKER_TRACKING_MODE_STATIC_ANDROID: suivi des repères statiques. Ce mode est principalement utile pour les repères connus comme étant statiques, ce qui permet de réduire la consommation d'énergie par rapport au mode dynamique.
La structure XrTrackableMarkerDatabaseANDROID définit un dictionnaire et les ID de repères correspondants à suivre.
typedef struct XrTrackableMarkerDatabaseANDROID {
XrTrackableMarkerDictionaryANDROID dictionary;
uint32_t entryCount;
const XrTrackableMarkerDatabaseEntryANDROID* entries;
} XrTrackableMarkerDatabaseANDROID;
Descriptions des membres
dictionaryest le XrTrackableMarkerDictionaryANDROID auquel appartiennent tous lesentries.entryCountest un uint32_t décrivant le nombre d'éléments dans le tableauentries. L'application peut définirentryCount0pour suivre tous les repères dansdictionary.entriesest un pointeur vers un tableau de XrTrackableMarkerDatabaseEntryANDROID , chacun contenant la configuration d'un repère à suivre.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerDatabaseANDROID. -
dictionarydoit être une valeur XrTrackableMarkerDictionaryANDROID valide - Si
entryCountn'est pas0,entriesdoit être un pointeur vers un tableau de structuresentryCountXrTrackableMarkerDatabaseEntryANDROID.
L'énumération XrTrackableMarkerDictionaryANDROID décrit les dictionnaires de repères compatibles.
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;
La structure XrTrackableMarkerDatabaseEntryANDROID configure un seul ID de repère d'un dictionnaire.
typedef struct XrTrackableMarkerDatabaseEntryANDROID {
int32_t id;
float edgeSize;
} XrTrackableMarkerDatabaseEntryANDROID;
Descriptions des membres
idest l'ID du repère, tel qu'il est indiqué dans le dictionnaire.edgeSizereprésente la taille du bord du repère en mètres. Si l'environnement d'exécution est compatible avec l'estimation de la taille des repères, l'application peut définir cette valeur sur zéro, et la taille des repères sera estimée en ligne. Si cette valeur est définie sur zéro, mais que l'environnement d'exécution n'est pas compatible avec l'estimation de la taille des repères, l'environnement d'exécution doit renvoyerXR_ERROR_VALIDATION_FAILURE.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerDatabaseEntryANDROID.
Obtenir des repères
La fonction xrGetTrackableMarkerANDROID est définie comme suit :
XrResult xrGetTrackableMarkerANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableMarkerANDROID* markerOutput);
Description des paramètres
trackerest l'XrTrackableTrackerANDROID à interroger.getInfoest l'élément XrTrackableGetInfoANDROID contenant les informations utilisées pour obtenir le repère traçable.markerOutputest un pointeur vers la structure XrTrackableMarkerANDROID dans laquelle le repère traçable est renvoyé.
L'environnement d'exécution doit renvoyer XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID si le type d'élément traçable de XrTrackableANDROID n'est pas XR_TRACKABLE_TYPE_MARKER_ANDROID ou si le type d'élément traçable de XrTrackableTrackerANDROID n'est pas XR_TRACKABLE_TYPE_MARKER_ANDROID .
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'appeler xrGetTrackableMarkerANDROID. -
trackerdoit être un handle XrTrackableTrackerANDROID valide -
getInfodoit être un pointeur vers une structure XrTrackableGetInfoANDROID valide -
markerOutputdoit être un pointeur vers une structure XrTrackableMarkerANDROID.
Codes renvoyés
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_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
La structure XrTrackableMarkerANDROID est définie comme suit :
typedef struct XrTrackableMarkerANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrTrackableMarkerDictionaryANDROID dictionary;
int32_t markerId;
XrPosef centerPose;
XrExtent2Df extents;
} XrTrackableMarkerANDROID;
Descriptions des membres
typeest le XrStructureType de 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 OpenXR de base ou dans cette extension.trackingStateest l'état XrTrackingStateANDROID du repère.lastUpdatedTimeest l'XrTimede la dernière mise à jour du repère.dictionaryest le XrTrackableMarkerDictionaryANDROID du repère.markerIdest l'ID du repère, tel qu'il est indiqué dans le dictionnaire.centerPoseest le XrPosef du repère situé dans XrTrackableGetInfoANDROID ::baseSpace. Le repère se trouve dans le plan XZ, avec X pointant vers la droite du repère, Z pointant vers le bas et Y sortant du repère comme la normale.extentscorrespond aux dimensions XrExtent2Df du repère. La limite du cadre de délimitation se trouve aux points :centerPose+/- (extents/ 2).
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerANDROID. -
typedoit êtreXR_TYPE_TRACKABLE_MARKER_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
trackingStatedoit être une valeur XrTrackingStateANDROID valide -
dictionarydoit être une valeur XrTrackableMarkerDictionaryANDROID valide
Exemple de code pour obtenir des repères traçables
L'exemple de code suivant montre comment obtenir des repères 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_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));
Nouvelles commandes
Nouvelles structures
- XrTrackableMarkerANDROID
- XrTrackableMarkerDatabaseANDROID
- XrTrackableMarkerDatabaseEntryANDROID
Extension de XrSystemProperties :
Extension de XrTrackableTrackerCreateInfoANDROID :
Nouvelles énumérations
Nouvelles constantes d'énumération
XR_ANDROID_TRACKABLES_MARKER_EXTENSION_NAMEXR_ANDROID_trackables_marker_SPEC_VERSIONExtension de XrStructureType :
XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_MARKER_ANDROIDXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID
Extension de XrTrackableTypeANDROID :
XR_TRACKABLE_TYPE_MARKER_ANDROID
Problèmes
Historique des versions
Révision 1, 23/07/2025 (Levana Chen)
- Description initiale de l'extension.