XR_ANDROID_eye_tracking
名称字符串
XR_ANDROID_eye_tracking
扩展类型
实例扩展程序
已注册的扩展程序编号
457
修订版本
1
批准状态
未批准
扩展程序和版本依赖项
上次修改日期
2025-01-17
IP 状态
没有已知的 IP 权利主张。
创作贡献者
Spencer Quin,Google
Jared Finder,Google
Levana Chen,Google
Kenny Vercaemer,Google
Prasanthi Gurumurthy,Google
Nihav Jain,Google
概览
此扩展程序可让应用获取用户眼睛的位置和方向,以及眼动追踪状态。
眼动追踪数据以两种模式提供:粗略模式和精细模式。粗略跟踪可提供对用户眼部的粗略估计,而精细跟踪可提供更准确的估计。粗略跟踪适用于想要提供类似头像的基本表示形式的应用,而精细跟踪适用于需要更精确的应用。
对于互动,XR_EXT_eye_gaze_interaction 应该使用。
权限
Android 应用必须在其清单中列出 android.permission.EYE_TRACKING_COARSE 或 android.permission.EYE_TRACKING_FINE 权限。这些权限被视为危险权限。应用必须在运行时请求该权限才能使用以下函数:
- xrCreateEyeTrackerANDROID(至少一种权限)
- xrGetCoarseTrackingEyesInfoANDROID (android.permission.EYE_TRACKING_COARSE)
- xrGetFineTrackingEyesInfoANDROID (android.permission.EYE_TRACKING_FINE)
(保护级别:危险)
检查系统功能
XrSystemEyeTrackingPropertiesANDROID 结构的定义如下:
typedef struct XrSystemEyeTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsEyeTracking;
} XrSystemEyeTrackingPropertiesANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。supportsEyeTracking是一个XrBool32,用于指示当前系统是否支持眼动追踪。
应用可以通过在调用 xrGetSystemProperties 时使用 XrSystemEyeTrackingPropertiesANDROID 结构体扩展 XrSystemProperties 来检查系统是否支持眼动追踪。
当且仅当运行时针对 supportsEyeTracking 返回 XR_FALSE 时,运行时必须从 xrCreateEyeTrackerANDROID 返回 XR_ERROR_FEATURE_UNSUPPORTED。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_eye_tracking扩展程序,然后才能使用 XrSystemEyeTrackingPropertiesANDROID -
type必须为XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针
创建眼动追踪器句柄
XR_DEFINE_HANDLE(XrEyeTrackerANDROID)
XrEyeTrackerANDROID 句柄表示用于跟踪眼睛并准确映射用户注视位置的眼动追踪器。
眼动追踪数据属于敏感的个人信息,与个人隐私和完整性密切相关。强烈建议存储或传输眼动追踪数据的应用始终要求用户主动明确接受此操作。
应用使用此句柄通过此扩展程序中的其他函数访问眼动追踪数据。
眼动追踪可在场景中显示眼部姿势和状态。
xrCreateEyeTrackerANDROID 函数的定义如下:
XrResult xrCreateEyeTrackerANDROID(
XrSession session,
const XrEyeTrackerCreateInfoANDROID* createInfo,
XrEyeTrackerANDROID* eyeTracker);
参数说明
session是眼动追踪将处于活动状态的 XrSession 句柄。createInfo是用于指定眼动追踪的 XrEyeTrackerCreateInfoANDROID。eyeTracker是返回的 XrEyeTrackerANDROID 句柄。
应用使用 xrCreateEyeTrackerANDROID 函数创建 XrEyeTrackerANDROID 句柄。
如果系统不支持眼动追踪,运行时必须从 xrCreateEyeTrackerANDROID 返回 XR_ERROR_FEATURE_UNSUPPORTED。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_eye_tracking扩展程序,然后才能调用 xrCreateEyeTrackerANDROID -
session必须是有效的 XrSession 句柄 -
createInfo必须是指向有效 XrEyeTrackerCreateInfoANDROID 结构的指针 -
eyeTracker必须是指向 XrEyeTrackerANDROID 句柄的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
XrEyeTrackerCreateInfoANDROID 结构的定义如下:
typedef struct XrEyeTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrEyeTrackerCreateInfoANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。
XrEyeTrackerCreateInfoANDROID 结构描述了用于创建 XrEyeTrackerANDROID 句柄的信息。
有效使用情况(隐式)
-
XR_ANDROID_eye_tracking扩展程序必须先启用,然后才能使用 XrEyeTrackerCreateInfoANDROID -
type必须为XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针
xrDestroyEyeTrackerANDROID 函数的定义如下:
XrResult xrDestroyEyeTrackerANDROID(
XrEyeTrackerANDROID eyeTracker);
参数说明
eyeTracker是一个先前由 xrCreateEyeTrackerANDROID 创建的 XrEyeTrackerANDROID。
xrDestroyEyeTrackerANDROID 函数会在完成眼动追踪体验后释放 eyeTracker 和底层资源。
有效使用情况(隐式)
-
XR_ANDROID_eye_tracking扩展程序必须先启用,然后才能调用 xrDestroyEyeTrackerANDROID -
eyeTracker必须是有效的 XrEyeTrackerANDROID 句柄
线程安全
- 对
eyeTracker及其任何子句柄的访问都必须在外部进行同步
返回代码
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
获取眼睛信息
xrGetCoarseTrackingEyesInfoANDROID 函数的定义如下:
XrResult xrGetCoarseTrackingEyesInfoANDROID(
XrEyeTrackerANDROID eyeTracker,
const XrEyesGetInfoANDROID* getInfo,
XrEyesANDROID* eyesOutput);
参数说明
eyeTracker是一个先前由 xrCreateEyeTrackerANDROID 创建的 XrEyeTrackerANDROID。getInfo是一个指向 XrEyesGetInfoANDROID 的指针,用于提供查询眼部姿势和状态的信息。eyesOutput是指向 XrEyesANDROID 的指针,其中包含返回的眼睛信息,包括姿势和状态。
xrGetCoarseTrackingEyesInfoANDROID 函数以保护用户隐私的方式获取眼部状态和姿势信息。
如果应用没有 android.permission.EYE_TRACKING_COARSE 权限,运行时必须返回 XR_ERROR_PERMISSION_INSUFFICIENT。
眼部姿势在 XrEyesGetInfoANDROID :: time 时刻以 XrEyesGetInfoANDROID :: baseSpace 表示。
在任何时间点,眼部姿势的位置和方向要么同时处于被跟踪状态,要么同时处于未被跟踪状态。这意味着,运行时必须在提供的 XrEyesANDROID :: eyes 上同时设置 XR_SPACE_LOCATION_POSITION_TRACKED_BIT 和 XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT 或同时清除 XR_SPACE_LOCATION_POSITION_TRACKED_BIT 和 XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT,并设置 XrEyesANDROID :: mode 以指示跟踪状态。
有效使用情况(隐式)
-
XR_ANDROID_eye_tracking扩展程序必须先启用,然后才能调用 xrGetCoarseTrackingEyesInfoANDROID -
eyeTracker必须是有效的 XrEyeTrackerANDROID 句柄 -
getInfo必须是指向有效 XrEyesGetInfoANDROID 结构的指针 -
eyesOutput必须是指向 XrEyesANDROID 结构的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
xrGetFineTrackingEyesInfoANDROID 函数的定义如下:
XrResult xrGetFineTrackingEyesInfoANDROID(
XrEyeTrackerANDROID eyeTracker,
const XrEyesGetInfoANDROID* getInfo,
XrEyesANDROID* eyesOutput);
参数说明
eyeTracker是一个先前由 xrCreateEyeTrackerANDROID 创建的 XrEyeTrackerANDROID。getInfo是一个指向 XrEyesGetInfoANDROID 的指针,用于指定所需的输出。eyesOutput是指向 XrEyesANDROID 的指针,其中包含返回的眼睛信息,包括姿势和状态。
xrGetFineTrackingEyesInfoANDROID 函数可获取比 xrGetCoarseTrackingEyesInfoANDROID 更精确的眼部状态和姿势信息。
如果应用没有 android.permission.EYE_TRACKING_FINE 权限,运行时必须返回 XR_ERROR_PERMISSION_INSUFFICIENT。
眼部信息会在调用 xrGetFineTrackingEyesInfoANDROID 时,使用 XrEyesGetInfoANDROID :: time、XrEyesGetInfoANDROID :: baseSpace 进行解析,并且是相对于基准空间的。运行时必须在调用时解析由 XrEyesGetInfoANDROID :: baseSpace 定义的位置。
在任何时间点,眼部姿势的位置和方向要么同时处于被跟踪状态,要么同时处于未被跟踪状态。这意味着,运行时必须在提供的 XrEyesANDROID :: eyes 上同时设置 XR_SPACE_LOCATION_POSITION_TRACKED_BIT 和 XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT 或同时清除 XR_SPACE_LOCATION_POSITION_TRACKED_BIT 和 XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT,并设置 XrEyesANDROID :: mode 以指示跟踪状态。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_eye_tracking扩展程序,然后才能调用 xrGetFineTrackingEyesInfoANDROID -
eyeTracker必须是有效的 XrEyeTrackerANDROID 句柄 -
getInfo必须是指向有效 XrEyesGetInfoANDROID 结构的指针 -
eyesOutput必须是指向 XrEyesANDROID 结构的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
XrEyesGetInfoANDROID 结构包含检索眼睛姿势和状态所需的信息。
typedef struct XrEyesGetInfoANDROID {
XrStructureType type;
const void* next;
XrTime time;
XrSpace baseSpace;
} XrEyesGetInfoANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。time是用于评估相对于baseSpace的坐标的XrTime。baseSpace是眼部姿态相对于time时刻的 XrSpace。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_eye_tracking扩展程序,然后才能使用 XrEyesGetInfoANDROID -
type必须为XR_TYPE_EYES_GET_INFO_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针 -
baseSpace必须是有效的 XrSpace 句柄
XrEyesANDROID 结构体包含有关所跟踪眼睛的信息。
typedef struct XrEyesANDROID {
XrStructureType type;
void* next;
XrEyeANDROID eyes[XR_EYE_MAX_ANDROID];
XrEyeTrackingModeANDROID mode;
} XrEyesANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展程序中未定义任何此类结构。eyes是一个 XrEyeANDROID 数组,大小为XR_EYE_MAX_ANDROID,用于表示左眼和右眼(由 XrEyeIndexANDROID 编入索引)。mode是 XrEyeTrackingModeANDROID,用于指示当前正在追踪哪只眼睛。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_eye_tracking扩展程序,然后才能使用 XrEyesANDROID -
type必须为XR_TYPE_EYES_ANDROID -
next必须是NULL或指向结构链中下一个结构的有效指针 -
eyes的任何给定元素必须是有效的 XrEyeANDROID 结构 -
mode必须是有效的 XrEyeTrackingModeANDROID 值
XrEyeANDROID 结构描述了眼睛的状态、位置和方向。
typedef struct XrEyeANDROID {
XrEyeStateANDROID eyeState;
XrPosef eyePose;
} XrEyeANDROID;
成员说明
eyeState是眼睛的 XrEyeStateANDROID。eyePose是一个 XrPosef,用于定义在相应 XrEyesGetInfoANDROID ::baseSpace参考系内眼球瞳孔的位置和朝向。这里的单位方向表示 +Z 轴指向用户的眼睛,+X 轴指向右侧,+Y 轴指向上方。
有效使用情况(隐式)
-
XR_ANDROID_eye_tracking扩展程序必须先启用,然后才能使用 XrEyeANDROID -
eyeState必须是有效的 XrEyeStateANDROID 值
XrEyeStateANDROID 枚举用于标识所跟踪眼睛的不同状态。
typedef enum XrEyeStateANDROID {
XR_EYE_STATE_INVALID_ANDROID = 0,
XR_EYE_STATE_GAZING_ANDROID = 1,
XR_EYE_STATE_SHUT_ANDROID = 2,
XR_EYE_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrEyeStateANDROID;
枚举具有以下含义:
枚举说明
XR_EYE_STATE_INVALID_ANDROID
表示眼睛处于错误状态或不存在。
XR_EYE_STATE_GAZING_ANDROID
表示眼睛当前正在注视。
XR_EYE_STATE_SHUT_ANDROID
表示眼睛目前因眨眼而闭上。
XrEyeIndexANDROID 枚举用于标识左眼或右眼的索引。
typedef enum XrEyeIndexANDROID {
XR_EYE_INDEX_LEFT_ANDROID = 0,
XR_EYE_INDEX_RIGHT_ANDROID = 1,
XR_EYE_INDEX_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrEyeIndexANDROID;
枚举具有以下含义:
枚举说明
XR_EYE_INDEX_LEFT_ANDROID
左眼。
XR_EYE_INDEX_RIGHT_ANDROID
右眼。
XrEyeTrackingModeANDROID 枚举用于标识被跟踪眼睛的不同状态。
typedef enum XrEyeTrackingModeANDROID {
XR_EYE_TRACKING_MODE_NOT_TRACKING_ANDROID = 0,
XR_EYE_TRACKING_MODE_RIGHT_ANDROID = 1,
XR_EYE_TRACKING_MODE_LEFT_ANDROID = 2,
XR_EYE_TRACKING_MODE_BOTH_ANDROID = 3,
XR_EYE_TRACKING_MODE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrEyeTrackingModeANDROID;
枚举具有以下含义:
枚举说明
XR_EYE_TRACKING_MODE_NOT_TRACKING_ANDROID
表示眼动追踪功能目前未启用。
XR_EYE_TRACKING_MODE_RIGHT_ANDROID
表示仅追踪右眼。
XR_EYE_TRACKING_MODE_LEFT_ANDROID
表示系统仅追踪左眼。
XR_EYE_TRACKING_MODE_BOTH_ANDROID
表示左眼和右眼都在被追踪。
眼动追踪示例代码
以下示例代码演示了如何获取相对于视图空间的眼睛信息。
XrSession session; // previously initialized, e.g. created at app startup.
XrSpace viewSpace; // space created for XR_REFERENCE_SPACE_TYPE_VIEW.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateEyeTrackerANDROID xrCreateEyeTrackerANDROID; // previously initialized
PFN_xrDestroyEyeTrackerANDROID xrDestroyEyeTrackerANDROID; // previously initialized
PFN_xrGetCoarseTrackingEyesInfoANDROID xrGetCoarseTrackingEyesInfoANDROID; // previously initialized
PFN_xrGetFineTrackingEyesInfoANDROID xrGetFineTrackingEyesInfoANDROID; // previously initialized
// This will use the XrSession that is bound to the eye tracker done at time of creation.
XrEyeTrackerANDROID eyeTracker;
XrEyeTrackerCreateInfoANDROID createInfo{
.type = XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID,
.next = nullptr};
CHK_XR(xrCreateEyeTrackerANDROID(session, &createInfo, &eyeTracker));
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
XrEyesANDROID fineEyesInfo{.type = XR_TYPE_EYES_ANDROID,
.next = nullptr,
.mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
XrEyesANDROID coarseEyesInfo{.type = XR_TYPE_EYES_ANDROID,
.next = nullptr,
.mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
XrEyesGetInfoANDROID eyesGetInfo{.type = XR_TYPE_EYES_GET_INFO_ANDROID,
.next = nullptr,
.time = time,
.baseSpace = viewSpace};
CHK_XR(xrGetCoarseTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &coarseEyesInfo));
CHK_XR(xrGetFineTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &fineEyesInfo));
// eyes tracking information is now available:
// drawLeftEye(eyesInfo.eyes[XR_EYE_INDEX_LEFT_ANDROID].eyePose);
// drawRightEye(eyesInfo.eyes[XR_EYE_INDEX_RIGHT_ANDROID].eyePose);
// ...
// Finish frame loop
// ...
}
// after usage
CHK_XR(xrDestroyEyeTrackerANDROID(eyeTracker));
新的对象类型
新命令
- xrCreateEyeTrackerANDROID
- xrDestroyEyeTrackerANDROID
- xrGetCoarseTrackingEyesInfoANDROID
- xrGetFineTrackingEyesInfoANDROID
新结构
新枚举
新的枚举常量
XR_ANDROID_EYE_TRACKING_EXTENSION_NAMEXR_ANDROID_eye_tracking_SPEC_VERSIONXR_EYE_MAX_ANDROID扩展 XrObjectType:
XR_OBJECT_TYPE_EYE_TRACKER_ANDROID
扩展 XrStructureType:
XR_TYPE_EYES_ANDROIDXR_TYPE_EYES_GET_INFO_ANDROIDXR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID
问题
版本记录
修订版本 1,2025 年 1 月 17 日(Kenny Vercaemer)
- 初始扩展程序说明