Ciąg znaków nazwy
XR_ANDROID_face_tracking
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
459
Wersja
3
Zależności rozszerzeń i wersji
Data ostatniej modyfikacji
2025-06-04
Stan adresu IP
Brak znanych roszczeń dotyczących własności intelektualnej.
Twórcy
Spencer Quin, Google
Jared Finder, Google
Levana Chen, Google
Omówienie
To rozszerzenie umożliwia aplikacjom uzyskiwanie wag kształtów mieszanych i renderowanie wyrazów twarzy w środowiskach XR.
To rozszerzenie ma na celu dostarczanie informacji potrzebnych do tworzenia realistycznych awatarów i wyrazistych reprezentacji użytkowników w przestrzeni wirtualnej. Aplikacja może sprawdzić aktywację kalibracji twarzy przed uzyskaniem wag kształtów mieszanych.
Śledzenie twarzy
Tracker twarzy to urządzenie wykrywające, które śledzi mimikę twarzy za pomocą strumieni obrazu skierowanych na użytkownika i kalibracji kamery. Głównym celem tego rozszerzenia jest mapowanie wyrazów twarzy użytkownika na jego awatary w scenie wirtualnej.
Dane śledzenia twarzy to wrażliwe dane osobowe, które są ściśle powiązane z prywatnością i integralnością osobistą. Zdecydowanie zalecamy, aby aplikacje, które przechowują lub przesyłają dane śledzenia twarzy, zawsze prosiły użytkownika o aktywną i konkretną zgodę na takie działanie.
- Aplikacje będą otrzymywać XR_ERROR_PERMISSION_INSUFFICIENTpodczas tworzenia aktywnego urządzenia śledzącego twarz, dopóki nie uzyskają do niego dostępu.
- Podczas pobierania stanów twarzy za pomocą funkcji xrGetFaceStateANDROID funkcja XrFaceStateANDROID::isValid nie zwróci wartości XR_TRUE, chyba że aplikacja ma przyznany dostęp.
Sprawdzanie możliwości systemu
Struktura XrSystemFaceTrackingPropertiesANDROID jest zdefiniowana w ten sposób:
typedef struct XrSystemFaceTrackingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsFaceTracking;
} XrSystemFaceTrackingPropertiesANDROID;
Opisy członków
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur.
- supportsFaceTrackingto wartość XrBool32 wskazująca, czy bieżący system obsługuje śledzenie twarzy.
Aplikacja może sprawdzić, czy system obsługuje śledzenie twarzy, rozszerzając strukturę XrSystemProperties o strukturę XrSystemFaceTrackingPropertiesANDROID podczas wywoływania funkcji xrGetSystemProperties.
Jeśli środowisko wykonawcze zwraca XR_FALSE dla supportsFaceTracking, musi zwrócić XR_ERROR_FEATURE_UNSUPPORTED z funkcji xrCreateFaceTrackerANDROID.
Tworzenie uchwytu do śledzenia twarzy
XR_DEFINE_HANDLE(XrFaceTrackerANDROID)
Uchwyt XrFaceTrackerANDROID reprezentuje moduł śledzenia twarzy do śledzenia twarzy.
Ten uchwyt może być używany do uzyskiwania dostępu do danych śledzenia twarzy za pomocą innych funkcji w tym rozszerzeniu.
Funkcja xrCreateFaceTrackerANDROID jest zdefiniowana w ten sposób:
XrResult xrCreateFaceTrackerANDROID(
    XrSession                                   session,
    const XrFaceTrackerCreateInfoANDROID*       createInfo,
    XrFaceTrackerANDROID*                       faceTracker);
