Name String
XR_ANDROID_face_tracking
Erweiterungstyp
Instanzerweiterung
Registrierte Durchwahlnummer
459
Revision
3
Abhängigkeiten von Erweiterungen und Versionen
Datum der letzten Änderung
2025-06-04
IP-Status
Es sind keine Ansprüche wegen geistigen Eigentums bekannt.
Mitwirkende
Spencer Quin, Google
Jared Finder, Google
Levana Chen, Google
Übersicht
Mit dieser Erweiterung können Anwendungen Gewichte von Blendshapes abrufen und Gesichtsausdrücke in XR-Anwendungen rendern.
Diese Erweiterung soll die Informationen liefern, die zum Erstellen realistischer Avatare und ausdrucksstarker Darstellungen von Nutzern im virtuellen Raum erforderlich sind. Die Anwendung kann die Aktivierung der Gesichtskalibrierung prüfen, bevor sie die Gewichte von Blendshapes abruft.
Gesichtstracker
Ein Gesichtstracker ist ein Sensor, der Gesichtsausdrücke anhand von nach vorn gerichteten Bildstreams und der Kamerakalibrierung erfasst. Der Hauptzweck dieser Erweiterung besteht darin, die Gesichtsausdrücke von Nutzern ihren Avataren in einer virtuellen Szene zuzuordnen.
Daten zum Gesichtstracking sind sensible personenbezogene Daten und eng mit dem Schutz der Privatsphäre und der Integrität von Personen verbunden. Es wird dringend empfohlen, dass Anwendungen, die Gesichtserkennungsdaten speichern oder übertragen, den Nutzer immer um eine aktive und spezifische Zustimmung bitten.
- Anwendungen erhalten
XR_ERROR_PERMISSION_INSUFFICIENT, wenn sie einen aktiven Gesichtstracker erstellen, bis der Anwendung der Zugriff auf den Gesichtstracker gewährt wurde. - Wenn Sie Gesichtsstatus mit xrGetFaceStateANDROID abrufen, gibt XrFaceStateANDROID::isValid nur dann
XR_TRUEzurück, wenn der Anwendungszugriff zugelassen wurde.
Systemfunktionen prüfen
Die Struktur XrSystemFaceTrackingPropertiesANDROID ist so definiert:
typedef struct XrSystemFaceTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsFaceTracking;
} XrSystemFaceTrackingPropertiesANDROID;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette.supportsFaceTrackingist ein XrBool32, der angibt, ob das aktuelle System die Gesichtserkennung unterstützt.
Eine Anwendung kann prüfen, ob das System in der Lage ist, das Gesicht zu verfolgen, indem sie die XrSystemProperties mit der Struktur XrSystemFaceTrackingPropertiesANDROID erweitert, wenn xrGetSystemProperties aufgerufen wird.
Wenn eine Laufzeit XR_FALSE für supportsFaceTracking zurückgibt, muss die Laufzeit XR_ERROR_FEATURE_UNSUPPORTED von xrCreateFaceTrackerANDROID zurückgeben.
Gesichtstracking-Handle erstellen
XR_DEFINE_HANDLE(XrFaceTrackerANDROID)
Der Handle XrFaceTrackerANDROID stellt einen Face-Tracker für das Face-Tracking dar.
Mit diesem Handle kann über andere Funktionen in dieser Erweiterung auf Daten zur Gesichtserkennung zugegriffen werden.
Die Funktion xrCreateFaceTrackerANDROID ist so definiert:
XrResult xrCreateFaceTrackerANDROID(
XrSession session,
const XrFaceTrackerCreateInfoANDROID* createInfo,
XrFaceTrackerANDROID* faceTracker);
Parameterbeschreibungen
sessionist ein XrSession-Handle, in dem der Gesichtstracker aktiv ist.createInfoist das XrFaceTrackerCreateInfoANDROID, das zum Angeben des Gesichtstrackers verwendet wird.faceTrackerist der zurückgegebene XrFaceTrackerANDROID-Handle.
Eine Anwendung kann ein XrFaceTrackerANDROID-Handle mit der Funktion xrCreateFaceTrackerANDROID erstellen.
Wenn das System die Gesichtserkennung nicht unterstützt, gibt xrCreateFaceTrackerANDROID den Wert XR_ERROR_FEATURE_UNSUPPORTED zurück.
Gültige Nutzung (implizit)
- Die Erweiterung
XR_ANDROID_face_trackingmuss aktiviert werden, bevor xrCreateFaceTrackerANDROID aufgerufen wird. sessionmuss ein gültiger XrSession-Handle sein.createInfomuss ein Zeiger auf eine gültige XrFaceTrackerCreateInfoANDROID-Struktur sein.faceTrackermuss ein Zeiger auf ein XrFaceTrackerANDROID-Handle sein.
Rückgabecodes
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_REACHED
Die Struktur XrFaceTrackerCreateInfoANDROID wird so beschrieben:
typedef struct XrFaceTrackerCreateInfoANDROID {
XrStructureType type;
void* next;
} XrFaceTrackerCreateInfoANDROID;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Im OpenXR-Kern oder in dieser Erweiterung sind keine solchen Strukturen definiert.
Die Struktur XrFaceTrackerCreateInfoANDROID beschreibt die Informationen zum Erstellen eines XrFaceTrackerANDROID-Handles.
Gültige Nutzung (implizit)
- Die Erweiterung
XR_ANDROID_face_trackingmuss aktiviert werden, bevor XrFaceTrackerCreateInfoANDROID verwendet wird. typemussXR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROIDsein.nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.
Die Funktion xrDestroyFaceTrackerANDROID ist so definiert:
XrResult xrDestroyFaceTrackerANDROID(
XrFaceTrackerANDROID faceTracker);
Parameterbeschreibungen
faceTrackerist ein XrFaceTrackerANDROID, der zuvor mit xrCreateFaceTrackerANDROID erstellt wurde.
Mit der Funktion xrDestroyFaceTrackerANDROID werden faceTracker und die zugrunde liegenden Ressourcen freigegeben, wenn die Gesichtserkennung beendet ist.
Gültige Nutzung (implizit)
- Die Erweiterung
XR_ANDROID_face_trackingmuss aktiviert werden, bevor xrDestroyFaceTrackerANDROID aufgerufen wird. faceTrackermuss ein gültiger XrFaceTrackerANDROID-Handle sein.
Threadsicherheit
- Der Zugriff auf
faceTrackerund alle untergeordneten Handles muss extern synchronisiert werden.
Rückgabecodes
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Gesichtskalibrierung prüfen
Die Funktion xrGetFaceCalibrationStateANDROID ist so definiert:
XrResult xrGetFaceCalibrationStateANDROID(
XrFaceTrackerANDROID faceTracker,
XrBool32* faceIsCalibratedOutput);
Parameterbeschreibungen
faceTrackerist ein XrFaceTrackerANDROID, der zuvor mit xrCreateFaceTrackerANDROID erstellt wurde.faceIsCalibratedOutputgibt an, ob der Gesichtstracker kalibriert wurde.
Eine Anwendung kann den Status der Gesichtskalibrierung mit der Funktion xrGetFaceCalibrationStateANDROID prüfen.
Wenn der Tracking-Dienst noch initialisiert wird, kann die Laufzeit XR_ERROR_SERVICE_NOT_READY_ANDROID von xrGetFaceCalibrationStateANDROID zurückgeben, um anzugeben, dass die Anwendung es später noch einmal versuchen kann.
Wenn das System die Gesichtskalibrierung nicht unterstützt, gibt xrGetFaceCalibrationStateANDROID den Wert XR_ERROR_FEATURE_UNSUPPORTED zurück. Andernfalls kann faceIsCalibratedOutput auf XR_TRUE gesetzt werden, um den Status der Gesichtskalibrierung widerzuspiegeln.
Gültige Nutzung (implizit)
- Die Erweiterung
XR_ANDROID_face_trackingmuss aktiviert sein, bevor xrGetFaceCalibrationStateANDROID aufgerufen wird. faceTrackermuss ein gültiger XrFaceTrackerANDROID-Handle sein.faceIsCalibratedOutputmuss ein Zeiger auf einenXrBool32-Wert sein.
Rückgabecodes
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_SERVICE_NOT_READY_ANDROID
Gesichtsausdrücke abrufen
Die Funktion xrGetFaceStateANDROID gibt Blendshapes von Gesichtsausdrücken zu einem bestimmten Zeitpunkt zurück.
XrResult xrGetFaceStateANDROID(
XrFaceTrackerANDROID faceTracker,
const XrFaceStateGetInfoANDROID* getInfo,
XrFaceStateANDROID* faceStateOutput);
Parameterbeschreibungen
faceTrackerist ein XrFaceTrackerANDROID, der zuvor mit xrCreateFaceTrackerANDROID erstellt wurde.getInfoist ein Zeiger auf XrFaceStateGetInfoANDROID, der Informationen zum Abrufen von Gesichtsausdrücken beschreibt.faceStateOutputist ein Zeiger auf XrFaceStateANDROID, der den zurückgegebenen Gesichtserkennungsstatus und die Gesichtsausdrücke empfängt.
Gültige Nutzung (implizit)
- Die Erweiterung
XR_ANDROID_face_trackingmuss aktiviert sein, bevor xrGetFaceStateANDROID aufgerufen wird. faceTrackermuss ein gültiger XrFaceTrackerANDROID-Handle sein.getInfomuss ein Zeiger auf eine gültige XrFaceStateGetInfoANDROID-Struktur sein.faceStateOutputmuss ein Zeiger auf eine XrFaceStateANDROID-Struktur sein.
Rückgabecodes
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_INVALID
Die Struktur XrFaceStateGetInfoANDROID beschreibt die Informationen, die zum Abrufen von Gesichtsausdrücken erforderlich sind.
typedef struct XrFaceStateGetInfoANDROID {
XrStructureType type;
void* next;
XrTime time;
} XrFaceStateGetInfoANDROID;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Im OpenXR-Kern oder in dieser Erweiterung sind keine solchen Strukturen definiert.timeist einXrTime, für den die Gesichtsausdrücke angefordert werden.
Anwendungen sollten eine Zeit anfordern, die der vorhergesagten Anzeigezeit für den gerenderten Frame entspricht.
Gültige Nutzung (implizit)
- Die Erweiterung
XR_ANDROID_face_trackingmuss aktiviert werden, bevor XrFaceStateGetInfoANDROID verwendet wird. typemussXR_TYPE_FACE_STATE_GET_INFO_ANDROIDsein.nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.
Die Struktur XrFaceStateANDROID gibt den Status des Gesichtstrackings und Gesichtsausdrücke zurück.
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;
Mitgliederbeschreibungen
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Im OpenXR-Kern oder in dieser Erweiterung sind keine solchen Strukturen definiert.parametersCapacityInputist einuint32_t, das die Kapazität desparameters-Arrays beschreibt, oder 0, um eine Anfrage zum Abrufen der erforderlichen Kapazität anzugeben.parametersCountOutputist einuint32_t, das die Anzahl derparametersoder die erforderliche Kapazität beschreibt, fallsparametersCapacityInputnicht ausreicht.parametersist ein Zeiger auf ein von der Anwendung zugewiesenes Array vonfloat, das mit Gewichten von Blendshapes für Gesichtsausdrücke gefüllt wird.faceTrackingStateist derXrFaceTrackingStateANDROIDdes Gültigkeitsstatus des Gesichtserkennungstrackings.sampleTimeist eineXrTime-Zeit, auf die die zurückgegebenen Ausdrücke bezogen oder extrapoliert werden. Sie entspricht dem Zeitpunkt, zu dem die Ausdrucksgewichte angefordert wurden, wenn die Extrapolation zu diesem Zeitpunkt erfolgreich war.isValidgibt an, ob die Daten gültig sind, auch wenn sie nicht aus dem aktuellen Frame stammen.regionConfidencesCapacityInputist einuint32_t, das die Kapazität desregionConfidences-Arrays beschreibt, oder 0, um eine Anfrage zum Abrufen der erforderlichen Kapazität anzugeben.regionConfidencesCountOutputist einuint32_t, das die Anzahl derregionConfidencesoder die erforderliche Kapazität beschreibt, fallsregionConfidencesCapacityInputnicht ausreicht.regionConfidencesist ein Zeiger auf ein von der Anwendung zugewiesenes Array vonfloat, das mit Konfidenzwerten für jede Gesichtsregion gefüllt wird.- Eine detaillierte Beschreibung zum Abrufen der erforderlichen
parameters- undregionConfidences-Größe finden Sie im Abschnitt Puffergrößenparameter.
Die Anwendung kann parametersCapacityInput auf XR_FACE_PARAMETER_COUNT_ANDROID festlegen, um Gesichtsausdrücke zu erhalten, die durch XrFaceParameterIndicesANDROID indexiert werden.
Die zurückgegebenen parameters stellen die Gewichte der Blendshapes der aktuellen Gesichtsausdrücke dar.
Die parameters-Array-Updates werden so sortiert, dass die Anwendung Elemente mithilfe des entsprechenden Enums für Gesichtsausdrücke (z.B. XrFaceParameterIndicesANDROID) indexieren kann.
Gültige Nutzung (implizit)
- Die Erweiterung
XR_ANDROID_face_trackingmuss aktiviert werden, bevor XrFaceStateANDROID verwendet wird. typemussXR_TYPE_FACE_STATE_ANDROIDsein.nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.- Wenn
parametersCapacityInputnicht0, parametersist, muss ein Zeiger auf ein Array vonparametersCapacityInput float-Werten sein. - Wenn
regionConfidencesCapacityInputnicht0, regionConfidencesist, muss ein Zeiger auf ein Array vonregionConfidencesCapacityInput float-Werten sein. faceTrackingStatemuss ein gültiger XrFaceTrackingStateANDROID-Wert sein.
Die Enumeration XrFaceTrackingStateANDROID gibt die verschiedenen Status des Face Trackers an.
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;
Die Enums haben die folgenden Bedeutungen:
Enum |
Beschreibung |
|
Gibt an, dass die Gesichtserkennung pausiert ist, aber in Zukunft fortgesetzt werden kann. |
|
Das Tracking wurde beendet, aber der Client hat immer noch einen aktiven Gesichtstracker. |
|
Das Gesicht wird verfolgt und seine Pose ist aktuell. |
Konfidenzbereiche
Die XR_ANDROID_face_tracking-Erweiterung liefert auch Konfidenzwerte für drei Gesichtsbereiche: linkes Auge, rechtes Auge und unteres Gesicht. Diese Werte reichen von 0 (keine Konfidenz) bis 1 (höchste Konfidenz) und geben die Genauigkeit des Gesichts-Trackings für jede Region an.
Sie können diese Vertrauenswerte verwenden, um Blendshapes schrittweise zu deaktivieren oder visuelle Filter (z. B. Weichzeichnen) auf den entsprechenden Gesichtsbereich anzuwenden. Für eine einfache Ein-/Aus-Steuerung empfehlen wir, einen Schwellenwert von 0,3 zu verwenden, um Blendshapes im entsprechenden Gesichtsbereich vollständig zu deaktivieren.
Der Bereich „Unteres Gesicht“ umfasst alles unter den Augen, einschließlich Mund, Kinn, Wange und Nase. Die Augenregion umfasst die Augen und den Bereich der Augenbrauen.
In der folgenden Tabelle werden die Blendshapes beschrieben, die den einzelnen Vertrauensbereichen zugeordnet sind:
| Konfidenzbereich | Blendshapes |
|---|---|
| Unteres Gesicht | `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` |
| Linke/rechte obere Gesichtshälfte | `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` |
Konventionen für Blendshapes
Diese Erweiterung definiert 68 Blendshapes über XR_FACE_PARAMETER_COUNT_ANDROID für das reduzierte G-Nome-Format. Jeder Parameter in diesem Enum ist ein Index in ein Blendshape-Array, dessen Werte vom Typ float sind und das zur Laufzeit auf 1 – 0 normalisiert wird.
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;
| Index | Name | Referenzbild | |
|---|---|---|---|
| 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 | MOUTH_LEFT |
|
|
| 54 | MOUTH_RIGHT |
|
|
| 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 | TONGUE_OUT |
|
|
| 64 | TONGUE_LEFT |
|
|
| 65 | TONGUE_RIGHT |
|
|
| 66 | TONGUE_UP |
|
|
| 67 | TONGUE_DOWN |
|
|
Beispielcode für das Gesichtstracking
Im folgenden Beispielcode wird gezeigt, wie Sie alle Gewichte für Blendshapes für Gesichtsausdrücke abrufen.
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));
Neue Objekttypen
Neue Enum-Konstanten
XR_FACE_PARAMETER_COUNT_ANDROID
Die Enumeration XrObjectType wird um Folgendes erweitert:
XR_OBJECT_TYPE_FACE_TRACKER_ANDROID
Die Enumeration XrStructureType wird um Folgendes erweitert:
XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_FACE_STATE_GET_INFO_ANDROIDXR_TYPE_FACE_STATE_ANDROIDXR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID
Neue Enums
Neue Strukturen
- XrFaceTrackerCreateInfoANDROID
- XrFaceStateGetInfoANDROID
- XrFaceStateANDROID
- XrSystemFaceTrackingPropertiesANDROID
Neue Funktionen
- xrCreateFaceTrackerANDROID
- xrDestroyFaceTrackerANDROID
- xrGetFaceStateANDROID
- xrGetFaceCalibrationStateANDROID
Probleme
Versionsverlauf
- Version 1, 05.09.2024 (Levana Chen)
- Erste Beschreibung der Erweiterung
- Version 2, 01.04.2025 (Kenny Vercaemer)
- Konfidenzbereiche für Gesichter hinzugefügt
- Version 3, 04.06.2025 (Levana Chen)
- Neuer Fehlercode hinzugefügt.
OpenXR™ und das OpenXR-Logo sind Marken von The Khronos Group Inc. und sind in China, der Europäischen Union, Japan und dem Vereinigten Königreich als Marke eingetragen.