XR_ANDROID_trackables_marker
Name String
XR_ANDROID_trackables_marker
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
708
Wersja
1
Stan ratyfikacji
Nie ratyfikowano
Zależności rozszerzeń i wersji
XR_ANDROID_trackables
Stan wycofania
- Wycofane przez rozszerzenie
XR_EXT_spatial_marker_tracking
Data ostatniej modyfikacji
2025-07-23
Stan IP
Brak znanych roszczeń dotyczących własności intelektualnej.
Twórcy
Christopher Doer, Google
Diego Tipaldi, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Ken Mackay, Google
Daniel Guttenberg, Qualcomm
Przegląd
To rozszerzenie umożliwia śledzenie znaczników fizycznych i pozwala aplikacjom na efektywne dołączanie treści XR do znaczników fizycznych.
Rozszerzenie obsługuje znane typy znaczników, w szczególności ArUco i AprilTag. Umożliwia środowiskom wykonawczym opcjonalną obsługę szacowania rozmiaru znacznika.
Uprawnienia
Aplikacje na Androida muszą mieć w pliku manifestu uprawnienie android.permission.SCENE_UNDERSTANDING_COARSE, ponieważ to rozszerzenie zależy od XR_ANDROID_trackables i ujawnia geometrię środowiska. Uprawnienie android.permission.SCENE_UNDERSTANDING_COARSE jest uważane za niebezpieczne, co oznacza, że aplikacje muszą wyraźnie o nie prosić.
(poziom ochrony: niebezpieczne)
Sprawdzanie możliwości systemu
Struktura XrSystemMarkerTrackingPropertiesANDROID jest zdefiniowana w ten sposób:
typedef struct XrSystemMarkerTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsMarkerTracking;
XrBool32 supportsMarkerSizeEstimation;
uint16_t maxMarkerCount;
} XrSystemMarkerTrackingPropertiesANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur. Więcej informacji o łańcuchu struktur znajdziesz w rozszerzanej strukturze ( XrSystemProperties).supportsMarkerTrackingtoXrBool32wskazujący, czy bieżący system zapewnia możliwość śledzenia znaczników.supportsMarkerSizeEstimationtoXrBool32wskazujący, czy bieżący system umożliwia oszacowanie rozmiaru znacznika.maxMarkerCountto maksymalna liczba znaczników, które środowisko wykonawcze może śledzić jednocześnie.
Aplikacja może sprawdzić, czy system jest w stanie śledzić znaczniki, rozszerzając XrSystemProperties o strukturę XrSystemMarkerTrackingPropertiesANDROID podczas wywoływania xrGetSystemProperties . Środowisko wykonawcze musi zwracać XR_ERROR_FEATURE_UNSUPPORTED w przypadku tworzenia modułu śledzenia znaczników tylko wtedy, gdy supportsMarkerTracking to XR_FALSE .
Jeśli środowisko wykonawcze obsługuje śledzenie znaczników, wartość maxMarkerCount musi wynosić co najmniej 1.
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_ANDROID_trackables_markermusi być włączone przed użyciem XrSystemMarkerTrackingPropertiesANDROID. -
typemusi mieć wartośćXR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur
Znaczniki śledzenia
To rozszerzenie dodaje XR_TRACKABLE_TYPE_MARKER_ANDROID do XrTrackableTypeANDROID .
Aplikacja tworzy XrTrackableTrackerANDROID, wywołując xrCreateTrackableTrackerANDROID i określając XR_TRACKABLE_TYPE_MARKER_ANDROID jako typ obiektu możliwego do śledzenia w XrTrackableTrackerCreateInfoANDROID :: trackableType, a także ustawiając prawidłową konfigurację przez dodanie XrTrackableMarkerConfigurationANDROID do następnego łańcucha XrTrackableTrackerCreateInfoANDROID .
Środowisko wykonawcze musi zwracać XR_ERROR_FEATURE_UNSUPPORTED, jeśli XrTrackableTrackerCreateInfoANDROID :: trackableType to XR_TRACKABLE_TYPE_MARKER_ANDROID, a XrSystemMarkerTrackingPropertiesANDROID :: supportsMarkerTracking zwraca XR_FALSE przez xrGetSystemProperties .
Struktura XrTrackableMarkerConfigurationANDROID jest zdefiniowana w ten sposób:
typedef struct XrTrackableMarkerConfigurationANDROID {
XrStructureType type;
void* next;
XrTrackableMarkerTrackingModeANDROID trackingMode;
uint32_t databaseCount;
const XrTrackableMarkerDatabaseANDROID* databases;
} XrTrackableMarkerConfigurationANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur.trackingModeto XrTrackableMarkerTrackingModeANDROID wskazujący żądany tryb śledzenia.databaseCounttouint32_topisujący liczbę elementów w tablicydatabases.databasesto wskaźnik do tablicy XrTrackableMarkerDatabaseANDROID, z których każda zawiera znaczniki z danego słownika, które mają być śledzone.
Aplikacja musi ustawić prawidłową konfigurację, dodając XrTrackableMarkerConfigurationANDROID do łańcucha XrTrackableTrackerCreateInfoANDROID :: next podczas wywoływania xrCreateTrackableTrackerANDROID z XrTrackableTrackerCreateInfoANDROID :: trackableType ustawionym na XR_TRACKABLE_TYPE_MARKER_ANDROID . Jeśli typ modułu śledzącego jest ustawiony jak powyżej, ale struktura konfiguracji nie jest obecna lub jest nieprawidłowa, środowisko wykonawcze musi zwrócić błąd XR_ERROR_VALIDATION_FAILURE .
Jeśli środowisko wykonawcze obsługuje szacowanie rozmiaru znacznika, aplikacja może ustawić XrTrackableMarkerDatabaseEntryANDROID :: edgeSize na 0 w XrTrackableMarkerDatabaseANDROID :: entries, aby wskazać użycie szacowania rozmiaru. W przeciwnym razie aplikacja musi ustawić XrTrackableMarkerDatabaseEntryANDROID :: edgeSize na wartość dodatnią lub środowisko wykonawcze musi zwrócić XR_ERROR_VALIDATION_FAILURE .
Środowisko wykonawcze musi filtrować dane wyjściowe z funkcji xrGetAllTrackablesANDROID, aby pasowały do trackingMode i XrTrackableMarkerDatabaseEntryANDROID :: edgeSize .
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_ANDROID_trackables_markermusi być włączone przed użyciem XrTrackableMarkerConfigurationANDROID. -
typemusi mieć wartośćXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur -
trackingModemusi być prawidłową wartością XrTrackableMarkerTrackingModeANDROID -
databasesmusi być wskaźnikiem do tablicy prawidłowych strukturdatabaseCountXrTrackableMarkerDatabaseANDROID - Parametr
databaseCountmusi być większy niż0
Typ wyliczeniowy XrTrackableMarkerTrackingModeANDROID opisuje obsługiwane tryby śledzenia znaczników.
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;
Opisy elementów wyliczenia
XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID– śledzenie znaczników dynamicznych. Ten tryb zapewnia najwyższą dokładność i działa w przypadku znaczników ruchomych i statycznych, ale też zużywa najwięcej energii.XR_TRACKABLE_MARKER_TRACKING_MODE_STATIC_ANDROID– śledzenie znaczników statycznych. Ten tryb jest przydatny głównie w przypadku znaczników, które są statyczne, co prowadzi do mniejszego zużycia energii w porównaniu z trybem dynamicznym.
Struktura XrTrackableMarkerDatabaseANDROID definiuje słownik i odpowiadające mu identyfikatory znaczników do śledzenia.
typedef struct XrTrackableMarkerDatabaseANDROID {
XrTrackableMarkerDictionaryANDROID dictionary;
uint32_t entryCount;
const XrTrackableMarkerDatabaseEntryANDROID* entries;
} XrTrackableMarkerDatabaseANDROID;
Opisy członków
dictionaryto XrTrackableMarkerDictionaryANDROID, do którego należą wszystkie obiektyentries.entryCountto uint32_t opisujący liczbę elementów w tablicyentries. Aplikacja może ustawićentryCount0, aby śledzić wszystkie znaczniki wdictionary.entriesto wskaźnik do tablicy XrTrackableMarkerDatabaseEntryANDROID , z których każda zawiera konfigurację znacznika do śledzenia.
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_ANDROID_trackables_markermusi być włączone przed użyciem XrTrackableMarkerDatabaseANDROID. -
dictionarymusi być prawidłową wartością XrTrackableMarkerDictionaryANDROID - Jeśli
entryCountnie jest równe0,entriesmusi być wskaźnikiem do tablicy strukturentryCountXrTrackableMarkerDatabaseEntryANDROID.
Typ wyliczeniowy XrTrackableMarkerDictionaryANDROID opisuje obsługiwane słowniki znaczników.
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;
Struktura XrTrackableMarkerDatabaseEntryANDROID konfiguruje pojedynczy identyfikator znacznika słownika.
typedef struct XrTrackableMarkerDatabaseEntryANDROID {
int32_t id;
float edgeSize;
} XrTrackableMarkerDatabaseEntryANDROID;
Opisy członków
idto identyfikator znacznika podany w słowniku.edgeSizereprezentuje rozmiar krawędzi znacznika w metrach. Jeśli środowisko wykonawcze obsługuje szacowanie rozmiaru znacznika, aplikacja może ustawić tę wartość na 0, a rozmiar znacznika zostanie oszacowany online. Jeśli ta wartość jest ustawiona na 0, ale środowisko wykonawcze nie obsługuje szacowania rozmiaru znacznika, środowisko wykonawcze musi zwrócić wartośćXR_ERROR_VALIDATION_FAILURE.
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_ANDROID_trackables_markermusi być włączone przed użyciem XrTrackableMarkerDatabaseEntryANDROID.
Pobieranie znaczników
Funkcja xrGetTrackableMarkerANDROID jest zdefiniowana w ten sposób:
XrResult xrGetTrackableMarkerANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableMarkerANDROID* markerOutput);
Opisy parametrów
trackerto obiekt XrTrackableTrackerANDROID, który ma zostać zapytany.getInfoto XrTrackableGetInfoANDROID z informacjami używanymi do uzyskania znacznika możliwego do śledzenia.markerOutputto wskaźnik do struktury XrTrackableMarkerANDROID, w której zwracany jest znacznik możliwy do śledzenia.
Środowisko wykonawcze musi zwracać XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID, jeśli typ śledzenia XrTrackableANDROID nie jest XR_TRACKABLE_TYPE_MARKER_ANDROID lub jeśli typ śledzenia XrTrackableTrackerANDROID nie jest XR_TRACKABLE_TYPE_MARKER_ANDROID .
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_ANDROID_trackables_markermusi być włączone przed wywołaniem xrGetTrackableMarkerANDROID. -
trackermusi być prawidłowym uchwytem XrTrackableTrackerANDROID -
getInfomusi być wskaźnikiem do prawidłowej struktury XrTrackableGetInfoANDROID. -
markerOutputmusi być wskaźnikiem do struktury XrTrackableMarkerANDROID.
Kody zwrotu
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
Struktura XrTrackableMarkerANDROID jest zdefiniowana w ten sposób:
typedef struct XrTrackableMarkerANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrTrackableMarkerDictionaryANDROID dictionary;
int32_t markerId;
XrPosef centerPose;
XrExtent2Df extents;
} XrTrackableMarkerANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.trackingStateto XrTrackingStateANDROID znacznika.lastUpdatedTimetoXrTimeostatniej aktualizacji znacznika.dictionaryto XrTrackableMarkerDictionaryANDROID znacznika.markerIdto identyfikator znacznika podany w słowniku.centerPoseto XrPosef znacznika znajdującego się w XrTrackableGetInfoANDROID ::baseSpace. Znacznik leży na płaszczyźnie XZ, przy czym oś X wskazuje prawą stronę znacznika, oś Z – jego dół, a oś Y – prostopadłą do znacznika.extentsto wymiary XrExtent2Df znacznika. Granica ramki ograniczającej znajduje się w punktach:centerPose+/- (extents/ 2).
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_ANDROID_trackables_markermusi być włączone przed użyciem XrTrackableMarkerANDROID. -
typemusi mieć wartośćXR_TYPE_TRACKABLE_MARKER_ANDROID -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur -
trackingStatemusi być prawidłową wartością XrTrackingStateANDROID -
dictionarymusi być prawidłową wartością XrTrackableMarkerDictionaryANDROID
Przykładowy kod do pobierania znaczników możliwych do śledzenia
Poniższy przykładowy kod pokazuje, jak uzyskać znaczniki możliwe do śledzenia.
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));
Nowe polecenia
Nowe domy
- XrTrackableMarkerANDROID
- XrTrackableMarkerDatabaseANDROID
- XrTrackableMarkerDatabaseEntryANDROID
Rozszerzanie XrSystemProperties :
Rozszerzanie XrTrackableTrackerCreateInfoANDROID :
Nowe wartości w polu enum
Nowe stałe typu wyliczeniowego
XR_ANDROID_TRACKABLES_MARKER_EXTENSION_NAMEXR_ANDROID_trackables_marker_SPEC_VERSIONRozszerzanie XrStructureType :
XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_MARKER_ANDROIDXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID
Rozszerzanie XrTrackableTypeANDROID :
XR_TRACKABLE_TYPE_MARKER_ANDROID
Problemy
Historia zmian
Wersja 1, 23 lipca 2025 r. (Levana Chen)
- Początkowy opis rozszerzenia.