名称字符串
XR_ANDROID_face_tracking
扩展类型
实例扩展程序
已注册的扩展程序编号
459
修订版本
3
扩展程序和版本依赖项
上次修改日期
2025-06-04
IP 状态
没有已知的 IP 权利主张。
贡献者
Spencer Quin,Google
Jared Finder,Google
Levana Chen,Google
概览
此扩展程序可让应用获取混合形状的权重,并在 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,用于指示当前系统是否支持面部追踪。
应用可以通过在调用 xrGetSystemProperties 时使用 XrSystemFaceTrackingPropertiesANDROID 结构扩展 XrSystemProperties 来检查系统是否支持人脸跟踪。
当且仅当运行时针对 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。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_face_tracking扩展程序,然后才能调用 xrCreateFaceTrackerANDROID session必须是有效的 XrSession 句柄createInfo必须是指向有效 XrFaceTrackerCreateInfoANDROID 结构的指针faceTracker必须是指向 XrFaceTrackerANDROID 句柄的指针
返回代码
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
XrFaceTrackerCreateInfoANDROID 结构描述如下:
typedef struct XrFaceTrackerCreateInfoANDROID {
XrStructureType type;
void* next;
} XrFaceTrackerCreateInfoANDROID;
会员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。
XrFaceTrackerCreateInfoANDROID 结构描述了用于创建 XrFaceTrackerANDROID 句柄的信息。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_face_tracking扩展程序,然后才能使用 XrFaceTrackerCreateInfoANDROID type必须为XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROIDnext必须是NULL或指向结构链中下一个结构的有效指针
xrDestroyFaceTrackerANDROID 函数的定义如下:
XrResult xrDestroyFaceTrackerANDROID(
XrFaceTrackerANDROID faceTracker);
参数说明
faceTracker是一个先前由 xrCreateFaceTrackerANDROID 创建的 XrFaceTrackerANDROID。
当人脸跟踪体验结束时,xrDestroyFaceTrackerANDROID 函数会释放 faceTracker 和底层资源。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_face_tracking扩展程序,然后才能调用 xrDestroyFaceTrackerANDROID faceTracker必须是有效的 XrFaceTrackerANDROID 句柄
线程安全
- 对
faceTracker及其任何子句柄的访问都必须在外部进行同步
返回代码
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_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_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
获取面部表情
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_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
XrFaceStateGetInfoANDROID 结构描述了要获取的面部表情信息。
typedef struct XrFaceStateGetInfoANDROID {
XrStructureType type;
void* next;
XrTime time;
} XrFaceStateGetInfoANDROID;
会员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。time是请求面部表情的XrTime。
应用应请求等于渲染帧的预测显示时间的时间。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_face_tracking扩展程序,然后才能使用 XrFaceStateGetInfoANDROID type必须为XR_TYPE_FACE_STATE_GET_INFO_ANDROIDnext必须是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是一个uint32_t,用于描述parameters数组的容量,或设为 0 以请求获取所需的容量。parametersCountOutput是一个uint32_t,用于描述parameters的数量;若parametersCapacityInput容量不足,则描述所需的容量。parameters是一个指向应用分配的float数组的指针,该数组将填充面部表情混合形状的权重。faceTrackingState是面部跟踪有效性状态的XrFaceTrackingStateANDROID。sampleTime是一个XrTime时间,返回的表达式将跟踪或外推到该时间。如果当时的外推成功,则等于请求表达式权重的相应时间。isValid表示即使数据不是来自当前帧,是否也有效。regionConfidencesCapacityInput是一个uint32_t,用于描述regionConfidences数组的容量,或设为 0 以请求获取所需的容量。regionConfidencesCountOutput是一个uint32_t,用于描述regionConfidences的数量;若regionConfidencesCapacityInput容量不足,则描述所需的容量。regionConfidences是指向应用分配的float数组的指针,该数组将填充每个面部区域的置信度值。- 如需详细了解如何检索所需的
parameters和regionConfidences大小,请参阅缓冲区大小参数部分。
应用可以将 parametersCapacityInput 设置为 XR_FACE_PARAMETER_COUNT_ANDROID,以获取由 XrFaceParameterIndicesANDROID 编入索引的面部表情。
返回的 parameters 表示当前面部表情的混合形状的权重。
parameters 数组更新将按顺序进行,以便应用可以使用相应的面部表情枚举(例如 XrFaceParameterIndicesANDROID)为元素编制索引。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_face_tracking扩展程序,然后才能使用 XrFaceStateANDROID type必须为XR_TYPE_FACE_STATE_ANDROIDnext必须是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 的阈值来完全停用相应面部区域中的 blendshape。
“下半脸”区域表示眼睛下方的所有内容,包括嘴巴、下巴、脸颊和鼻子。眼部区域包括眼睛和眉毛区域。
下表介绍了与每个置信度区域关联的混合形状:
| 置信区间 | 混合形状 |
|---|---|
| 下半张脸 | `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 为精简版 G-Nome 格式定义了 68 个混合形状。此枚举中的每个形参都是一个混合形状数组的索引,该数组的值为 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 | 下颌前推 |
|
|
| 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_ANDROIDXR_TYPE_FACE_STATE_GET_INFO_ANDROIDXR_TYPE_FACE_STATE_ANDROIDXR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID
新枚举
新结构
- XrFaceTrackerCreateInfoANDROID
- XrFaceStateGetInfoANDROID
- XrFaceStateANDROID
- XrSystemFaceTrackingPropertiesANDROID
新函数
- xrCreateFaceTrackerANDROID
- xrDestroyFaceTrackerANDROID
- xrGetFaceStateANDROID
- xrGetFaceCalibrationStateANDROID
问题
版本历史记录
- 修订版本 1,2024 年 9 月 5 日(Levana Chen)
- 初始扩展程序说明
- 修订版本 2,2025 年 4 月 1 日 (Kenny Vercaemer)
- 添加了人脸置信度区域
- 修订版本 3,2025 年 6 月 4 日(Levana Chen)
- 添加了新的错误代码。
OpenXR™ 和 OpenXR 徽标是 The Khronos Group Inc. 拥有的商标,已在中国、欧盟、日本和英国注册为商标。