XR_ANDROID_trackables_marker
Name String
XR_ANDROID_trackables_marker
Erweiterungstyp
Instanzerweiterung
Registrierte Erweiterungsnummer
708
Revision
1
Ratifizierungsstatus
Nicht ratifiziert
Abhängigkeiten von Erweiterungen und Versionen
XR_ANDROID_trackables
Einstellungsstatus
- Eingestellt durch die Erweiterung
XR_EXT_spatial_marker_tracking
Datum der letzten Änderung
23.07.2025
IP-Status
Keine bekannten IP-Ansprüche.
Mitwirkende
Christopher Doer, Google
Diego Tipaldi, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Ken Mackay, Google
Daniel Guttenberg, Qualcomm
Übersicht
Diese Erweiterung ermöglicht das Tracking physischer Marker und ermöglicht Anwendungen, XR-Inhalte auf effiziente Weise an physische Marker anzuhängen.
Die Erweiterung unterstützt bekannte Markertypen, insbesondere ArUco- und April-Tags. Sie ermöglicht es Runtimes, optional die Schätzung der Markergröße zu unterstützen.
Berechtigungen
Android-Anwendungen müssen die Berechtigung android.permission.SCENE_UNDERSTANDING_COARSE in ihrem Manifest auflisten, da diese Erweiterung von XR_ANDROID_trackables abhängt und die Geometrie der Umgebung offenlegt. Die Berechtigung android.permission.SCENE_UNDERSTANDING_COARSE gilt als gefährliche Berechtigung. Das heißt, Anwendungen müssen die Berechtigung explizit anfordern.
(Schutzstufe: gefährlich)
Systemfunktionen prüfen
Die Struktur XrSystemMarkerTrackingPropertiesANDROID ist so definiert:
typedef struct XrSystemMarkerTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsMarkerTracking;
XrBool32 supportsMarkerSizeEstimation;
uint16_t maxMarkerCount;
} XrSystemMarkerTrackingPropertiesANDROID;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. In OpenXR Core oder dieser Erweiterung sind keine solchen Strukturen definiert. Weitere Informationen zur Strukturkette finden Sie in der Struktur, die erweitert wird ( XrSystemProperties).supportsMarkerTrackingist einXrBool32, das angibt, ob das aktuelle System die Funktion zum Tracking von Markern bietet.supportsMarkerSizeEstimationist einXrBool32, das angibt, ob das aktuelle System die Schätzung der Markergröße bietet.maxMarkerCountist die maximale Anzahl von Markern, die die Runtime gleichzeitig tracken kann.
Eine Anwendung kann prüfen, ob das System Marker-Tracking unterstützt, indem sie die XrSystemProperties beim Aufruf von xrGetSystemProperties mit der Struktur XrSystemMarkerTrackingPropertiesANDROID erweitert . Die Runtime muss XR_ERROR_FEATURE_UNSUPPORTED für die Erstellung des Marker-Trackers zurückgeben, wenn supportsMarkerTracking XR_FALSE ist .
Wenn eine Runtime Marker-Tracking unterstützt, muss maxMarkerCount mindestens 1 sein.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_trackables_markermuss aktiviert sein, bevor XrSystemMarkerTrackingPropertiesANDROID verwendet wird. -
typemuss seinXR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID -
nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.
Marker tracken
Diese Erweiterung fügt XR_TRACKABLE_TYPE_MARKER_ANDROID zu XrTrackableTypeANDROID hinzu .
Die Anwendung erstellt einen XrTrackableTrackerANDROID, indem sie xrCreateTrackableTrackerANDROID aufruft und XR_TRACKABLE_TYPE_MARKER_ANDROID als trackbaren Typ in XrTrackableTrackerCreateInfoANDROID :: trackableType angibt. Außerdem muss eine gültige Konfiguration festgelegt werden, indem XrTrackableMarkerConfigurationANDROID zur nächsten Kette von XrTrackableTrackerCreateInfoANDROID hinzugefügt wird.
Die Runtime muss XR_ERROR_FEATURE_UNSUPPORTED zurückgeben, wenn XrTrackableTrackerCreateInfoANDROID :: trackableType XR_TRACKABLE_TYPE_MARKER_ANDROID ist und XrSystemMarkerTrackingPropertiesANDROID :: supportsMarkerTracking über xrGetSystemProperties XR_FALSE zurückgibt .
Die Struktur XrTrackableMarkerConfigurationANDROID ist so definiert:
typedef struct XrTrackableMarkerConfigurationANDROID {
XrStructureType type;
void* next;
XrTrackableMarkerTrackingModeANDROID trackingMode;
uint32_t databaseCount;
const XrTrackableMarkerDatabaseANDROID* databases;
} XrTrackableMarkerConfigurationANDROID;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette.trackingModeist ein XrTrackableMarkerTrackingModeANDROID, das den gewünschten Modus für das Tracking angibt.databaseCountist einuint32_t, das die Anzahl der Elemente im Arraydatabasesbeschreibt.databasesist ein Zeiger auf ein Array von XrTrackableMarkerDatabaseANDROID, das jeweils die gewünschten Marker aus einem bestimmten Wörterbuch enthält, die getrackt werden sollen.
Die Anwendung muss eine gültige Konfiguration festlegen, indem sie beim Aufruf von xrCreateTrackableTrackerANDROID mit XrTrackableTrackerCreateInfoANDROID :: trackableType auf XR_TRACKABLE_TYPE_MARKER_ANDROID eine XrTrackableMarkerConfigurationANDROID zur Kette XrTrackableTrackerCreateInfoANDROID :: next hinzufügt . Wenn der Tracker-Typ wie oben festgelegt ist, die Konfigurationsstruktur aber nicht vorhanden oder ungültig ist, muss die Runtime XR_ERROR_VALIDATION_FAILURE zurückgeben .
Wenn eine Runtime die Schätzung der Markergröße unterstützt, kann die Anwendung XrTrackableMarkerDatabaseEntryANDROID :: edgeSize in XrTrackableMarkerDatabaseANDROID :: entries auf 0 setzen, um die Schätzung der Größe anzugeben. Andernfalls muss die Anwendung XrTrackableMarkerDatabaseEntryANDROID :: edgeSize auf einen positiven Wert setzen oder die Runtime muss XR_ERROR_VALIDATION_FAILURE zurückgeben .
Die Runtime muss die Ausgabe von xrGetAllTrackablesANDROID so filtern, dass sie mit trackingMode und XrTrackableMarkerDatabaseEntryANDROID :: edgeSize übereinstimmt .
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_trackables_markermuss aktiviert sein, bevor XrTrackableMarkerConfigurationANDROID verwendet wird. -
typemuss seinXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID -
nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein. -
trackingModemuss ein gültiger XrTrackableMarkerTrackingModeANDROID Wert sein. -
databasesmuss ein Zeiger auf ein Array vondatabaseCountgültigen XrTrackableMarkerDatabaseANDROID-Strukturen sein. - Der
databaseCountParameter muss größer als0sein.
Die XrTrackableMarkerTrackingModeANDROID-Enum beschreibt die unterstützten Tracking-Modi von Markern.
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;
Beschreibungen der Enumeranten
XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID– Dynamische Marker tracken. Dieser Modus bietet die höchste Genauigkeit und funktioniert mit beweglichen und statischen Markern, hat aber auch den höchsten Stromverbrauch.XR_TRACKABLE_MARKER_TRACKING_MODE_STATIC_ANDROID– Statische Marker tracken. Dieser Modus ist hauptsächlich für Marker nützlich, die bekanntermaßen statisch sind, was im Vergleich zum dynamischen Modus zu einem geringeren Stromverbrauch führt.
Die Struktur XrTrackableMarkerDatabaseANDROID definiert ein Wörterbuch und die entsprechenden Marker-IDs, die getrackt werden sollen.
typedef struct XrTrackableMarkerDatabaseANDROID {
XrTrackableMarkerDictionaryANDROID dictionary;
uint32_t entryCount;
const XrTrackableMarkerDatabaseEntryANDROID* entries;
} XrTrackableMarkerDatabaseANDROID;
Mitgliederbeschreibungen
dictionaryist das XrTrackableMarkerDictionaryANDROID, zu dem alleentriesgehören.entryCountist ein uint32_t, das die Anzahl der Elemente im Arrayentriesbeschreibt. Die Anwendung kannentryCountauf0setzen, um alle Marker imdictionaryzu tracken .entriesist ein Zeiger auf ein Array von XrTrackableMarkerDatabaseEntryANDROID , das jeweils die Konfiguration eines zu trackenden Markers enthält.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_trackables_markermuss aktiviert sein, bevor XrTrackableMarkerDatabaseANDROID verwendet wird. -
dictionarymuss ein gültiger XrTrackableMarkerDictionaryANDROID Wert sein. - Wenn
entryCountnicht0ist ,entriesmuss ein Zeiger auf ein Array vonentryCountXrTrackableMarkerDatabaseEntryANDROID-Strukturen sein.
Die XrTrackableMarkerDictionaryANDROID-Enum beschreibt die unterstützten Marker-Wörterbücher.
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;
Die Struktur XrTrackableMarkerDatabaseEntryANDROID konfiguriert eine einzelne Marker-ID eines Wörterbuchs.
typedef struct XrTrackableMarkerDatabaseEntryANDROID {
int32_t id;
float edgeSize;
} XrTrackableMarkerDatabaseEntryANDROID;
Mitgliederbeschreibungen
idist die Marker-ID, wie im Wörterbuch angegeben.edgeSizegibt die Größe des Markerrands in Metern an. Wenn die Runtime die Schätzung der Markergröße unterstützt, kann die Anwendung diesen Wert auf null setzen. Die Markergröße wird dann online geschätzt. Wenn dieser Wert auf null gesetzt ist, die Runtime aber die Schätzung der Markergröße nicht unterstützt, muss die RuntimeXR_ERROR_VALIDATION_FAILUREzurückgeben .
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_trackables_markermuss aktiviert sein, bevor XrTrackableMarkerDatabaseEntryANDROID verwendet wird.
Marker abrufen
Die Funktion xrGetTrackableMarkerANDROID ist so definiert:
XrResult xrGetTrackableMarkerANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableMarkerANDROID* markerOutput);
Parameterbeschreibungen
trackerist der XrTrackableTrackerANDROID, der abgefragt werden soll.getInfoist das XrTrackableGetInfoANDROID mit den Informationen, die zum Abrufen der trackbaren Markierung verwendet werden.markerOutputist ein Zeiger auf die XrTrackableMarkerANDROID-Struktur, in der der trackbare Marker zurückgegeben wird.
Die Runtime muss XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID zurückgeben , wenn der trackbare Typ des XrTrackableANDROID nicht XR_TRACKABLE_TYPE_MARKER_ANDROID ist oder wenn der trackbare Typ des XrTrackableTrackerANDROID nicht XR_TRACKABLE_TYPE_MARKER_ANDROID ist .
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_trackables_markermuss aktiviert sein, bevor xrGetTrackableMarkerANDROID aufgerufen wird. -
trackermuss ein gültiger XrTrackableTrackerANDROID Handle sein. -
getInfomuss ein Zeiger auf eine gültige XrTrackableGetInfoANDROID-Struktur sein. -
markerOutputmuss ein Zeiger auf eine XrTrackableMarkerANDROID-Struktur sein.
Rückgabecodes
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
Die Struktur XrTrackableMarkerANDROID ist so definiert:
typedef struct XrTrackableMarkerANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrTrackableMarkerDictionaryANDROID dictionary;
int32_t markerId;
XrPosef centerPose;
XrExtent2Df extents;
} XrTrackableMarkerANDROID;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. In OpenXR Core oder dieser Erweiterung sind keine solchen Strukturen definiert.trackingStateist der XrTrackingStateANDROID des Markers.lastUpdatedTimeist dieXrTimeder letzten Aktualisierung des Markers.dictionaryist das XrTrackableMarkerDictionaryANDROID des Markers.markerIdist die Marker-ID, wie im Wörterbuch angegeben.centerPoseist die XrPosef der Markierung in XrTrackableGetInfoANDROID ::baseSpace. Der Marker liegt in der XZ-Ebene, wobei X nach rechts vom Marker und Z nach unten zeigt und Y als Normale aus dem Marker kommt.extentssind die XrExtent2Df-Abmessungen des Markers. Die Grenze des Begrenzungsrahmens liegt an den Punkten:centerPose+/- (extents/ 2).
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_trackables_markermuss aktiviert sein, bevor XrTrackableMarkerANDROID verwendet wird. -
typemuss seinXR_TYPE_TRACKABLE_MARKER_ANDROID -
nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein. -
trackingStatemuss ein gültiger XrTrackingStateANDROID-Wert sein. -
dictionarymuss ein gültiger XrTrackableMarkerDictionaryANDROID Wert sein.
Beispielcode zum Abrufen trackbarer Marker
Der folgende Beispielcode zeigt, wie Sie trackbare Marker abrufen.
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));
Neue Befehle
Neue Strukturen
- XrTrackableMarkerANDROID
- XrTrackableMarkerDatabaseANDROID
- XrTrackableMarkerDatabaseEntryANDROID
XrSystemProperties erweitern :
XrTrackableTrackerCreateInfoANDROID erweitern :
Neue Enums
Neue Enum-Konstanten
XR_ANDROID_TRACKABLES_MARKER_EXTENSION_NAMEXR_ANDROID_trackables_marker_SPEC_VERSIONXrStructureType erweitern :
XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_MARKER_ANDROIDXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID
XrTrackableTypeANDROID erweitern :
XR_TRACKABLE_TYPE_MARKER_ANDROID
Probleme
Versionsverlauf
Revision 1, 23.07.2025 (Levana Chen)
- Erste Beschreibung der Erweiterung.