XR_ANDROID_trackables_qr_code
Nazwa ciągu znaków
XR_ANDROID_trackables_qr_code
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer rozszerzenia
709
Wersja
1
Stan ratyfikacji
Niezatwierdzone
Zależności rozszerzenia i wersji
XR_ANDROID_trackables
Stan wycofywania
- Wycofane przez rozszerzenie
XR_EXT_spatial_marker_tracking
Data ostatniej modyfikacji
5.02.2025 r.
Stan IP
Brak znanych roszczeń dotyczących własności intelektualnej.
Twórcy
Christopher Doer, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Diego Tipaldi, Google
Ken Mackay, Google
Daniel Guttenberg, Qualcomm
Przegląd
To rozszerzenie umożliwia śledzenie fizycznych kodów QR i dekodowanie danych z kodów QR.
Uprawnienia
Aplikacje na Androida muszą mieć w pliku manifestu uprawnienie android.permission.SCENE_UNDERSTANDING_COARSE, ponieważ to rozszerzenie zależy od rozszerzenia XR_ANDROID_trackables i udostępnia geometrię otoczenia. Uprawnienie android.permission.SCENE_UNDERSTANDING_COARSE jest uważane za niebezpieczne.
(poziom ochrony: niebezpieczny)
Sprawdzanie możliwości systemu
Struktura XrSystemQrCodeTrackingPropertiesANDROID jest zdefiniowana w ten sposób:
typedef struct XrSystemQrCodeTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsQrCodeTracking;
XrBool32 supportsQrCodeSizeEstimation;
uint16_t maxQrCodeCount;
} XrSystemQrCodeTrackingPropertiesANDROID;
Opisy elementów
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.supportsQrCodeTrackingtoXrBool32wskazujący, czy bieżący system obsługuje śledzenie za pomocą kodu QR.supportsQrCodeSizeEstimationtoXrBool32wskazujący, czy bieżący system obsługuje szacowanie rozmiaru kodu QR.maxQrCodeCountto łączna maksymalna liczba kodów QR, które można śledzić jednocześnie.
Aplikacja może sprawdzić, czy system obsługuje śledzenie za pomocą kodu QR, rozszerzając XrSystemProperties o strukturę XrSystemQrCodeTrackingPropertiesANDROID podczas wywoływania xrGetSystemProperties . Środowisko wykonawcze musi zwrócić XR_ERROR_FEATURE_UNSUPPORTED w przypadku tworzenia trackera kodu QR tylko wtedy, gdy supportsQrCodeTracking ma wartość XR_FALSE .
Jeśli środowisko wykonawcze obsługuje śledzenie za pomocą kodu QR, maxQrCodeCount musi mieć wartość co najmniej 1. Jeśli środowisko wykonawcze nie obsługuje śledzenia za pomocą kodu QR, maxQrCodeCount musi mieć wartość 0.
Prawidłowe użycie (pośrednie)
- Przed użyciem XrSystemQrCodeTrackingPropertiesANDROID musisz włączyć rozszerzenie
XR_ANDROID_trackables_qr_code. -
typemusi mieć wartośćXR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID -
nextmusi mieć wartośćNULLlub prawidłowy wskaźnik do następnej struktury w łańcuchu struktur.
Śledzenie kodów QR
To rozszerzenie dodaje XR_TRACKABLE_TYPE_QR_CODE_ANDROID do XrTrackableTypeANDROID .
Aplikacja może utworzyć XrTrackableTrackerANDROID, wywołując xrCreateTrackableTrackerANDROID i określając XR_TRACKABLE_TYPE_QR_CODE_ANDROID jako typ śledzenia w XrTrackableTrackerCreateInfoANDROID :: trackableType.
Środowisko wykonawcze musi zwrócić XR_ERROR_FEATURE_UNSUPPORTED, jeśli XrTrackableTrackerCreateInfoANDROID :: trackableType ma wartość XR_TRACKABLE_TYPE_QR_CODE_ANDROID, a XrSystemQrCodeTrackingPropertiesANDROID :: supportsQrCodeTracking zwraca XR_FALSE za pomocą xrGetSystemProperties .
Struktura XrTrackableQrCodeConfigurationANDROID jest zdefiniowana w ten sposób:
typedef struct XrTrackableQrCodeConfigurationANDROID {
XrStructureType type;
void* next;
XrQrCodeTrackingModeANDROID trackingMode;
float qrCodeEdgeSize;
} XrTrackableQrCodeConfigurationANDROID;
Opisy elementów
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.trackingModeto XrQrCodeTrackingModeANDROID wskazujący żądany tryb śledzenia.qrCodeEdgeSizewskazuje rozmiar krawędzi kodu QR w metrach. Jeśli wartość wynosi zero, środowisko wykonawcze szacuje rozmiar kodu QR online.
Aplikacja musi ustawić prawidłową konfigurację, dodając XrTrackableQrCodeConfigurationANDROID do następnego łańcucha XrTrackableTrackerCreateInfoANDROID . W przeciwnym razie środowisko wykonawcze musi zwrócić XR_ERROR_VALIDATION_FAILURE .
Jeśli środowisko wykonawcze obsługuje szacowanie rozmiaru kodu QR, aplikacja może ustawić XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize na 0.0, aby wskazać użycie szacowania rozmiaru.
Jeśli środowisko wykonawcze nie obsługuje szacowania rozmiaru kodu QR, aplikacja musi ustawić XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize na wartość dodatnią. W przeciwnym razie środowisko wykonawcze musi zwrócić XR_ERROR_VALIDATION_FAILURE.
Środowisko wykonawcze musi filtrować dane wyjściowe z xrGetAllTrackablesANDROID, aby pasowały do trackingMode . Jeśli XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize nie jest ustawione na 0.0, środowisko wykonawcze musi zwracać tylko kody QR pasujące do tego rozmiaru. Jeśli XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize jest ustawione na 0.0, środowisko wykonawcze musi zwracać wszystkie kody QR o szacowanym rozmiarze.
Prawidłowe użycie (pośrednie)
- Przed użyciem XrTrackableQrCodeConfigurationANDROID musisz włączyć rozszerzenie
XR_ANDROID_trackables_qr_code. -
typemusi mieć wartośćXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID -
nextmusi mieć wartośćNULLlub prawidłowy wskaźnik do następnej struktury w łańcuchu struktur . Zobacz też: XrTrackableQrCodeVersionFilterQCOM -
trackingModemusi mieć prawidłową wartość XrQrCodeTrackingModeANDROID.
Wyliczenie XrQrCodeTrackingModeANDROID opisuje obsługiwane tryby śledzenia kodów QR.
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;
Opisy wyliczeń
XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID– śledzenie dynamicznych kodów QR. Ten tryb ma najwyższą dokładność i działa w przypadku ruchomych i statycznych kodów QR, ale też zużywa najwięcej energii.XR_QR_CODE_TRACKING_MODE_STATIC_ANDROID– śledzenie statycznych kodów QR. Ten tryb jest przydatny głównie w przypadku kodów QR, które są statyczne, co prowadzi do mniejszego zużycia energii w porównaniu z trybem dynamicznym.XR_QR_CODE_TRACKING_MODE_ANCHORED_QCOM– ten tryb należy stosować w przypadku statycznych kodów QR. W przeciwieństwie do trybu statycznego ten tryb śledzi kod QR tylko raz, a następnie aktualizuje pozycje śledzonych instancji wyłącznie na podstawie pozycji urządzenia. Dzięki temu śledzenie jest kontynuowane nawet wtedy, gdy kod QR wyjdzie poza pole widzenia ramki odniesienia. Po śledzeniu kodu QR zużycie energii jest minimalne. (Dodane przez rozszerzenieXR_QCOM_trackables_qr_code_operations)
Pobieranie kodów QR
Funkcja xrGetTrackableQrCodeANDROID jest zdefiniowana w ten sposób:
XrResult xrGetTrackableQrCodeANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableQrCodeANDROID* qrCodeOutput);
Opisy parametrów
trackerto XrTrackableTrackerANDROID, o który chcesz wysłać zapytanie.getInfoto XrTrackableGetInfoANDROID z informacjami używanymi do pobierania śledzonego kodu QR.qrCodeOutputto wskaźnik do struktury XrTrackableQrCodeANDROID, w której zwracany jest śledzony kod QR.
Środowisko wykonawcze musi zwrócić XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID , jeśli typ śledzenia XrTrackableANDROID nie jest XR_TRACKABLE_TYPE_QR_CODE_ANDROID lub jeśli typ śledzenia XrTrackableTrackerANDROID nie jest XR_TRACKABLE_TYPE_QR_CODE_ANDROID .
Prawidłowe użycie (pośrednie)
- Przed wywołaniem xrGetTrackableQrCodeANDROID musisz włączyć rozszerzenie
XR_ANDROID_trackables_qr_code. -
trackermusi być prawidłowym uchwytem XrTrackableTrackerANDROID. -
getInfomusi być wskaźnikiem do prawidłowej struktury XrTrackableGetInfoANDROID. -
qrCodeOutputmusi być wskaźnikiem do struktury XrTrackableQrCodeANDROID.
Kody powrotu
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
Struktura XrTrackableQrCodeANDROID jest zdefiniowana w ten sposób:
typedef struct XrTrackableQrCodeANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrPosef centerPose;
XrExtent2Df extents;
uint32_t bufferCapacityInput;
uint32_t bufferCountOutput;
char* buffer;
} XrTrackableQrCodeANDROID;
Opisy elementów
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.trackingStateto XrTrackingStateANDROID kodu QR.lastUpdatedTimetoXrTimeostatniej aktualizacji kodu QR. JeślilastUpdatedTimezmieni się od ostatniego wywołania, wszystkie inne pola mogą się zmienić.centerPoseto XrPosef kodu QR znajdującego się w XrTrackableGetInfoANDROID ::baseSpace. Kod QR znajduje się w płaszczyźnie XZ, przy czym X wskazuje na prawą stronę kodu QR, Z na jego dół, a Y wychodzi z kodu QR jako normalna.extentsto wymiary XrExtent2Df kodu QR. Granica ramki ograniczającej znajduje się w punktach:centerPose+/- (extents/ 2).bufferCapacityInputto pojemnośćbufferlub0, aby pobrać wymaganą pojemność.bufferCountOutputJeślibufferCapacityInputma wartość0, środowisko wykonawcze zapisze wymagany rozmiar bufora wbufferCountOutput. W przeciwnym razie zawiera łączną liczbę elementów zapisanych wbuffer. Jeśli dane kodu QR nie zostały jeszcze zdekodowane, środowisko wykonawcze musi ustawić bufferCountOutput na 0.bufferto wskaźnik do tablicychar, w której zapisywane są zdekodowane dane kodu QR. Jeśli aplikacja nie potrzebuje zdekodowanych danych kodu QR, może przekazaćnullptri pominąć drugie wywołanie. Dane kodu QR są zwracane jako ciąg znaków UTF-8 zakończony znakiem null.- Szczegółowy opis pobierania wymaganego rozmiaru
bufferznajdziesz w sekcji Parametry rozmiaru bufora.
Prawidłowe użycie (pośrednie)
- Przed użyciem XrTrackableQrCodeANDROID musisz włączyć rozszerzenie
XR_ANDROID_trackables_qr_code -
typemusi mieć wartośćXR_TYPE_TRACKABLE_QR_CODE_ANDROID -
nextmusi mieć wartośćNULLlub prawidłowy wskaźnik do następnej struktury w łańcuchu struktur . Zobacz też: XrTrackableQrCodeVersionQCOM -
trackingStatemusi mieć prawidłową wartość XrTrackingStateANDROID. - Jeśli
bufferCapacityInputnie ma wartości0,buffermusi być wskaźnikiem do tablicy wartościbufferCapacityInputchar.
Przykładowy kod do pobierania śledzonych kodów QR
Poniższy przykładowy kod pokazuje, jak pobierać śledzone kody QR.
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));
Nowe polecenia
Nowe struktury
- XrTrackableQrCodeANDROID
Rozszerzanie XrSystemProperties :
Rozszerzanie XrTrackableTrackerCreateInfoANDROID :
Nowe wyliczenia
Nowe stałe wyliczenia
XR_ANDROID_TRACKABLES_QR_CODE_EXTENSION_NAMEXR_ANDROID_trackables_qr_code_SPEC_VERSIONRozszerzanie XrStructureType :
XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID
Rozszerzanie XrTrackableTypeANDROID :
XR_TRACKABLE_TYPE_QR_CODE_ANDROID
Problemy
Historia zmian
Wersja 1, 5.02.2025 r. (Levana Chen)
- Wstępny opis rozszerzenia.