XR_ANDROID_avatar_eyes OpenXR 扩展

名称字符串

XR_ANDROID_avatar_eyes

扩展程序类型

实例扩展

已注册的扩展号码

457

修订版本

1

扩展程序和版本依赖项

OpenXR 1.0

上次修改日期

2024-09-30

IP 状态

没有已知的 IP 版权主张。

创作贡献者

Spencer Quin,Google

Jared Finder,Google

Levana Chen,Google

概览

借助此扩展程序,应用可以获取用户眼睛的位置和方向,以及眼动追踪状态。

此扩展程序旨在让头像的眼睛姿势和状态更逼真。为此,请执行以下操作:

  • 它允许非跟踪状态,例如闪烁。
  • 它支持单目或双目跟踪。

此扩展程序不应用于其他眼动追踪用途。对于互动,使用 XR_EXT_eye_gaze_interaction

眼动跟踪器

眼动追踪器是一种感知设备,可跟踪眼睛并准确绘制用户正在注视的位置。此扩展程序的主要用途是将用户注视点映射到虚拟场景中的头像。

眼动追踪数据可能属于敏感个人信息,与个人隐私和完整性密切相关。强烈建议存储或传输眼动追踪数据的应用始终征求用户的积极且明确的同意。

  • 在应用被允许访问眼动追踪器之前,如果应用尝试创建活动眼动追踪器,则会收到 XR_ERROR_PERMISSION_INSUFFICIENT

检查系统功能

应用在调用 xrGetSystemProperties 时,可以通过将 XrSystemAvatarEyesPropertiesANDROID 结构链接到 XrSystemProperties 来检查系统是否支持头像眼睛。如果 supportsAvatarEyes 返回 XR_FALSE,则应用将从 xrCreateEyeTrackerANDROID 收到 XR_ERROR_FEATURE_UNSUPPORTED

typedef struct XrSystemAvatarEyesPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsAvatarEyes;
} XrSystemAvatarEyesPropertiesANDROID;

成员说明

  • type 是此结构的 XrStructureType
  • nextNULL 或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展中未定义任何此类结构。
  • supportsAvatarEyes 是一个 XrBool32,用于指示当前系统是否支持头像眼睛。

有效用法(隐式)

创建眼动追踪器句柄

XR_DEFINE_HANDLE(XrEyeTrackerANDROID)

XrEyeTrackerANDROID 句柄表示用于跟踪眼睛并准确映射用户正在注视的内容的眼动追踪器。

可以使用此扩展程序中的其他函数通过此句柄访问眼动追踪数据。

眼动跟踪可在场景中提供眼部姿势和状态表示。

xrCreateEyeTrackerANDROID 函数的定义如下:

XrResult xrCreateEyeTrackerANDROID(
    XrSession                                   session,
    const XrEyeTrackerCreateInfoANDROID*        createInfo,
    XrEyeTrackerANDROID*                        eyeTracker);

参数说明

应用可以使用 xrCreateEyeTrackerANDROID 函数创建 XrEyeTrackerANDROID 句柄。

如果系统不支持眼动追踪,则 xrCreateEyeTrackerANDROID 将返回 XR_ERROR_FEATURE_UNSUPPORTED

有效用法(隐式)

返回代码

成功

  • 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

XrEyeTrackerCreateInfoANDROID 结构的定义如下:

typedef struct XrEyeTrackerCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrEyeTrackerCreateInfoANDROID;

成员说明

  • type 是此结构的 XrStructureType
  • nextNULL 或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展中未定义任何此类结构。

XrEyeTrackerCreateInfoANDROID 结构描述了用于创建 XrEyeTrackerANDROID 句柄的信息。

有效用法(隐式)

xrDestroyEyeTrackerANDROID 函数的定义如下:

XrResult xrDestroyEyeTrackerANDROID(
    XrEyeTrackerANDROID                         eyeTracker);

参数说明

xrDestroyEyeTrackerANDROID 函数会在完成眼动追踪体验后释放 eyeTracker 和底层资源。

