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_INSUFFICIENT
podczas 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
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur.supportsFaceTracking
to 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
session
to uchwyt XrSession, w którym będzie aktywny moduł śledzenia twarzy.createInfo
to struktura XrFaceTrackerCreateInfoANDROID używana do określania modułu śledzenia twarzy.faceTracker
to 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_tracking
musi być włączone przed wywołaniem funkcji xrCreateFaceTrackerANDROID. session
musi być prawidłowym uchwytem XrSession.createInfo
musi być wskaźnikiem do prawidłowej struktury XrFaceTrackerCreateInfoANDROIDfaceTracker
musi 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
type
to XrStructureType tej struktury.next
toNULL
lub 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_tracking
musi być włączone przed użyciem XrFaceTrackerCreateInfoANDROID. type
musi mieć wartośćXR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID
next
musi być wartościąNULL
lub 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
faceTracker
to 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_tracking
musi być włączone przed wywołaniem funkcji xrDestroyFaceTrackerANDROID. faceTracker
musi być prawidłowym uchwytem XrFaceTrackerANDROID
Bezpieczeństwo wątków
- Dostęp do
faceTracker
i 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
faceTracker
to obiekt XrFaceTrackerANDROID utworzony wcześniej przez funkcję xrCreateFaceTrackerANDROID.faceIsCalibratedOutput
wskazuje, 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_tracking
musi być włączone przed wywołaniem funkcji xrGetFaceCalibrationStateANDROID. faceTracker
musi być prawidłowym uchwytem XrFaceTrackerANDROIDfaceIsCalibratedOutput
musi być wskaźnikiem do wartościXrBool32
.
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
faceTracker
to obiekt XrFaceTrackerANDROID utworzony wcześniej przez funkcję xrCreateFaceTrackerANDROID.getInfo
to wskaźnik do funkcji XrFaceStateGetInfoANDROID, która opisuje informacje potrzebne do uzyskania wyrazu twarzy.faceStateOutput
to wskaźnik do XrFaceStateANDROID, który otrzymuje zwrócony stan śledzenia twarzy i mimikę.
Prawidłowe użycie (domyślne)
- Rozszerzenie
XR_ANDROID_face_tracking
musi być włączone przed wywołaniem funkcji xrGetFaceStateANDROID. faceTracker
musi być prawidłowym uchwytem XrFaceTrackerANDROIDgetInfo
musi być wskaźnikiem do prawidłowej struktury XrFaceStateGetInfoANDROIDfaceStateOutput
musi 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
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.time
toXrTime
, 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_tracking
musi być włączone przed użyciem funkcji XrFaceStateGetInfoANDROID. type
musi mieć wartośćXR_TYPE_FACE_STATE_GET_INFO_ANDROID
next
musi być wartościąNULL
lub 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
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.parametersCapacityInput
touint32_t
opisująca pojemność tablicyparameters
lub 0, jeśli chcesz pobrać wymagane zasoby.parametersCountOutput
touint32_t
opisująca liczbęparameters
lub wymaganą pojemność w przypadku, gdyparametersCapacityInput
jest niewystarczająca.parameters
to wskaźnik do tablicyfloat
przydzielonej przez aplikację, która zostanie wypełniona wagami kształtów mieszanych wyrazu twarzy.faceTrackingState
toXrFaceTrackingStateANDROID
stanu ważności śledzenia twarzy.sampleTime
toXrTime
czas, 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.isValid
wskazuje, czy dane są prawidłowe, nawet jeśli nie pochodzą z bieżącej klatki.regionConfidencesCapacityInput
touint32_t
opisująca pojemność tablicyregionConfidences
lub 0, jeśli chcesz pobrać wymagane zasoby.regionConfidencesCountOutput
touint32_t
opisująca liczbęregionConfidences
lub wymaganą pojemność w przypadku, gdyregionConfidencesCapacityInput
jest niewystarczająca.regionConfidences
to wskaźnik do tablicyfloat
przydzielonej przez aplikację, która zostanie wypełniona wartościami ufności dla każdego obszaru twarzy.- Szczegółowy opis pobierania wymaganych rozmiarów
parameters
iregionConfidences
znajdziesz 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_tracking
musi być włączone przed użyciem XrFaceStateANDROID. type
musi mieć wartośćXR_TYPE_FACE_STATE_ANDROID
next
musi być wartościąNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.- Jeśli
parametersCapacityInput
nie jest0, parameters
, musi być wskaźnikiem do tablicy wartościparametersCapacityInput float
. - Jeśli
regionConfidencesCapacityInput
nie jest0, regionConfidences
, musi być wskaźnikiem do tablicy wartościregionConfidencesCapacityInput float
. faceTrackingState
musi 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.