Opisy parametrów
- sessionto uchwyt XrSession, w którym będzie aktywny moduł śledzenia twarzy.
- createInfoto struktura XrFaceTrackerCreateInfoANDROID używana do określania modułu śledzenia twarzy.
- faceTrackerto zwrócony uchwyt XrFaceTrackerANDROID.
Aplikacja może utworzyć uchwyt XrFaceTrackerANDROID za pomocą funkcji xrCreateFaceTrackerANDROID.
Jeśli system nie obsługuje śledzenia twarzy, funkcja xrCreateFaceTrackerANDROID zwróci wartość XR_ERROR_FEATURE_UNSUPPORTED.
Prawidłowe użycie (domyślne)
- Rozszerzenie XR_ANDROID_face_trackingmusi być włączone przed wywołaniem funkcji xrCreateFaceTrackerANDROID.
- sessionmusi być prawidłowym uchwytem XrSession.
- createInfomusi być wskaźnikiem do prawidłowej struktury XrFaceTrackerCreateInfoANDROID
- faceTrackermusi być wskaźnikiem do uchwytu XrFaceTrackerANDROID.
Kody zwrotne
- 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
Struktura XrFaceTrackerCreateInfoANDROID jest opisana w ten sposób:
typedef struct XrFaceTrackerCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrFaceTrackerCreateInfoANDROID;
Opisy członków
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
Struktura XrFaceTrackerCreateInfoANDROID zawiera informacje potrzebne do utworzenia uchwytu XrFaceTrackerANDROID.
Prawidłowe użycie (domyślne)
- Rozszerzenie XR_ANDROID_face_trackingmusi być włączone przed użyciem XrFaceTrackerCreateInfoANDROID.
- typemusi mieć wartość- XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID
- nextmusi być wartością- NULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
Funkcja xrDestroyFaceTrackerANDROID jest zdefiniowana w ten sposób:
XrResult xrDestroyFaceTrackerANDROID(
    XrFaceTrackerANDROID                        faceTracker);
Opisy parametrów
- faceTrackerto obiekt XrFaceTrackerANDROID utworzony wcześniej przez funkcję xrCreateFaceTrackerANDROID.
Funkcja xrDestroyFaceTrackerANDROID zwalnia faceTracker i zasoby bazowe po zakończeniu śledzenia twarzy.
Prawidłowe użycie (domyślne)
- Rozszerzenie XR_ANDROID_face_trackingmusi być włączone przed wywołaniem funkcji xrDestroyFaceTrackerANDROID.
- faceTrackermusi być prawidłowym uchwytem XrFaceTrackerANDROID
Bezpieczeństwo wątków
- Dostęp do faceTrackeri wszystkich uchwytów podrzędnych musi być synchronizowany zewnętrznie.
Kody zwrotne
- XR_SUCCESS
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_HANDLE_INVALID
Sprawdzanie kalibracji twarzy
Funkcja xrGetFaceCalibrationStateANDROID jest zdefiniowana w ten sposób:
XrResult xrGetFaceCalibrationStateANDROID(
    XrFaceTrackerANDROID                        faceTracker,
    XrBool32*                                   faceIsCalibratedOutput);
Opisy parametrów
- faceTrackerto obiekt XrFaceTrackerANDROID utworzony wcześniej przez funkcję xrCreateFaceTrackerANDROID.
- faceIsCalibratedOutputwskazuje, czy tracker twarzy został skalibrowany.
Aplikacja może sprawdzić stan kalibracji twarzy za pomocą funkcji xrGetFaceCalibrationStateANDROID.
Gdy usługa śledzenia jest jeszcze w trakcie inicjowania, środowisko wykonawcze może
zwrócić wartość XR_ERROR_SERVICE_NOT_READY_ANDROID z funkcji
xrGetFaceCalibrationStateANDROID, aby wskazać, że aplikacja może
ponowić próbę później.
Jeśli system nie obsługuje kalibracji twarzy, funkcja xrGetFaceCalibrationStateANDROID zwróci wartość XR_ERROR_FEATURE_UNSUPPORTED. W przeciwnym razie wartość faceIsCalibratedOutput może zostać ustawiona na XR_TRUE, aby odzwierciedlać stan kalibracji twarzy.
Prawidłowe użycie (domyślne)
- Rozszerzenie XR_ANDROID_face_trackingmusi być włączone przed wywołaniem funkcji xrGetFaceCalibrationStateANDROID.
- faceTrackermusi być prawidłowym uchwytem XrFaceTrackerANDROID
- faceIsCalibratedOutputmusi być wskaźnikiem do wartości- XrBool32.
Kody zwrotne
- 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_SERVICE_NOT_READY_ANDROID
Uzyskiwanie wyrazów twarzy
Funkcja xrGetFaceStateANDROID zwraca kształty mieszane wyrazów twarzy w danym momencie.
XrResult xrGetFaceStateANDROID(
    XrFaceTrackerANDROID                        faceTracker,
    const XrFaceStateGetInfoANDROID*            getInfo,
    XrFaceStateANDROID*                         faceStateOutput);
