Ciąg znaków z nazwą
XR_ANDROID_eye_tracking
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
457
Wersja
1
Zależności rozszerzeń i wersji
Data ostatniej modyfikacji
2025-01-17
Stan adresu IP
Brak znanych roszczeń dotyczących własności intelektualnej.
Twórcy
Spencer Quin, Google
Jared Finder, Google
Levana Chen, Google
Kenny Vercaemer, Google
Prasanthi Gurumurthy, Google
Nihav Jain, Google
Omówienie
To rozszerzenie umożliwia aplikacjom uzyskiwanie informacji o pozycji i orientacji oczu użytkownika, a także o stanie śledzenia wzroku.
Dane śledzenia wzroku są udostępniane w 2 trybach: przybliżonym i dokładnym. Śledzenie zgrubne zapewnia przybliżone oszacowanie położenia oczu użytkownika, a śledzenie precyzyjne – dokładniejsze oszacowanie. Śledzenie zgrubne jest przeznaczone dla aplikacji, które chcą zapewnić podstawową reprezentację w postaci awatara, a śledzenie dokładne – dla aplikacji wymagających większej precyzji.
W przypadku interakcji należy używać XR_EXT_eye_gaze_interaction .
Sprawdzanie możliwości systemu
Struktura XrSystemEyeTrackingPropertiesANDROID jest zdefiniowana w ten sposób:
typedef struct XrSystemEyeTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsEyeTracking;
} XrSystemEyeTrackingPropertiesANDROID;
Opisy członków
typetoXrStructureTypetego obiektu.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.supportsEyeTrackingtoXrBool32, które wskazuje, czy bieżący system obsługuje śledzenie wzroku.
Aplikacja może sprawdzić, czy system obsługuje śledzenie wzroku, przez połączenie struktury XrSystemEyeTrackingPropertiesANDROID ze strukturą XrSystemProperties podczas wywoływania funkcji xrGetSystemProperties. Jeśli usługa supportsEyeTracking zwróci wartość XR_FALSE, aplikacja otrzyma wartość XR_ERROR_FEATURE_UNSUPPORTED z usługi xrCreateEyeTrackerANDROID.
Prawidłowe użycie (domyślne)
XR_ANDROID_eye_trackingRozszerzeniemusi być włączone przed użyciemXrSystemEyeTrackingPropertiesANDROID.typemusi byćXR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROIDnextmusi być wartościąNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
Tworzenie uchwytu do śledzenia wzroku
XR_DEFINE_HANDLE(XrEyeTrackerANDROID)
Uchwyt XrEyeTrackerANDROID reprezentuje urządzenie do śledzenia wzroku, które śledzi oczy i dokładnie określa, na co patrzy użytkownik.
Dane śledzenia wzroku mogą być wrażliwymi danymi osobowymi i są ściśle powiązane z prywatnością i integralnością osobistą. Zdecydowanie zalecamy, aby aplikacje, które przechowują lub przesyłają dane śledzenia wzroku, zawsze prosiły użytkownika o aktywną i konkretną zgodę na takie działanie.
Ten uchwyt może być używany do uzyskiwania dostępu do danych śledzenia wzroku za pomocą innych funkcji w tym rozszerzeniu.
Śledzenie wzroku zapewnia reprezentację pozycji i stanu oczu w scenie.
Funkcja xrCreateEyeTrackerANDROID jest zdefiniowana jako:
XrResult xrCreateEyeTrackerANDROID(
XrSession session,
const XrEyeTrackerCreateInfoANDROID* createInfo,
XrEyeTrackerANDROID* eyeTracker);
Opisy parametrów
sessionto nazwa użytkownikaXrSession, w której śledzenie wzroku będzie aktywne.createInfotoXrEyeTrackerCreateInfoANDROIDużywany do określania śledzenia wzroku.eyeTrackerto zwrócony uchwytXrEyeTrackerANDROID.
Aplikacja może utworzyć uchwyt XrEyeTrackerANDROID za pomocą funkcji xrCreateEyeTrackerANDROID.
Jeśli system nie obsługuje śledzenia wzroku, funkcja xrCreateEyeTrackerANDROID zwróci wartość XR_ERROR_FEATURE_UNSUPPORTED.
Prawidłowe użycie (domyślne)
XR_ANDROID_eye_trackingRozszerzenie musi być włączone przed wywołaniemxrCreateEyeTrackerANDROID.sessionmusi być prawidłowym identyfikatoremXrSessioncreateInfomusi być wskaźnikiem do prawidłowej strukturyXrEyeTrackerCreateInfoANDROIDeyeTrackermusi być wskaźnikiem do uchwytuXrEyeTrackerANDROID.
Kody zwrotne
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_FEATURE_UNSUPPORTED
Struktura XrEyeTrackerCreateInfoANDROID jest zdefiniowana w ten sposób:
typedef struct XrEyeTrackerCreateInfoANDROID {
XrStructureType type;
void* next;
} XrEyeTrackerCreateInfoANDROID;
Opisy członków
typejestXrStructureTypetego obiektu.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
Struktura XrEyeTrackerCreateInfoANDROID opisuje informacje potrzebne do utworzenia uchwytu XrEyeTrackerANDROID.
Prawidłowe użycie (domyślne)
- Przed użyciem
XrEyeTrackerCreateInfoANDROIDmusisz włączyć rozszerzenieXR_ANDROID_eye_tracking. typemusi byćXR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROIDnextmusi być wartościąNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
Funkcja xrDestroyEyeTrackerANDROID jest zdefiniowana w ten sposób:
XrResult xrDestroyEyeTrackerANDROID(
XrEyeTrackerANDROID eyeTracker);
Opisy parametrów
eyeTrackertoXrEyeTrackerANDROIDutworzony wcześniej przezxrCreateEyeTrackerANDROID.
Funkcja xrDestroyEyeTrackerANDROID zwalnia eyeTracker i powiązane zasoby po zakończeniu korzystania z funkcji śledzenia wzroku.
Prawidłowe użycie (domyślne)
XR_ANDROID_eye_trackingRozszerzenie musi być włączone przed wywołaniemxrDestroyEyeTrackerANDROID.eyeTrackermusi być prawidłowym uchwytemXrEyeTrackerANDROID.
Bezpieczeństwo wątków
- Dostęp do
eyeTrackeri wszystkich uchwytów podrzędnych musi być synchronizowany zewnętrznie.
Kody zwrotne
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Uzyskiwanie informacji o oczach
Funkcja xrGetCoarseTrackingEyesInfoANDROID jest zdefiniowana w ten sposób:
XrResult xrGetCoarseTrackingEyesInfoANDROID(
XrEyeTrackerANDROID eyeTracker,
const XrEyesGetInfoANDROID* getInfo,
XrEyesANDROID* eyesOutput);
Opisy parametrów
eyeTrackertoXrEyeTrackerANDROIDutworzony wcześniej przezxrCreateEyeTrackerANDROID.getInfoto wskaźnik doXrEyesGetInfoANDROID, który służy do określania, jakie dane wyjściowe są wymagane.infoOutputto wskaźnik doXrEyesANDROID, który zawiera zwrócone informacje o oczach, w tym ich położenie i stan.
Funkcja xrGetCoarseTrackingEyesInfoANDROID pobiera informacje o stanie oczu i ich położeniu w sposób, który chroni prywatność użytkownika.
Środowisko wykonawcze musi zwrócić wartość XR_ERROR_PERMISSION_INSUFFICIENT, jeśli aplikacja nie ma uprawnienia android.permission.EYE_TRACKING_COARSE.
Informacje o oczach są określane względem przestrzeni bazowej w momencie wywołania funkcji xrGetCoarseTrackingEyesInfoANDROID za pomocą funkcji XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace.
W każdym momencie śledzona lub nieśledzona jest zarówno pozycja, jak i kierunek ustawienia oczu. Oznacza to, że aplikacje mogą oczekiwać, że w przypadku podanego parametru XrEyesANDROID::eyes ustawienia XR_SPACE_LOCATION_POSITION_TRACKED_BIT i XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT będą ustawione lub wyczyszczone, a parametr XrEyesANDROID::mode będzie wskazywać stany śledzenia.
Prawidłowe użycie (domyślne)
XR_ANDROID_eye_trackingRozszerzenie musi być włączone przed wywołaniemxrGetCoarseTrackingEyesInfoANDROID.eyeTrackermusi być prawidłowym identyfikatoremXrEyeTrackerANDROIDgetInfomusi być wskaźnikiem do prawidłowej strukturyXrEyesGetInfoANDROID.eyesOutputmusi być wskaźnikiem do strukturyXrEyesANDROID.
Kody zwrotne
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_TIME_INVALIDXR_ERROR_PERMISSION_INSUFFICIENT
Funkcja xrGetFineTrackingEyesInfoANDROID jest zdefiniowana w ten sposób:
XrResult xrGetFineTrackingEyesInfoANDROID(
XrEyeTrackerANDROID eyeTracker,
const XrEyesGetInfoANDROID* getInfo,
XrEyesANDROID* eyesOutput);
Opisy parametrów
eyeTrackertoXrEyeTrackerANDROIDutworzony wcześniej przezxrCreateEyeTrackerANDROID.getInfoto wskaźnik doXrEyesGetInfoANDROID, który służy do określania, jakie dane wyjściowe są wymagane.infoOutputto wskaźnik doXrEyesANDROID, który zawiera zwrócone informacje o oczach, w tym ich położenie i stan. FunkcjaxrGetFineTrackingEyesInfoANDROIDuzyskuje informacje o stanie oczu i pozach z większą precyzją niż funkcjaxrGetCoarseTrackingEyesInfoANDROID.
Środowisko wykonawcze musi zwrócić wartość XR_ERROR_PERMISSION_INSUFFICIENT, jeśli aplikacja nie ma uprawnienia android.permission.EYE_TRACKING_FINE.
Informacje o oczach są określane względem przestrzeni bazowej w momencie wywołania funkcji xrGetFineTrackingEyesInfoANDROID za pomocą funkcji XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace.
W każdym momencie śledzona lub nieśledzona jest zarówno pozycja, jak i kierunek ustawienia oczu. Oznacza to, że aplikacje mogą oczekiwać, że w przypadku podanego parametru XrEyesANDROID::eyes ustawienia XR_SPACE_LOCATION_POSITION_TRACKED_BIT i XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT będą ustawione lub wyczyszczone, a parametr XrEyesANDROID::mode będzie wskazywać stany śledzenia.
Prawidłowe użycie (domyślne)
XR_ANDROID_eye_trackingRozszerzenie musi być włączone przed wywołaniemxrGetFineTrackingEyesInfoANDROID.eyeTrackermusi być prawidłowym identyfikatoremXrEyeTrackerANDROIDgetInfomusi być wskaźnikiem do prawidłowej strukturyXrEyesGetInfoANDROID.eyesOutputmusi być wskaźnikiem do strukturyXrEyesANDROID.
Kody zwrotne
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_TIME_INVALIDXR_ERROR_PERMISSION_INSUFFICIENT
Struktura XrEyesGetInfoANDROID zawiera informacje wymagane do pobierania pozycji i stanów oczu.
typedef struct XrEyesGetInfoANDROID {
XrStructureType type;
void* next;
XrTime time;
XrSpace baseSpace;
} XrEyesGetInfoANDROID;
Opisy członków
typetoXrStructureTypetego obiektu.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.timetoXrTime, w którym należy ocenić współrzędne względembaseSpace.baseSpacepozycja oka będzie względna w stosunku do tegoXrSpaceo godzinietime.
Prawidłowe użycie (domyślne)
- Przed użyciem
XrEyesGetInfoANDROIDmusisz włączyć rozszerzenieXR_ANDROID_eye_tracking. typemusi byćXR_TYPE_EYES_GET_INFO_ANDROIDnextmusi być wartościąNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.baseSpacemusi być prawidłowym identyfikatoremXrSpace
Struktura XrEyesANDROID zawiera informacje o śledzonych oczach.
typedef struct XrEyesANDROID {
XrStructureType type;
void* next;
XrEyeANDROID eyes[XR_EYE_MAX_ANDROID];
XrEyeTrackingModeANDROID mode;
} XrEyesANDROID;
Opisy członków
typejestXrStructureTypetego obiektu.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.eyesto tablicaXrEyeANDROIDdla lewego i prawego oka indeksowana przezXrEyeIndexANDROID.modetoXrEyeTrackingModeANDROID, który wskazuje, czy oczy śledzą ruch i które z nich.
Prawidłowe użycie (domyślne)
- Przed użyciem
XrEyesANDROIDmusisz włączyć rozszerzenieXR_ANDROID_eye_tracking. typemusi byćXR_TYPE_EYES_ANDROIDnextmusi być wartościąNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.- Każdy element
eyesmusi być prawidłową strukturąXrEyeANDROID. modemusi być prawidłową wartościąXrEyeTrackingModeANDROID.
Struktura XrEyeANDROID opisuje stan, położenie i orientację oka.
typedef struct XrEyeANDROID {
XrEyeStateANDROID eyeState;
XrPosef eyePose;
} XrEyeANDROID;
Opisy członków
eyeStatetoXrEyeStateANDROIDoka.posetoXrPosefokreślający położenie i orientację początku układu współrzędnych oka w ramach odniesienia odpowiedniegoXrEyesGetInfoANDROID::baseSpace. Orientacja tożsamości to układ osi współrzędnych, w którym oś Z jest skierowana w stronę oczu użytkownika, oś X w prawo, a oś Y w górę.
Prawidłowe użycie (domyślne)
- Przed użyciem
XrEyeANDROIDmusisz włączyć rozszerzenieXR_ANDROID_eye_tracking. eyeStatemusi być prawidłową wartościąXrEyeStateANDROID.
Wyliczenie XrEyeStateANDROID określa różne stany śledzonych oczu.
typedef enum XrEyeStateANDROID {
XR_EYE_STATE_INVALID_ANDROID = 0,
XR_EYE_STATE_GAZING_ANDROID = 1,
XR_EYE_STATE_SHUT_ANDROID = 2
} XrEyeStateANDROID;
Wartości wyliczeniowe mają następujące znaczenia:
Enum |
Opis |
|
Wskazuje, że oko jest w stanie błędu lub nie występuje. |
|
Wskazuje, że wzrok jest skierowany w określonym kierunku. |
|
Wskazuje, że oko jest zamknięte z powodu mrugnięcia. |
Wyliczenie XrEyeIndexANDROID określa indeks lewego lub prawego oka.
typedef enum XrEyeIndexANDROID {
XR_EYE_INDEX_LEFT_ANDROID = 0,
XR_EYE_INDEX_RIGHT_ANDROID = 1
} XrEyeIndexANDROID;
Wartości wyliczeniowe mają następujące znaczenia:
Enum |
Opis |
|
Lewe oko. |
|
Prawe oko. |
Wyliczenie XrEyeTrackingModeANDROID określa różne tryby śledzenia oczu.
typedef enum XrEyeTrackingModeANDROID {
XR_EYE_TRACKING_MODE_NOT_TRACKING_ANDROID = 0,
XR_EYE_TRACKING_MODE_RIGHT_ANDROID = 1,
XR_EYE_TRACKING_MODE_LEFT_ANDROID = 2,
XR_EYE_TRACKING_MODE_BOTH_ANDROID = 3
} XrEyeTrackingModeANDROID;
Wartości wyliczeniowe mają następujące znaczenia:
Enum |
Opis |
|
Wskazuje, że śledzenie wzroku nie jest aktywne. |
|
Oznacza, że śledzone jest tylko prawe oko. |
|
Oznacza, że śledzone jest tylko lewe oko. |
|
Informuje, że śledzone są oba oczy. |
Przykładowy kod śledzenia wzroku
Poniższy przykładowy kod pokazuje, jak uzyskać informacje o oczach względem przestrzeni widoku.
XrSession session; // previously initialized, e.g. created at app startup.
XrSpace viewSpace; // space created for XR_REFERENCE_SPACE_TYPE_VIEW.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateEyeTrackerANDROID xrCreateEyeTrackerANDROID; // previously initialized
PFN_xrDestroyEyeTrackerANDROID xrDestroyEyeTrackerANDROID; // previously initialized
PFN_xrGetCoarseTrackingEyesInfoANDROID xrGetCoarseTrackingEyesInfoANDROID; // previously initialized
PFN_xrGetFineTrackingEyesInfoANDROID xrGetFineTrackingEyesInfoANDROID; // previously initialized
// This will use the XrSession that is bound to the eye tracker done at time of creation.
XrEyeTrackerANDROID eyeTracker;
XrEyeTrackerCreateInfoANDROID createInfo{
.type = XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID,
.next = nullptr};
CHK_XR(xrCreateEyeTrackerANDROID(session, &createInfo, &eyeTracker));
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
XrEyesANDROID fineEyesInfo{.type = XR_TYPE_EYES_ANDROID,
.next = nullptr,
.mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
XrEyesANDROID coarseEyesInfo{.type = XR_TYPE_EYES_ANDROID,
.next = nullptr,
.mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
XrEyesGetInfoANDROID eyesGetInfo{.type = XR_TYPE_EYES_GET_INFO_ANDROID,
.next = nullptr,
.time = time,
.baseSpace = viewSpace};
CHK_XR(xrGetCoarseTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &coarseEyesInfo));
CHK_XR(xrGetFineTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &fineEyesInfo));
// eyes tracking information is now available:
// drawLeftEye(eyesInfo.eyes[XR_EYE_INDEX_LEFT_ANDROID].eyePose);
// drawRightEye(eyesInfo.eyes[XR_EYE_INDEX_RIGHT_ANDROID].eyePose);
// ...
// Finish frame loop
// ...
}
// after usage
CHK_XR(xrDestroyEyeTrackerANDROID(eyeTracker));
Nowe typy obiektów
Nowe stałe wyliczeniowe
XR_EYE_MAX_ANDROID
Wyliczenie XrObjectType zostało rozszerzone o:
XR_OBJECT_TYPE_EYE_TRACKER_ANDROID
Wyliczenie XrStructureType zostało rozszerzone o:
XR_TYPE_EYES_ANDROIDXR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_EYES_GET_INFO_ANDROIDXR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID
Nowe wartości w polu enum
Nowe struktury
XrEyeANDROIDXrEyesANDROIDXrEyesGetInfoANDROIDXrEyeTrackerCreateInfoANDROIDXrSystemEyeTrackingPropertiesANDROID
Nowe funkcje
xrCreateEyeTrackerANDROIDxrDestroyEyeTrackerANDROIDxrGetCoarseTrackingEyesInfoANDROIDxrGetFineTrackingEyesInfoANDROID
Problemy
Historia wersji
- Wersja 1, 17 stycznia 2025 r. (Kenny Vercaemer)
- Wstępny opis rozszerzenia
OpenXR™ i logo OpenXR są znakami towarowymi należącymi do The Khronos Group Inc. i są zarejestrowane jako znaki towarowe w Chinach, Unii Europejskiej, Japonii i Wielkiej Brytanii.