名稱字串
XR_ANDROID_face_tracking
擴充功能類型
執行個體擴充功能
擴充功能註冊編號
459
修訂版本
3
擴充功能和版本依附元件
上次修改日期
2025-06-04
IP 狀態
未發現任何智慧財產權聲明。
著作人
Google 的 Spencer Quin
Google 員工 Jared Finder
Google 的 Levana Chen
總覽
這項擴充功能可讓應用程式取得混合形狀的權重,並在 XR 體驗中算繪臉部表情。
這項擴充功能旨在提供必要資訊,以便在虛擬空間中建立逼真的虛擬人偶,以及使用者的生動呈現方式。應用程式可以先檢查臉部校正是否已啟用,再取得混合形狀的權重。
臉部追蹤器
臉部追蹤器是一種感應裝置,可透過面向使用者的影像串流和攝影機校正功能追蹤臉部表情。這項擴充功能的用途主要是將使用者臉部表情對應至虛擬場景中的虛擬人偶。
臉部追蹤資料屬於私密個人資訊,與個人隱私和完整性息息相關。強烈建議應用程式在儲存或轉移臉部追蹤資料時,一律要求使用者主動且明確同意。
- 應用程式建立有效的臉部追蹤器時,會收到
XR_ERROR_PERMISSION_INSUFFICIENT
,直到應用程式獲准存取臉部追蹤器為止。 - 使用 xrGetFaceStateANDROID 取得臉部狀態時,除非已允許應用程式存取權,否則 XrFaceStateANDROID::isValid 不會傳回
XR_TRUE
。
檢查系統功能
XrSystemFaceTrackingPropertiesANDROID 結構體的定義如下:
typedef struct XrSystemFaceTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsFaceTracking;
} XrSystemFaceTrackingPropertiesANDROID;
成員說明
type
是這個結構的 XrStructureType。next
是NULL
,或是指向結構鏈中下一個結構的指標。supportsFaceTracking
是 XrBool32,指出目前系統是否支援臉部追蹤。
應用程式可以透過 XrSystemFaceTrackingPropertiesANDROID 結構體擴充 XrSystemProperties,在呼叫 xrGetSystemProperties 時檢查系統是否支援臉部追蹤。
只有在執行階段針對 supportsFaceTracking
傳回 XR_FALSE
時,執行階段必須從 xrCreateFaceTrackerANDROID 傳回 XR_ERROR_FEATURE_UNSUPPORTED
。
建立臉部追蹤器控制代碼
XR_DEFINE_HANDLE(XrFaceTrackerANDROID)
XrFaceTrackerANDROID 控制代碼代表臉部追蹤的臉部追蹤器。
這個控制代碼可用於透過這個擴充功能中的其他函式存取臉部追蹤資料。
xrCreateFaceTrackerANDROID 函式定義如下:
XrResult xrCreateFaceTrackerANDROID(
XrSession session,
const XrFaceTrackerCreateInfoANDROID* createInfo,
XrFaceTrackerANDROID* faceTracker);
參數說明
session
是 XrSession 控制代碼,臉部追蹤器將在其中啟用。createInfo
是用來指定臉部追蹤器的 XrFaceTrackerCreateInfoANDROID。faceTracker
是傳回的 XrFaceTrackerANDROID 控制代碼。
應用程式可以使用 xrCreateFaceTrackerANDROID 函式建立 XrFaceTrackerANDROID 控制代碼。
如果系統不支援臉部追蹤,xrCreateFaceTrackerANDROID 會傳回 XR_ERROR_FEATURE_UNSUPPORTED
。
有效用量 (隱含)
- 呼叫 xrCreateFaceTrackerANDROID 前,必須先啟用
XR_ANDROID_face_tracking
擴充功能 session
必須是有效的 XrSession 控制代碼createInfo
必須是指向有效 XrFaceTrackerCreateInfoANDROID 結構體的指標faceTracker
必須是指向 XrFaceTrackerANDROID 控制代碼的指標
傳回代碼
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
XrFaceTrackerCreateInfoANDROID 結構體說明如下:
typedef struct XrFaceTrackerCreateInfoANDROID {
XrStructureType type;
void* next;
} XrFaceTrackerCreateInfoANDROID;
成員說明
type
是這個結構的 XrStructureType。next
是NULL
,或是指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。
XrFaceTrackerCreateInfoANDROID 結構會說明建立 XrFaceTrackerANDROID 控制代碼的資訊。
有效用量 (隱含)
- 使用 XrFaceTrackerCreateInfoANDROID 前,
XR_ANDROID_face_tracking
擴充功能必須啟用。 type
必須為XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID
next
必須是NULL
或指向結構鏈中下一個結構的有效指標
xrDestroyFaceTrackerANDROID 函式定義如下:
XrResult xrDestroyFaceTrackerANDROID(
XrFaceTrackerANDROID faceTracker);
參數說明
faceTracker
是先前由 xrCreateFaceTrackerANDROID 建立的 XrFaceTrackerANDROID。
臉部追蹤體驗結束時,xrDestroyFaceTrackerANDROID 函式會釋出 faceTracker
和基礎資源。
有效用量 (隱含)
- 呼叫 xrDestroyFaceTrackerANDROID 前,
XR_ANDROID_face_tracking
擴充功能必須啟用 faceTracker
必須是有效的 XrFaceTrackerANDROID 控制代碼
執行緒安全
faceTracker
和任何子項控制代碼的存取權必須在外部同步處理
傳回代碼
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_HANDLE_INVALID
檢查臉部校正
xrGetFaceCalibrationStateANDROID
函式的定義如下:
XrResult xrGetFaceCalibrationStateANDROID(
XrFaceTrackerANDROID faceTracker,
XrBool32* faceIsCalibratedOutput);
參數說明
faceTracker
是先前由 xrCreateFaceTrackerANDROID 建立的 XrFaceTrackerANDROID。faceIsCalibratedOutput
表示臉部追蹤器是否已校正。
應用程式可以使用 xrGetFaceCalibrationStateANDROID 函式檢查臉部校正狀態。
如果追蹤服務仍在初始化,執行階段「可能」會從 xrGetFaceCalibrationStateANDROID 傳回 XR_ERROR_SERVICE_NOT_READY_ANDROID
,表示應用程式「可以」稍後重試。
如果系統不支援臉部校正,xrGetFaceCalibrationStateANDROID 會傳回 XR_ERROR_FEATURE_UNSUPPORTED
。否則,faceIsCalibratedOutput
可能會設為 XR_TRUE
,以反映臉部校正狀態。
有效用量 (隱含)
- 您必須先啟用
XR_ANDROID_face_tracking
擴充功能,才能呼叫 xrGetFaceCalibrationStateANDROID faceTracker
必須是有效的 XrFaceTrackerANDROID 控制代碼faceIsCalibratedOutput
必須是指向XrBool32
值的指標
傳回代碼
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
取得臉部表情
xrGetFaceStateANDROID 函式會在指定時間傳回臉部表情的混合形狀。
XrResult xrGetFaceStateANDROID(
XrFaceTrackerANDROID faceTracker,
const XrFaceStateGetInfoANDROID* getInfo,
XrFaceStateANDROID* faceStateOutput);
參數說明
faceTracker
是先前由 xrCreateFaceTrackerANDROID 建立的 XrFaceTrackerANDROID。getInfo
是 XrFaceStateGetInfoANDROID 的指標,用於說明要取得臉部表情的資訊。faceStateOutput
是 XrFaceStateANDROID 的指標,用於接收傳回的臉部追蹤狀態和臉部表情。
有效用量 (隱含)
- 必須先啟用
XR_ANDROID_face_tracking
擴充功能,才能呼叫 xrGetFaceStateANDROID faceTracker
必須是有效的 XrFaceTrackerANDROID 控制代碼getInfo
必須是指向有效 XrFaceStateGetInfoANDROID 結構體的指標faceStateOutput
必須是指向 XrFaceStateANDROID 結構的指標
傳回代碼
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
XrFaceStateGetInfoANDROID 結構會說明要取得臉部表情的資訊。
typedef struct XrFaceStateGetInfoANDROID {
XrStructureType type;
void* next;
XrTime time;
} XrFaceStateGetInfoANDROID;
成員說明
type
是這個結構的 XrStructureType。next
是NULL
,或是指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。time
是要求臉部表情的XrTime
。
應用程式應要求與所算繪影格的預測顯示時間相等的時間。
有效用量 (隱含)
- 使用 XrFaceStateGetInfoANDROID 前,
XR_ANDROID_face_tracking
擴充功能必須啟用。 type
必須為XR_TYPE_FACE_STATE_GET_INFO_ANDROID
next
必須是NULL
或指向結構鏈中下一個結構的有效指標
XrFaceStateANDROID 結構會傳回臉部追蹤狀態和臉部表情。
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;
成員說明
type
是這個結構的 XrStructureType。next
是NULL
,或是指向結構鏈中下一個結構的指標。核心 OpenXR 或這個擴充功能中未定義這類結構。parametersCapacityInput
是parameters
陣列容量的uint32_t
,或是 0,表示要求擷取必要容量。parametersCountOutput
是uint32_t
,用於說明parameters
的數量,或parametersCapacityInput
不足時所需的容量。parameters
是應用程式分配的float
陣列指標,會填入臉部表情混合形狀的權重。faceTrackingState
是臉部追蹤有效狀態的XrFaceTrackingStateANDROID
。sampleTime
是XrTime
時間,系統會追蹤或推斷傳回的運算式。如果當時的推斷成功,這會等於要求運算式權重的時間。isValid
表示資料是否有效,即使資料並非來自目前的影格也一樣。regionConfidencesCapacityInput
是regionConfidences
陣列容量的uint32_t
,或是 0,表示要求擷取必要容量。regionConfidencesCountOutput
是uint32_t
,用於說明regionConfidences
的數量,或regionConfidencesCapacityInput
不足時所需的容量。regionConfidences
是應用程式分配的float
陣列指標,會填入每個臉部區域的信賴度值。- 如要詳細瞭解如何擷取必要的
parameters
和regionConfidences
大小,請參閱「緩衝區大小參數」一節。
應用程式可以將 parametersCapacityInput
設為 XR_FACE_PARAMETER_COUNT_ANDROID
,取得以 XrFaceParameterIndicesANDROID 建立索引的臉部表情。
傳回的 parameters
代表目前臉部表情的混合形狀權重。
parameters
陣列更新會排序,讓應用程式可以使用對應的臉部表情列舉 (例如 XrFaceParameterIndicesANDROID) 索引元素。
有效用量 (隱含)
- 使用 XrFaceStateANDROID 前,
XR_ANDROID_face_tracking
擴充功能必須啟用 type
必須為XR_TYPE_FACE_STATE_ANDROID
next
必須是NULL
或指向結構鏈中下一個結構的有效指標- 如果
parametersCapacityInput
不是0, parameters
,則 必須是指向parametersCapacityInput float
值陣列的指標 - 如果
regionConfidencesCapacityInput
不是0, regionConfidences
,則 必須是指向regionConfidencesCapacityInput float
值陣列的指標 faceTrackingState
必須是有效的 XrFaceTrackingStateANDROID 值
XrFaceTrackingStateANDROID 列舉會識別臉部追蹤器的不同狀態。
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;
列舉的意義如下:
列舉 |
說明 |
|
表示臉部追蹤功能已暫停,但日後可能會繼續追蹤。 |
|
追蹤作業已停止,但用戶端仍有有效的臉部追蹤器。 |
|
臉部已追蹤,且姿勢為目前狀態。 |
信賴區域
XR_ANDROID_face_tracking
擴充功能也會提供三個臉部區域 (左眼、右眼和下半臉) 的可信度值。這些值介於 0 (無信心) 到 1 (最高信心),代表每個區域臉部追蹤的準確度。
您可以根據這些信賴度值,逐步停用混合形狀,或對應的臉部區域套用視覺效果濾鏡 (例如模糊)。如要進行基本的開啟/關閉控制,建議使用 0.3 的閾值,完全停用相應臉部區域的混合形狀。
「下半臉」區域代表眼睛以下的所有部位,包括嘴巴、下巴、臉頰和鼻子。眼部區域包括眼睛和眉毛區域。
下表說明與各個信賴區間相關的混合形狀:
信賴區域 | 混合形狀 |
---|---|
下半臉 | `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` |
左/右臉上部 | `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` |
形狀混合的慣例
這個擴充功能會透過 XR_FACE_PARAMETER_COUNT_ANDROID
定義 68 個混合形狀,適用於縮減的 G-Nome 格式。這個列舉中的每個參數都是混合形狀陣列的索引,其值為 float
型別,且執行階段會正規化為 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;
索引 | 名稱 | 參考圖片 | |
---|---|---|---|
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 |
![]() |
![]() |
臉部追蹤的程式碼範例
下列程式碼範例說明如何取得臉部表情混合形狀的所有權重。
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));
新物件類型
新的列舉常數
XR_FACE_PARAMETER_COUNT_ANDROID
XrObjectType 列舉會擴充以下項目:
XR_OBJECT_TYPE_FACE_TRACKER_ANDROID
XrStructureType 列舉會擴充以下項目:
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
新列舉
新結構
- XrFaceTrackerCreateInfoANDROID
- XrFaceStateGetInfoANDROID
- XrFaceStateANDROID
- XrSystemFaceTrackingPropertiesANDROID
新函式
- xrCreateFaceTrackerANDROID
- xrDestroyFaceTrackerANDROID
- xrGetFaceStateANDROID
- xrGetFaceCalibrationStateANDROID
問題
版本記錄
- 修訂版本 1,2024-09-05 (Levana Chen)
- 擴充功能初始說明
- 修訂版本 2,2025-04-01 (Kenny Vercaemer)
- 新增臉部信心區域
- 修訂版本 3,2025-06-04 (Levana Chen)
- 新增錯誤代碼。
OpenXR™ 和 OpenXR 標誌是 The Khronos Group Inc. 的商標,已在中國、歐盟、日本和英國註冊為商標。