Opisy parametrów
- faceTrackerto obiekt XrFaceTrackerANDROID utworzony wcześniej przez funkcję xrCreateFaceTrackerANDROID.
- getInfoto wskaźnik do funkcji XrFaceStateGetInfoANDROID, która opisuje informacje potrzebne do uzyskania wyrazu twarzy.
- faceStateOutputto wskaźnik do XrFaceStateANDROID, który otrzymuje zwrócony stan śledzenia twarzy i mimikę.
Prawidłowe użycie (domyślne)
- Rozszerzenie XR_ANDROID_face_trackingmusi być włączone przed wywołaniem funkcji xrGetFaceStateANDROID.
- faceTrackermusi być prawidłowym uchwytem XrFaceTrackerANDROID
- getInfomusi być wskaźnikiem do prawidłowej struktury XrFaceStateGetInfoANDROID
- faceStateOutputmusi być wskaźnikiem struktury XrFaceStateANDROID
Kody zwrotne
- 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
Struktura XrFaceStateGetInfoANDROID opisuje informacje, które należy uzyskać na temat wyrazu twarzy.
typedef struct XrFaceStateGetInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrTime             time;
} XrFaceStateGetInfoANDROID;
Opisy członków
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- timeto- XrTime, w którym są wymagane wyrazy twarzy.
Aplikacje powinny żądać czasu równego przewidywanemu czasowi wyświetlania wyrenderowanej klatki.
Prawidłowe użycie (domyślne)
- Rozszerzenie XR_ANDROID_face_trackingmusi być włączone przed użyciem funkcji XrFaceStateGetInfoANDROID.
- typemusi mieć wartość- XR_TYPE_FACE_STATE_GET_INFO_ANDROID
- nextmusi być wartością- NULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
Struktura XrFaceStateANDROID zwraca stan śledzenia twarzy i wyrazy twarzy.
typedef struct XrFaceStateANDROID {
    XrStructureType               type;
    void*                         next;
    uint32_t                      parametersCapacityInput;
    uint32_t                      parametersCountOutput;
    float*                        parameters;
    XrFaceTrackingStateANDROID    faceTrackingState;
    XrTime                        sampleTime;
    XrBool32                      isValid;
    uint32_t                      regionConfidencesCapacityInput;
    uint32_t                      regionConfidencesCountOutput;
    float*                        regionConfidences;
} XrFaceStateANDROID;
Opisy członków
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- parametersCapacityInputto- uint32_topisująca pojemność tablicy- parameterslub 0, jeśli chcesz pobrać wymagane zasoby.
- parametersCountOutputto- uint32_topisująca liczbę- parameterslub wymaganą pojemność w przypadku, gdy- parametersCapacityInputjest niewystarczająca.
- parametersto wskaźnik do tablicy- floatprzydzielonej przez aplikację, która zostanie wypełniona wagami kształtów mieszanych wyrazu twarzy.
- faceTrackingStateto- XrFaceTrackingStateANDROIDstanu ważności śledzenia twarzy.
- sampleTimeto- XrTimeczas, w którym śledzone lub ekstrapolowane są zwracane wyrażenia. Jest to czas, w którym zażądano wag wyrażeń, jeśli ekstrapolacja w tym czasie się powiodła.
- isValidwskazuje, czy dane są prawidłowe, nawet jeśli nie pochodzą z bieżącej klatki.
- regionConfidencesCapacityInputto- uint32_topisująca pojemność tablicy- regionConfidenceslub 0, jeśli chcesz pobrać wymagane zasoby.
- regionConfidencesCountOutputto- uint32_topisująca liczbę- regionConfidenceslub wymaganą pojemność w przypadku, gdy- regionConfidencesCapacityInputjest niewystarczająca.
- regionConfidencesto wskaźnik do tablicy- floatprzydzielonej przez aplikację, która zostanie wypełniona wartościami ufności dla każdego obszaru twarzy.
- Szczegółowy opis pobierania wymaganych rozmiarów parametersiregionConfidencesznajdziesz w sekcji Parametry rozmiaru bufora.
Aplikacja może ustawić parametersCapacityInput na
XR_FACE_PARAMETER_COUNT_ANDROID, aby uzyskać wyrazy twarzy indeksowane przez
XrFaceParameterIndicesANDROID.
Zwrócone wartości parameters reprezentują wagi kształtów mieszanych bieżących wyrazów twarzy.
Aktualizacje tablicy parameters będą uporządkowane w taki sposób, aby aplikacja mogła indeksować elementy za pomocą odpowiedniego wyliczenia mimiki (np. XrFaceParameterIndicesANDROID).
Prawidłowe użycie (domyślne)
- Rozszerzenie XR_ANDROID_face_trackingmusi być włączone przed użyciem XrFaceStateANDROID.
- typemusi mieć wartość- XR_TYPE_FACE_STATE_ANDROID
- nextmusi być wartością- NULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
- Jeśli parametersCapacityInputnie jest0, parameters, musi być wskaźnikiem do tablicy wartościparametersCapacityInput float.
- Jeśli regionConfidencesCapacityInputnie jest0, regionConfidences, musi być wskaźnikiem do tablicy wartościregionConfidencesCapacityInput float.
- faceTrackingStatemusi być prawidłową wartością XrFaceTrackingStateANDROID
Wyliczenie XrFaceTrackingStateANDROID określa różne stany trackera twarzy.
typedef enum XrFaceTrackingStateANDROID {
    XR_FACE_TRACKING_STATE_PAUSED_ANDROID = 0,
    XR_FACE_TRACKING_STATE_STOPPED_ANDROID = 1,
    XR_FACE_TRACKING_STATE_TRACKING_ANDROID = 2
} XrFaceTrackingStateANDROID;
Wartości wyliczeniowe mają następujące znaczenia:
| Enum | Opis | 
| 
 | Wskazuje, że śledzenie twarzy jest wstrzymane, ale może zostać wznowione w przyszłości. | 