有效用法(隐式)

线程安全

  • eyeTracker 和任何子句柄的访问必须在外部进行同步

返回代码

成功

  • XR_SUCCESS

失败

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

获取眼睛信息

xrGetEyesInfoANDROID 函数的定义如下:

XrResult xrGetEyesInfoANDROID(
    XrEyeTrackerANDROID                         eyeTracker,
    const XrEyesGetInfoANDROID*                 getInfo,
    XrEyesANDROID*                              infoOutput);

参数说明

xrGetEyesInfoANDROID 函数用于获取眼睛状态和姿势的信息。

系统会使用 XrEyesGetInfoANDROID::time、XrEyesGetInfoANDROID::baseSpace 解析眼睛信息,并将其相对于调用 xrGetEyesInfoANDROID 时的基准空间。

在任何时间点,系统都会跟踪或不跟踪眼睛姿势的位置和方向。这意味着,应用可以预期在提供的 XrEyesANDROID::eyes 上同时设置或清除 XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT,并且 XrEyesANDROID::mode 将指示跟踪状态。

有效用法(隐式)

返回代码

成功

  • 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

XrEyesGetInfoANDROID 结构包含检索眼睛姿势和状态所需的信息。

typedef struct XrEyesGetInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrTime             time;
    XrSpace            baseSpace;
} XrEyesGetInfoANDROID;

成员说明

  • type 是此结构的 XrStructureType
  • nextNULL 或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展中未定义任何此类结构。
  • time 是用于评估相对于 baseSpace 的坐标的 XrTime
  • baseSpace 眼睛姿势将相对于 time 时刻的此 XrSpace

有效用法(隐式)

XrEyesANDROID 结构包含有关被跟踪的眼睛的信息。

typedef struct XrEyesANDROID {
    XrStructureType             type;
    void*                       next;
    XrEyeANDROID                eyes[XR_EYE_MAX_ANDROID];
    XrEyeTrackingModeANDROID    mode;
} XrEyesANDROID;

成员说明

  • type 是此结构的 XrStructureType
  • nextNULL 或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展中未定义任何此类结构。
  • eyes 是左眼和右眼的 XrEyeANDROID 数组,以 XrEyeIndexANDROID 为索引。
  • modeXrEyeTrackingModeANDROID,用于指示眼睛是否正在跟踪,以及跟踪的是哪些眼睛。

有效用法(隐式)

XrEyeANDROID 结构描述眼睛的状态、位置和方向。

typedef struct XrEyeANDROID {
    XrEyeStateANDROID    eyeState;
    XrPosef              eyePose;
} XrEyeANDROID;

成员说明

  • eyeState 是眼睛的 XrEyeStateANDROID
  • pose 是一个 XrPosef,用于定义眼睛原点在相应 XrEyesGetInfoANDROID::baseSpace 的参考框架中的坐标和朝向。此处的身份取向表示坐标轴,其中 +Z 指向用户的眼睛,+X 指向右侧,+Y 指向上方。

有效用法(隐式)

XrEyeStateANDROID 枚举用于标识被跟踪的眼睛的不同状态。

typedef enum XrEyeStateANDROID {
    XR_EYE_STATE_INVALID_ANDROID = 0,
    XR_EYE_STATE_GAZING_ANDROID = 1,
    XR_EYE_STATE_SHUT_ANDROID = 2
} 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
} 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
} 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, for example, 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_xrGetEyesInfoANDROID xrGetEyesInfoANDROID; // 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 eyesInfo{.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(xrGetEyesInfoANDROID(eyeTracker, &eyesGetInfo, &eyesInfo));

    // 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_ANDROID
  • XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_EYES_GET_INFO_ANDROID
  • XR_TYPE_SYSTEM_AVATAR_EYES_PROPERTIES_ANDROID

新枚举

新结构

新函数

问题

版本历史记录

  • 修订版 1,2024 年 9 月 4 日(Levana Chen)
    • 初始扩展程序说明