Ciąg znaków nazwy
XR_ANDROID_eye_tracking
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
457
Weryfikacja
1
Zależności rozszerzenia i wersji
Data ostatniej modyfikacji
2025-01-17
Stan adresu IP
Brak znanych roszczeń do praw autorskich do treści.
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 uzyskanie pozycji i orientacji oczu użytkownika, a także stanu śledzenia wzroku.
Dane śledzenia wzroku są udostępniane w 2 trybach: ogólnym i dokładnym. Śledzenie o niskiej rozdzielczości zapewnia przybliżony obraz oczu użytkownika, natomiast śledzenie o wysokiej rozdzielczości zapewnia bardziej dokładny obraz. Śledzenie ogólne jest przeznaczone do aplikacji, które chcą zapewnić podstawowe odwzorowanie awatara, a śledzenie precyzyjne – do bardziej precyzyjnych zastosowań.
W przypadku interakcji należy użyć wartości 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
type
toXrStructureType
tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano żadnych takich struktur.supportsEyeTracking
toXrBool32
, który wskazuje, czy bieżący system obsługuje śledzenie wzroku.
Aplikacja może sprawdzić, czy system jest w stanie śledzić ruch gałek ocznych, łącząc strukturę XrSystemEyeTrackingPropertiesANDROID
z strukturą XrSystemProperties podczas wywoływania funkcji xrGetSystemProperties
. Jeśli funkcja supportsEyeTracking
zwróci wartość XR_FALSE
, aplikacja otrzyma wartość XR_ERROR_FEATURE_UNSUPPORTED
z xrCreateEyeTrackerANDROID
.
Prawidłowe użycie (domyślne)
- Zanim zaczniesz korzystać z
XrSystemEyeTrackingPropertiesANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. type
musi byćXR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
Tworzenie uchwytu śledzenia ruchów gałek ocznych
XR_DEFINE_HANDLE(XrEyeTrackerANDROID)
Uchwyt XrEyeTrackerANDROID
reprezentuje śledzenie wzroku, które śledzi ruchy oczu i dokładnie odwzorowuje to, na co patrzy użytkownik.
Dane śledzenia ruchem gałek ocznych mogą zawierać wrażliwe dane osobowe i są ściśle związane z prywatnością i nienaruszającymi integralności osoby. Zdecydowanie zalecamy, aby aplikacje, które przechowują lub przesyłają dane śledzenia ruchem gałek ocznych, zawsze prosiły użytkownika o aktywne i szczególne zaakceptowanie.
Za pomocą tego uchwytu można uzyskać dostęp do danych śledzenia oczu za pomocą innych funkcji w tym rozszerzeniu.
Śledzenie oczu umożliwia wyświetlanie w scenie pozycji i stanu oczu.
Funkcja xrCreateEyeTrackerANDROID
jest zdefiniowana w ten sposób:
XrResult xrCreateEyeTrackerANDROID(
XrSession session,
const XrEyeTrackerCreateInfoANDROID* createInfo,
XrEyeTrackerANDROID* eyeTracker);
Opisy parametrów
session
toXrSession
element sterujący, w którym śledzenie wzroku będzie aktywne.createInfo
toXrEyeTrackerCreateInfoANDROID
używany do określania śledzenia ruchem oczu.eyeTracker
to zwrócony uchwytXrEyeTrackerANDROID
.
Aplikacja może utworzyć identyfikator XrEyeTrackerANDROID
za pomocą funkcji xrCreateEyeTrackerANDROID
.
Jeśli system nie obsługuje śledzenia wzroku, XR_ERROR_FEATURE_UNSUPPORTED
zostanie zwrócone z xrCreateEyeTrackerANDROID
.
Prawidłowe użycie (domyślne)
- Zanim wywołasz funkcję
xrCreateEyeTrackerANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. session
musi być prawidłowym identyfikatoremXrSession
.createInfo
musi być wskaźnikiem do prawidłowej strukturyXrEyeTrackerCreateInfoANDROID
.eyeTracker
musi być wskaźnikiem do uchwytuXrEyeTrackerANDROID
Kody zwrotu
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_LIMIT_REACHED
XR_ERROR_FEATURE_UNSUPPORTED
Struktura XrEyeTrackerCreateInfoANDROID
jest zdefiniowana w ten sposób:
typedef struct XrEyeTrackerCreateInfoANDROID {
XrStructureType type;
void* next;
} XrEyeTrackerCreateInfoANDROID;
Opisy członków
type
toXrStructureType
tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano żadnych takich struktur.
Struktura XrEyeTrackerCreateInfoANDROID
zawiera informacje potrzebne do utworzenia identyfikatora XrEyeTrackerANDROID
.
Prawidłowe użycie (domyślne)
- Zanim zaczniesz korzystać z
XrEyeTrackerCreateInfoANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. type
musi byćXR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
next
musi byćNULL
lub 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
eyeTracker
toXrEyeTrackerANDROID
utworzony wcześniej przezxrCreateEyeTrackerANDROID
.
Funkcja xrDestroyEyeTrackerANDROID
zwalnia eyeTracker
i podstawowe zasoby po zakończeniu śledzenia ruchem gałek ocznych.
Prawidłowe użycie (domyślne)
- Zanim wywołasz funkcję
xrDestroyEyeTrackerANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. eyeTracker
musi być prawidłowymXrEyeTrackerANDROID
nickiem.
Bezpieczeństwo wątków
- Dostęp do
eyeTracker
i wszystkich jego uchwytów podrzędnych musi być zsynchronizowany zewnętrznie.
Kody zwrotu
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_HANDLE_INVALID
Pobieranie informacji o oczach
Funkcja xrGetCoarseTrackingEyesInfoANDROID
jest zdefiniowana w ten sposób:
XrResult xrGetCoarseTrackingEyesInfoANDROID(
XrEyeTrackerANDROID eyeTracker,
const XrEyesGetInfoANDROID* getInfo,
XrEyesANDROID* eyesOutput);
Opisy parametrów
eyeTracker
toXrEyeTrackerANDROID
utworzony wcześniej przezxrCreateEyeTrackerANDROID
.getInfo
to wskaźnik do elementuXrEyesGetInfoANDROID
, który służy do określania wymaganego wyjścia.infoOutput
to wskaźnik doXrEyesANDROID
, który zawiera zwrócone informacje o oczach, w tym pozy i stany.
Funkcja xrGetCoarseTrackingEyesInfoANDROID
pobiera informacje o stanie i pozycji oczu w sposób, który chroni prywatność użytkownika.
Jeśli aplikacja nie ma uprawnień android.permission.EYE_TRACKING_COARSE
, środowisko uruchomieniowe musi zwrócić wartość XR_ERROR_PERMISSION_INSUFFICIENT
.
Informacje o oczach są rozwiązywane i odnoszą się do przestrzeni bazowej w momencie wywołania funkcji xrGetCoarseTrackingEyesInfoANDROID
za pomocą funkcji XrEyesGetInfoANDROID::time
, XrEyesGetInfoANDROID::baseSpace
.
W dowolnym momencie można śledzić lub nie śledzić pozycję i kierunek spojrzenia. Oznacza to, że aplikacje mogą oczekiwać, że zarówno XR_SPACE_LOCATION_POSITION_TRACKED_BIT
, jak i XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT
będą ustawione lub wyczyszczone w XrEyesANDROID::eyes
, a XrEyesANDROID::mode
będzie wskazywać stan śledzenia.
Prawidłowe użycie (domyślne)
- Zanim wywołasz funkcję
xrGetCoarseTrackingEyesInfoANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. eyeTracker
musi być prawidłowym identyfikatoremXrEyeTrackerANDROID
.getInfo
musi być wskaźnikiem do prawidłowej strukturyXrEyesGetInfoANDROID
eyesOutput
musi być wskaźnikiem do strukturyXrEyesANDROID
.
Kody zwrotu
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_LIMIT_REACHED
XR_ERROR_TIME_INVALID
XR_ERROR_PERMISSION_INSUFFICIENT
Funkcja xrGetFineTrackingEyesInfoANDROID
jest zdefiniowana jako:
{:#xrGetFineTrackingEyesInfoANDROID}
C++
XrResult xrGetFineTrackingEyesInfoANDROID(
XrEyeTrackerANDROID eyeTracker,
const XrEyesGetInfoANDROID* getInfo,
XrEyesANDROID* eyesOutput);
Opisy parametrów
eyeTracker
toXrEyeTrackerANDROID
utworzony wcześniej przezxrCreateEyeTrackerANDROID
.getInfo
to wskaźnik do elementuXrEyesGetInfoANDROID
, który służy do określania wymaganego wyjścia.infoOutput
to wskaźnik doXrEyesANDROID
, który zawiera zwrócone informacje o oczach, w tym pozy i stany. FunkcjaxrGetFineTrackingEyesInfoANDROID
uzyskuje informacje o stanach oczu i pozach z większą precyzją niż funkcjaxrGetCoarseTrackingEyesInfoANDROID
.
Środowisko uruchomieniowe musi zwrócić wartość XR_ERROR_PERMISSION_INSUFFICIENT
, jeśli aplikacja nie ma uprawnienia android.permission.EYE_TRACKING_FINE
.
Informacje o oczach są rozwiązywane i odnoszą się do przestrzeni bazowej w momencie wywołania funkcji xrGetFineTrackingEyesInfoANDROID
za pomocą funkcji XrEyesGetInfoANDROID::time
, XrEyesGetInfoANDROID::baseSpace
.
W dowolnym momencie można śledzić lub nie śledzić pozycję i kierunek spojrzenia. Oznacza to, że aplikacje mogą oczekiwać, że zarówno XR_SPACE_LOCATION_POSITION_TRACKED_BIT
, jak i XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT
będą ustawione lub wyczyszczone w XrEyesANDROID::eyes
, a XrEyesANDROID::mode
będzie wskazywać stan śledzenia.
Prawidłowe użycie (domyślne)
- Zanim wywołasz funkcję
xrGetFineTrackingEyesInfoANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. eyeTracker
musi być prawidłowym identyfikatoremXrEyeTrackerANDROID
.getInfo
musi być wskaźnikiem do prawidłowej strukturyXrEyesGetInfoANDROID
eyesOutput
musi być wskaźnikiem do strukturyXrEyesANDROID
.
Kody zwrotu
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_LIMIT_REACHED
XR_ERROR_TIME_INVALID
XR_ERROR_PERMISSION_INSUFFICIENT
Struktura XrEyesGetInfoANDROID
zawiera informacje wymagane do pobrania pozycji i stanów oczu.
typedef struct XrEyesGetInfoANDROID {
XrStructureType type;
void* next;
XrTime time;
XrSpace baseSpace;
} XrEyesGetInfoANDROID;
Opisy członków
type
toXrStructureType
tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano żadnych takich struktur.time
toXrTime
, w której mają być obliczane współrzędne względembaseSpace
.baseSpace
pozycja oczu będzie określana względem tegoXrSpace
w miejscutime
.
Prawidłowe użycie (domyślne)
- Zanim zaczniesz korzystać z
XrEyesGetInfoANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. type
musi byćXR_TYPE_EYES_GET_INFO_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.baseSpace
musi 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
type
toXrStructureType
tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano żadnych takich struktur.eyes
to tablicaXrEyeANDROID
dla lewego i prawego oka posortowana wedługXrEyeIndexANDROID
.mode
toXrEyeTrackingModeANDROID
, aby wskazać, czy oczy śledzą obiekt i które.
Prawidłowe użycie (domyślne)
- Zanim zaczniesz korzystać z
XrEyesANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. type
musi byćXR_TYPE_EYES_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.- Każdy element
eyes
musi być prawidłową strukturąXrEyeANDROID
. mode
musi mieć prawidłową wartośćXrEyeTrackingModeANDROID
.
Struktura XrEyeANDROID
opisuje stan, położenie i orientację oka.
typedef struct XrEyeANDROID {
XrEyeStateANDROID eyeState;
XrPosef eyePose;
} XrEyeANDROID;
Opisy członków
eyeState
toXrEyeStateANDROID
oka.pose
toXrPosef
określający położenie i orientację początku oka w układzie odniesienia odpowiadającegoXrEyesGetInfoANDROID::baseSpace
. Orientacja tożsamości reprezentuje układ współrzędnych z dodatnią osią Z skierowaną w kierunku oczu użytkownika, dodatnią osią X skierowaną w prawo i dodatnią osią Y skierowaną w górę.
Prawidłowe użycie (domyślne)
- Zanim zaczniesz korzystać z
XrEyeANDROID
, musisz włączyć rozszerzenieXR_ANDROID_eye_tracking
. eyeState
musi mieć prawidłową wartośćXrEyeStateANDROID
.
Wyliczenie XrEyeStateANDROID
identyfikuje różne stany śledzenia oczu.
typedef enum XrEyeStateANDROID {
XR_EYE_STATE_INVALID_ANDROID = 0,
XR_EYE_STATE_GAZING_ANDROID = 1,
XR_EYE_STATE_SHUT_ANDROID = 2
} XrEyeStateANDROID;
Wykazy te mają następujące znaczenia:
Wyliczenie |
Opis |
|
Wskazuje, że oko jest w stanie błędu lub nie jest obecne. |
|
Wskazuje, że oko patrzy. |
|
Wskazuje, że oko jest zamknięte z powodu mrugnięcia lub mrugnięcia okiem. |
Wyliczenie XrEyeIndexANDROID
identyfikuje indeks lewego lub prawego oka.
typedef enum XrEyeIndexANDROID {
XR_EYE_INDEX_LEFT_ANDROID = 0,
XR_EYE_INDEX_RIGHT_ANDROID = 1
} XrEyeIndexANDROID;
Wykazy te mają następujące znaczenia:
Wyliczenie |
Opis |
|
Lewe oko. |
|
Prawe oko. |
Wyliczenie XrEyeTrackingModeANDROID
identyfikuje 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;
Wykazy te mają następujące znaczenia:
Wyliczenie |
Opis |
|
Wskazuje, że śledzenie wzroku jest nieaktywne. |
|
Wskazuje, że śledzenie odbywa się tylko w przypadku prawego oka. |
|
Wskazuje, że śledzenie odbywa się tylko z użyciem lewego oka. |
|
Wskazuje, że śledzenie odbywa się zarówno lewym, jak i prawym okiem. |
Przykładowy kod do śledzenia ruchem gałek ocznych
Poniższy przykładowy kod pokazuje, jak uzyskać informacje o oczach w odniesieniu do 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 typu wyliczeniowego
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_ANDROID
XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
XR_TYPE_EYES_GET_INFO_ANDROID
XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID
Nowe wartości w polu enum
Nowe struktury
XrEyeANDROID
XrEyesANDROID
XrEyesGetInfoANDROID
XrEyeTrackerCreateInfoANDROID
XrSystemEyeTrackingPropertiesANDROID
Nowe funkcje
xrCreateEyeTrackerANDROID
xrDestroyEyeTrackerANDROID
xrGetCoarseTrackingEyesInfoANDROID
xrGetFineTrackingEyesInfoANDROID
Problemy
Historia wersji
- Wersja 1, 17.01.2025 (Kenny Vercaemer)
- Wstępny opis rozszerzenia