| 
 | Śledzenie zostało zatrzymane, ale klient nadal ma aktywny moduł śledzenia twarzy. | 
| 
 | Twarz jest śledzona, a jej pozycja jest aktualna. | 
Regiony ufności
Rozszerzenie XR_ANDROID_face_tracking podaje też wartości ufności dla 3 obszarów twarzy: lewego oka, prawego oka i dolnej części twarzy. Te wartości, od 0 (brak pewności) do 1 (najwyższa pewność), wskazują dokładność śledzenia twarzy w każdym regionie.
Możesz używać tych wartości ufności, aby stopniowo wyłączać kształty mieszane lub stosować filtry wizualne (np. rozmycie) do odpowiedniego obszaru twarzy. W przypadku podstawowego sterowania włączaniem i wyłączaniem zalecamy użycie progu 0,3, aby całkowicie dezaktywować kształty mieszane w odpowiednim regionie twarzy.
Obszar „dolnej części twarzy” obejmuje wszystko poniżej oczu, w tym usta, podbródek, policzki i nos. Obszar oczu obejmuje oczy i brwi.
W tabeli poniżej opisujemy kształty mieszane powiązane z poszczególnymi obszarami ufności:
| Region ufności | Blendshapes | 
|---|---|
| Dolna część twarzy | `XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHIN_RAISER_B_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHIN_RAISER_T_ANDROID`, `XR_FACE_PARAMETER_INDICES_DIMPLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_DIMPLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_DROP_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_THRUST_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PUCKER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PUCKER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_LB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_LT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_RB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_RT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIPS_TOWARD_ANDROID`, `XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_MOUTH_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_MOUTH_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_OUT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_UP_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_DOWN_ANDROID` | 
| Lewa/prawa górna część twarzy | `XR_FACE_PARAMETER_INDICES_BROW_LOWERER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_BROW_LOWERER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_CLOSED_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_CLOSED_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_R_ANDROID` | 
Konwencje dotyczące kształtów mieszanych
To rozszerzenie definiuje 68 kształtów mieszanych za pomocą 
XR_FACE_PARAMETER_COUNT_ANDROID w przypadku uproszczonego formatu G-Nome. Każdy parametr w tym wyliczeniu jest indeksem w tablicy kształtów mieszanych, której wartości są typu float, a środowisko wykonawcze normalizuje je do zakresu 1–0.
typedef enum XrFaceParameterIndicesANDROID {
    XR_FACE_PARAMETER_INDICES_BROW_LOWERER_L_ANDROID = 0,
    XR_FACE_PARAMETER_INDICES_BROW_LOWERER_R_ANDROID = 1,
    XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_L_ANDROID = 2,
    XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_R_ANDROID = 3,
    XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_L_ANDROID = 4,
    XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_R_ANDROID = 5,
    XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_L_ANDROID = 6,
    XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_R_ANDROID = 7,
    XR_FACE_PARAMETER_INDICES_CHIN_RAISER_B_ANDROID = 8,
    XR_FACE_PARAMETER_INDICES_CHIN_RAISER_T_ANDROID = 9,
    XR_FACE_PARAMETER_INDICES_DIMPLER_L_ANDROID = 10,
    XR_FACE_PARAMETER_INDICES_DIMPLER_R_ANDROID = 11,
    XR_FACE_PARAMETER_INDICES_EYES_CLOSED_L_ANDROID = 12,
    XR_FACE_PARAMETER_INDICES_EYES_CLOSED_R_ANDROID = 13,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_L_ANDROID = 14,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_R_ANDROID = 15,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_L_ANDROID = 16,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_R_ANDROID = 17,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_L_ANDROID = 18,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_R_ANDROID = 19,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_L_ANDROID = 20,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_R_ANDROID = 21,
    XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_L_ANDROID = 22,
    XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_R_ANDROID = 23,
    XR_FACE_PARAMETER_INDICES_JAW_DROP_ANDROID = 24,
    XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_LEFT_ANDROID = 25,
    XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_RIGHT_ANDROID = 26,
    XR_FACE_PARAMETER_INDICES_JAW_THRUST_ANDROID = 27,
    XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_L_ANDROID = 28,
    XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_R_ANDROID = 29,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_L_ANDROID = 30,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_R_ANDROID = 31,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_L_ANDROID = 32,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_R_ANDROID = 33,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LB_ANDROID = 34,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LT_ANDROID = 35,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RB_ANDROID = 36,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RT_ANDROID = 37,
    XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_L_ANDROID = 38,
    XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_R_ANDROID = 39,
    XR_FACE_PARAMETER_INDICES_LIP_PUCKER_L_ANDROID = 40,
    XR_FACE_PARAMETER_INDICES_LIP_PUCKER_R_ANDROID = 41,
    XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_L_ANDROID = 42,
    XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_R_ANDROID = 43,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_LB_ANDROID = 44,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_LT_ANDROID = 45,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_RB_ANDROID = 46,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_RT_ANDROID = 47,
    XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_L_ANDROID = 48,
    XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_R_ANDROID = 49,
    XR_FACE_PARAMETER_INDICES_LIPS_TOWARD_ANDROID = 50,
    XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_L_ANDROID = 51,
    XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_R_ANDROID = 52,
    XR_FACE_PARAMETER_INDICES_MOUTH_LEFT_ANDROID = 53,
    XR_FACE_PARAMETER_INDICES_MOUTH_RIGHT_ANDROID = 54,
    XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_L_ANDROID = 55,
    XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_R_ANDROID = 56,
    XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_L_ANDROID = 57,
    XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_R_ANDROID = 58,
    XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_L_ANDROID = 59,
    XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_R_ANDROID = 60,
    XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_L_ANDROID = 61,
    XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_R_ANDROID = 62,
    XR_FACE_PARAMETER_INDICES_TONGUE_OUT_ANDROID = 63,
    XR_FACE_PARAMETER_INDICES_TONGUE_LEFT_ANDROID = 64,
    XR_FACE_PARAMETER_INDICES_TONGUE_RIGHT_ANDROID = 65,
    XR_FACE_PARAMETER_INDICES_TONGUE_UP_ANDROID = 66,
    XR_FACE_PARAMETER_INDICES_TONGUE_DOWN_ANDROID = 67
} XrFaceParameterIndicesANDROID;
| Indeks | Nazwa | Obraz referencyjny | |
|---|---|---|---|
| 0 | BROW_LOWERER_L |   |   | 
| 1 | BROW_LOWERER_R |   |   | 
| 2 | CHEEK_PUFF_L |   |   | 
| 3 | CHEEK_PUFF_R |   |   | 
| 4 | CHEEK_RAISER_L |   |   | 
| 5 | CHEEK_RAISER_R |   |   | 
| 6 | CHEEK_SUCK_L |   |   | 
| 7 | CHEEK_SUCK_R |   |   | 
| 8 | CHIN_RAISER_B |   |   | 
| 9 | CHIN_RAISER_T |   |   | 
| 10 | DIMPLER_L |   |   | 
| 11 | DIMPLER_R |   |   | 
| 12 | EYES_CLOSED_L |   |   | 
| 13 | EYES_CLOSED_R |   |   | 
| 14 | EYES_LOOK_DOWN_L |   |   | 
| 15 | EYES_LOOK_DOWN_R |   |   | 
| 16 | EYES_LOOK_LEFT_L |   |   | 
| 17 | EYES_LOOK_LEFT_R |   |   | 
| 18 | EYES_LOOK_RIGHT_L |   |   | 
| 19 | EYES_LOOK_RIGHT_R |   |   | 
| 20 | EYES_LOOK_UP_L |   |   | 
| 21 | EYES_LOOK_UP_R |   |   | 
| 22 | INNER_BROW_RAISER_L |   |   | 
| 23 | INNER_BROW_RAISER_R |   |   | 
| 24 | JAW_DROP |   |   | 
| 25 | JAW_SIDEWAYS_LEFT |   |   | 
| 26 | JAW_SIDEWAYS_RIGHT |   |   | 
| 27 | JAW_THRUST |   |   | 
| 28 | LID_TIGHTENER_L |   |   | 
| 29 | LID_TIGHTENER_R |   |   | 
| 30 | LIP_CORNER_DEPRESSOR_L |   |   | 
| 31 | LIP_CORNER_DEPRESSOR_R |   |   | 
| 32 | LIP_CORNER_PULLER_L |   |   | 
| 33 | LIP_CORNER_PULLER_R |   |   | 
| 34 | LIP_FUNNELER_LB |   |   | 
| 35 | LIP_FUNNELER_LT |   |   | 
| 36 | LIP_FUNNELER_RB |   |   | 
| 37 | LIP_FUNNELER_RT |   |   | 
| 38 | LIP_PRESSOR_L |   |   | 
| 39 | LIP_PRESSOR_R |   |   | 
| 40 | LIP_PUCKER_L |   |   | 
| 41 | LIP_PUCKER_R |   |   | 
| 42 | LIP_STRETCHER_L |   |   | 
| 43 | LIP_STRETCHER_R |   |   | 
| 44 | LIP_SUCK_LB |   |   | 
| 45 | LIP_SUCK_LT |   |   | 
| 46 | LIP_SUCK_RB |   |   | 
| 47 | LIP_SUCK_RT |   |   | 
| 48 | LIP_TIGHTENER_L |   |   | 
| 49 | LIP_TIGHTENER_R |   |   | 
| 50 | LIPS_TOWARD |   |   | 
| 51 | LOWER_LIP_DEPRESSOR_L |   |   | 
| 52 | LOWER_LIP_DEPRESSOR_R |   |   | 
| 53 | MouthLeft |   |   | 
| 54 | MouthRight |   |   | 
| 55 | NOSE_WRINKLER_L |   |   | 
| 56 | NOSE_WRINKLER_R |   |   | 
| 57 | OUTER_BROW_RAISER_L |   |   | 
| 58 | OUTER_BROW_RAISER_R |   |   | 
| 59 | UPPER_LID_RAISER_L |   |   | 
| 60 | UPPER_LID_RAISER_R |   |   | 
| 61 | UPPER_LIP_RAISER_L |   |   | 
| 62 | UPPER_LIP_RAISER_R |   |   | 
| 63 | WYSUWANIE_JĘZYKA |   |   | 
| 64 | JĘZYK_LEWY |   |   | 
| 65 | TONGUE_RIGHT |   |   | 
| 66 | TONGUE_UP |   |   | 
| 67 | JĘZYK_W_DÓŁ |   |   | 
Przykładowy kod śledzenia twarzy
Poniższy przykładowy kod pokazuje, jak uzyskać wszystkie wagi kształtów mieszanych wyrazu twarzy.
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized, e.g. created at app startup.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateFaceTrackerANDROID xrCreateFaceTrackerANDROID; // previously initialized
PFN_xrDestroyFaceTrackerANDROID xrDestroyFaceTrackerANDROID; // previously initialized
PFN_xrGetFaceStateANDROID xrGetFaceStateANDROID; // previously initialized
PFN_xrGetFaceCalibrationStateANDROID xrGetFaceCalibrationStateANDROID; // previously initialized
// Inspect system capability
XrSystemProperties properties{XR_TYPE_SYSTEM_PROPERTIES};
XrSystemFaceTrackingPropertiesANDROID faceTrackingProperties{XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID};
properties.next = &faceTrackingProperties;
CHK_XR(xrGetSystemProperties(instance, systemId, &properties));
if (!faceTrackingProperties.supportsFaceTracking) {
  // face tracking is not supported.
  return;
}
XrFaceTrackerANDROID faceTracker;
XrFaceTrackerCreateInfoANDROID
        createInfo{.type = XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID,
                    .next = nullptr};
