名称字符串
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。
检查系统能力
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。
有效用法(隐式)
- 使用
XrSystemEyeTrackingPropertiesANDROID之前必须启用XR_ANDROID_eye_tracking扩展 type必须是XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROIDnext必须是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。
有效用法(隐式)
- 在调用
xrCreateEyeTrackerANDROID之前必须启用XR_ANDROID_eye_tracking扩展 session必须是有效的XrSession句柄createInfo必须是指向有效XrEyeTrackerCreateInfoANDROID结构体的指针eyeTracker必须是指向XrEyeTrackerANDROID句柄的指针
返回码
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_FEATURE_UNSUPPORTED
XrEyeTrackerCreateInfoANDROID 结构体定义如下:
typedef struct XrEyeTrackerCreateInfoANDROID {
XrStructureType type;
void* next;
} XrEyeTrackerCreateInfoANDROID;
成员说明
type是此结构体的XrStructureType。next是NULL或指向结构体链中下一个结构体的指针。核心 OpenXR 或此扩展中未定义此类结构体。
XrEyeTrackerCreateInfoANDROID 结构体描述了创建 XrEyeTrackerANDROID 句柄所需的信息。
有效用法(隐式)
- 使用
XrEyeTrackerCreateInfoANDROID之前必须启用XR_ANDROID_eye_tracking扩展 type必须是XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROIDnext必须是NULL或指向结构体链中下一个结构体的有效指针
xrDestroyEyeTrackerANDROID 函数定义如下:
XrResult xrDestroyEyeTrackerANDROID(
XrEyeTrackerANDROID eyeTracker);
参数说明
eyeTracker是先前由xrCreateEyeTrackerANDROID创建的XrEyeTrackerANDROID。
xrDestroyEyeTrackerANDROID 函数在眼动追踪体验结束后释放 eyeTracker 和底层资源。
有效用法(隐式)
- 在调用
xrDestroyEyeTrackerANDROID之前必须启用XR_ANDROID_eye_tracking扩展 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的指针,用于指定所需的输出。infoOutput是指向XrEyesANDROID的指针,包含返回的眼睛信息,包括姿态和状态。
xrGetCoarseTrackingEyesInfoANDROID 函数以保护用户隐私的方式获取眼睛状态和姿态信息。
如果应用程序没有 android.permission.EYE_TRACKING_COARSE 权限,运行时必须返回 XR_ERROR_PERMISSION_INSUFFICIENT。
眼睛信息是相对于调用 xrGetCoarseTrackingEyesInfoANDROID 时使用 XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace 的基础空间解析和相对的。
在任何时间点,眼睛姿态的位置和方向都处于追踪或未追踪状态。这意味着应用程序可以预期 XR_SPACE_LOCATION_POSITION_TRACKED_BIT 和 XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT 将在提供的 XrEyesANDROID::eyes 上同时设置或清除,并且 XrEyesANDROID::mode 将指示追踪状态。
有效用法(隐式)
- 在调用
xrGetCoarseTrackingEyesInfoANDROID之前必须启用XR_ANDROID_eye_tracking扩展 eyeTracker必须是有效的XrEyeTrackerANDROID句柄getInfo必须是指向有效XrEyesGetInfoANDROID结构体的指针eyesOutput必须是指向XrEyesANDROID结构体的指针
返回码
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_INVALIDXR_ERROR_PERMISSION_INSUFFICIENT
xrGetFineTrackingEyesInfoANDROID 函数定义如下:{:#xrGetFineTrackingEyesInfoANDROID} C++ XrResult xrGetFineTrackingEyesInfoANDROID( XrEyeTrackerANDROID eyeTracker, const XrEyesGetInfoANDROID* getInfo, XrEyesANDROID* eyesOutput);
参数说明
eyeTracker是先前由xrCreateEyeTrackerANDROID创建的XrEyeTrackerANDROID。getInfo是指向XrEyesGetInfoANDROID的指针,用于指定所需的输出。infoOutput是指向XrEyesANDROID的指针,其中包含返回的眼睛信息,包括姿态和状态。xrGetFineTrackingEyesInfoANDROID函数以比xrGetCoarseTrackingEyesInfoANDROID更高的精度获取眼睛状态和姿态信息。
如果应用程序没有 android.permission.EYE_TRACKING_FINE 权限,运行时必须返回 XR_ERROR_PERMISSION_INSUFFICIENT。
眼睛信息是相对于调用 xrGetFineTrackingEyesInfoANDROID 时使用 XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace 的基础空间解析和相对的。
在任何时间点,眼睛姿态的位置和方向都处于追踪或未追踪状态。这意味着应用程序可以预期 XR_SPACE_LOCATION_POSITION_TRACKED_BIT 和 XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT 将在提供的 XrEyesANDROID::eyes 上同时设置或清除,并且 XrEyesANDROID::mode 将指示追踪状态。
有效用法(隐式)
- 在调用
xrGetFineTrackingEyesInfoANDROID之前必须启用XR_ANDROID_eye_tracking扩展 eyeTracker必须是有效的XrEyeTrackerANDROID句柄getInfo必须是指向有效XrEyesGetInfoANDROID结构体的指针eyesOutput必须是指向XrEyesANDROID结构体的指针
返回码
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_INVALIDXR_ERROR_PERMISSION_INSUFFICIENT
XrEyesGetInfoANDROID 结构体包含检索眼睛姿态和状态所需的信息。
typedef struct XrEyesGetInfoANDROID {
XrStructureType type;
void* next;
XrTime time;
XrSpace baseSpace;
} XrEyesGetInfoANDROID;
成员说明
type是此结构体的XrStructureType。next是NULL或指向结构体链中下一个结构体的指针。核心 OpenXR 或此扩展中未定义此类结构体。time是XrTime,用于评估相对于baseSpace的坐标。baseSpace眼睛姿态将相对于此XrSpace在time时。
有效用法(隐式)
- 使用
XrEyesGetInfoANDROID之前必须启用XR_ANDROID_eye_tracking扩展 type必须是XR_TYPE_EYES_GET_INFO_ANDROIDnext必须是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数组,用于左眼和右眼,按XrEyeIndexANDROID索引。mode是XrEyeTrackingModeANDROID,指示眼睛是否正在追踪以及追踪了哪只眼睛。
有效用法(隐式)
- 使用
XrEyesANDROID之前必须启用XR_ANDROID_eye_tracking扩展 type必须是XR_TYPE_EYES_ANDROIDnext必须是NULL或指向结构体链中下一个结构体的有效指针eyes的任何给定元素必须是有效的XrEyeANDROID结构体mode必须是有效的XrEyeTrackingModeANDROID值
XrEyeANDROID 结构体描述了眼睛的状态、位置和方向。
typedef struct XrEyeANDROID {
XrEyeStateANDROID eyeState;
XrPosef eyePose;
} XrEyeANDROID;
成员说明
eyeState是眼睛的XrEyeStateANDROID>。pose是一个XrPosef,定义了眼睛原点在对应XrEyesGetInfoANDROID::baseSpace参考系内的位置和方向。这里的单位方向表示一个坐标轴,其中 +Z 指向用户眼睛,+X 指向右侧,+Y 指向上方。
有效用法(隐式)
- 使用
XrEyeANDROID之前必须启用XR_ANDROID_eye_tracking扩展 eyeState必须是有效的XrEyeStateANDROID值
XrEyeStateANDROID 枚举标识了追踪眼睛的不同状态。
typedef enum XrEyeStateANDROID {
XR_EYE_STATE_INVALID_ANDROID = 0,
XR_EYE_STATE_GAZING_ANDROID = 1,
XR_EYE_STATE_SHUT_ANDROID = 2
} XrEyeStateANDROID;
这些枚举具有以下含义:
枚举 |
描述 |
|
表示眼睛处于错误状态或不存在。 |
|
表示眼睛正在注视。 |
|
表示眼睛因眨眼或闭眼而闭合。 |
XrEyeIndexANDROID 枚举标识了左眼或右眼的索引。
typedef enum XrEyeIndexANDROID {
XR_EYE_INDEX_LEFT_ANDROID = 0,
XR_EYE_INDEX_RIGHT_ANDROID = 1
} XrEyeIndexANDROID;
这些枚举具有以下含义:
枚举 |
描述 |
|
左眼。 |
|
右眼。 |
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
} XrEyeTrackingModeANDROID;
这些枚举具有以下含义:
枚举 |
描述 |
|
表示眼动追踪不活跃。 |
|
表示仅右眼正在追踪。 |
|
表示仅左眼正在追踪。 |
|
表示左眼和右眼都在追踪。 |
眼动追踪示例代码
以下示例代码演示了如何获取相对于视图空间的眼睛信息。
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));
新对象类型
新枚举常量
XR_EYE_MAX_ANDROID
XrObjectType 枚举已扩展为
XR_OBJECT_TYPE_EYE_TRACKER_ANDROID
XrStructureType 枚举已扩展为
XR_TYPE_EYES_ANDROIDXR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_EYES_GET_INFO_ANDROIDXR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID
新枚举
新结构体
XrEyeANDROIDXrEyesANDROIDXrEyesGetInfoANDROIDXrEyeTrackerCreateInfoANDROIDXrSystemEyeTrackingPropertiesANDROID
新函数
xrCreateEyeTrackerANDROIDxrDestroyEyeTrackerANDROIDxrGetCoarseTrackingEyesInfoANDROIDxrGetFineTrackingEyesInfoANDROID
问题
版本历史
- 修订版 1,2025-01-17 (Kenny Vercaemer)
- 初始扩展描述
OpenXR™ 和 OpenXR 徽标是 The Khronos Group Inc. 拥有的商标,并在中国、欧盟、日本和英国注册为商标。