CHK_XR(xrCreateFaceTrackerANDROID(session, &createInfo, &faceTracker));
// If the system supports face calibration:
XrBool32 isCalibrated;
CHK_XR(xrGetFaceCalibrationStateANDROID(faceTracker, &isCalibrated));
if (!isCalibrated) {
    // Redirect the user to system calibration setting.
}
XrFaceStateANDROID faceState;
float faceExpressionParameters[XR_FACE_PARAMETER_COUNT_ANDROID];
faceState.type = XR_TYPE_FACE_STATE_ANDROID;
faceState.next = nullptr;
faceState.parametersCapacityInput = XR_FACE_PARAMETER_COUNT_ANDROID;
faceState.parameters = faceExpressionParameters;
float regionConfidences[XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID];
faceState.regionConfidencesCapacityInput = XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID;
faceState.regionConfidences = regionConfidences;
while (1) {
    // ...
    // For every frame in the frame loop
    // ...
    XrFrameState frameState; // previously returned from xrWaitFrame
    XrFaceStateGetInfoANDROID faceGetInfo{
            .type = XR_TYPE_FACE_STATE_GET_INFO_ANDROID,
            .next = nullptr,
            .time = frameState.predictedDisplayTime,
    };
    CHK_XR(xrGetFaceStateANDROID(faceTracker, &faceGetInfo, &faceState));
    if (faceState.isValid) {
        for (uint32_t i = 0; i < XR_FACE_PARAMETER_COUNT_ANDROID; ++i) {
            // parameters[i] contains a weight of specific blend shape
        }
        for (uint32_t i = 0; i < XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID; ++i) {
            // regionConfidences[i] contains a confidence value of a specific region
        }
    }
}
// after usage
CHK_XR(xrDestroyFaceTrackerANDROID(faceTracker));
Nowe typy obiektów
Nowe stałe wyliczeniowe
- XR_FACE_PARAMETER_COUNT_ANDROID
Wyliczenie XrObjectType zostało rozszerzone o:
- XR_OBJECT_TYPE_FACE_TRACKER_ANDROID
Wyliczenie XrStructureType zostało rozszerzone o:
- XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID
- XR_TYPE_FACE_STATE_GET_INFO_ANDROID
- XR_TYPE_FACE_STATE_ANDROID
- XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID
Nowe wartości w polu enum
Nowe struktury
- XrFaceTrackerCreateInfoANDROID
- XrFaceStateGetInfoANDROID
- XrFaceStateANDROID
- XrSystemFaceTrackingPropertiesANDROID
Nowe funkcje
- xrCreateFaceTrackerANDROID
- xrDestroyFaceTrackerANDROID
- xrGetFaceStateANDROID
- xrGetFaceCalibrationStateANDROID
Problemy
Historia wersji
- Wersja 1, 5 września 2024 r. (Levana Chen)
- Wstępny opis rozszerzenia
 
- Wersja 2, 2025-04-01 (Kenny Vercaemer)
- Dodano regiony ufności dotyczące twarzy
 
- Wersja 3, 4 czerwca 2025 r. (Levana Chen)
- Dodano nowy kod błędu.
 
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.
