Tiện ích OpenXR XR_ANDROID_eye_tracking

Chuỗi tên

XR_ANDROID_eye_tracking

Loại phần mở rộng

Tiện ích thực thể

Số điện thoại mở rộng đã đăng ký

457

Bản sửa đổi

1

Phần mở rộng và phần phụ thuộc phiên bản

OpenXR 1.0

Ngày sửa đổi gần đây nhất

2025-01-17

Trạng thái IP

Không có thông báo xác nhận quyền sở hữu đối với tài sản trí tuệ nào.

Cộng tác viên

Spencer Quin, Google

Jared Finder, Google

Levana Chen, Google

Kenny Vercaemer, Google

Prasanthi Gurumurthy, Google

Nihav Jain, Google

Tổng quan

Tiện ích này cho phép các ứng dụng lấy vị trí và hướng của mắt người dùng, cũng như trạng thái theo dõi mắt.

Dữ liệu theo dõi mắt được cung cấp ở hai chế độ: thô và tinh. Tính năng theo dõi thô cung cấp thông tin ước tính thô về mắt của người dùng, trong khi tính năng theo dõi tinh cung cấp thông tin ước tính chính xác hơn. Tính năng theo dõi thô dành cho các ứng dụng muốn cung cấp hình đại diện cơ bản, còn tính năng theo dõi tinh dành cho các ứng dụng chính xác hơn.

Để tương tác, bạn nên sử dụng XR_EXT_eye_gaze_interaction.

Kiểm tra chức năng của hệ thống

Cấu trúc XrSystemEyeTrackingPropertiesANDROID được xác định là:

typedef struct XrSystemEyeTrackingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsEyeTracking;
} XrSystemEyeTrackingPropertiesANDROID;

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.
  • supportsEyeTrackingXrBool32, cho biết liệu hệ thống hiện tại có hỗ trợ tính năng theo dõi mắt hay không.

Ứng dụng có thể kiểm tra xem hệ thống có thể theo dõi chuyển động mắt hay không bằng cách tạo chuỗi cấu trúc XrSystemEyeTrackingPropertiesANDROID với XrSystemProperties khi gọi xrGetSystemProperties. Nếu supportsEyeTracking trả về XR_FALSE, thì ứng dụng sẽ nhận được XR_ERROR_FEATURE_UNSUPPORTED từ xrCreateEyeTrackerANDROID.

Cách sử dụng hợp lệ (ngầm ẩn)

Tạo tên người dùng cho thiết bị theo dõi mắt

XR_DEFINE_HANDLE(XrEyeTrackerANDROID)

Tên XrEyeTrackerANDROID đại diện cho một thiết bị theo dõi mắt để theo dõi mắt và ánh xạ chính xác nội dung mà người dùng đang nhìn.

Dữ liệu theo dõi mắt có thể là thông tin cá nhân nhạy cảm và liên quan chặt chẽ đến quyền riêng tư và tính toàn vẹn cá nhân. Các ứng dụng lưu trữ hoặc chuyển dữ liệu theo dõi mắt nên luôn yêu cầu người dùng chấp nhận một cách chủ động và cụ thể để thực hiện việc này.

Bạn có thể sử dụng tay điều khiển này để truy cập dữ liệu theo dõi mắt bằng các hàm khác trong tiện ích này.

Tính năng theo dõi mắt cung cấp thông tin về tư thế và trạng thái của mắt trong cảnh.

Hàm xrCreateEyeTrackerANDROID được xác định như sau:

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

Nội dung mô tả tham số

Ứng dụng có thể tạo một tay điều khiển XrEyeTrackerANDROID bằng cách sử dụng hàm xrCreateEyeTrackerANDROID.

Nếu hệ thống không hỗ trợ tính năng theo dõi chuyển động mắt, thì XR_ERROR_FEATURE_UNSUPPORTED sẽ được trả về từ xrCreateEyeTrackerANDROID.

Cách sử dụng hợp lệ (ngầm ẩn)

Mã trả về

Thành công

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Không thành công

  • 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_FEATURE_UNSUPPORTED

Cấu trúc XrEyeTrackerCreateInfoANDROID được xác định là:

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

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.

Cấu trúc XrEyeTrackerCreateInfoANDROID mô tả thông tin để tạo một tay điều khiển XrEyeTrackerANDROID.

Cách sử dụng hợp lệ (ngầm ẩn)

Hàm xrDestroyEyeTrackerANDROID được xác định là:

XrResult xrDestroyEyeTrackerANDROID(
    XrEyeTrackerANDROID                         eyeTracker);

Nội dung mô tả tham số

Hàm xrDestroyEyeTrackerANDROID sẽ giải phóng eyeTracker và các tài nguyên cơ bản khi hoàn tất trải nghiệm theo dõi mắt.

Cách sử dụng hợp lệ (ngầm ẩn)

Độ an toàn cho luồng

  • Quyền truy cập vào eyeTracker và mọi tay điều khiển con phải được đồng bộ hoá bên ngoài

Mã trả về

Thành công

  • XR_SUCCESS

Không thành công

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

Nhận thông tin về mắt

Hàm xrGetCoarseTrackingEyesInfoANDROID được xác định là:

XrResult xrGetCoarseTrackingEyesInfoANDROID(
    XrEyeTrackerANDROID                         eyeTracker,
    const XrEyesGetInfoANDROID*                 getInfo,
    XrEyesANDROID*                              eyesOutput);

Nội dung mô tả tham số

Hàm xrGetCoarseTrackingEyesInfoANDROID lấy thông tin về trạng thái mắt và tư thế theo cách bảo vệ quyền riêng tư của người dùng.

Môi trường thời gian chạy phải trả về XR_ERROR_PERMISSION_INSUFFICIENT nếu ứng dụng không có quyền android.permission.EYE_TRACKING_COARSE.

Thông tin về mắt được phân giải và tương ứng với không gian cơ sở tại thời điểm gọi xrGetCoarseTrackingEyesInfoANDROID bằng cách sử dụng XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace.

Tại bất kỳ thời điểm nào, cả vị trí và hướng của tư thế mắt đều được theo dõi hoặc không được theo dõi. Điều này có nghĩa là các ứng dụng có thể dự kiến rằng cả XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT sẽ được đặt hoặc xoá trên XrEyesANDROID::eyes được cung cấp và XrEyesANDROID::mode sẽ cho biết trạng thái theo dõi.

Cách sử dụng hợp lệ (ngầm ẩn)

Mã trả về

Thành công

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Không thành công

  • 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
  • XR_ERROR_PERMISSION_INSUFFICIENT

Hàm xrGetFineTrackingEyesInfoANDROID được xác định là: {:#xrGetFineTrackingEyesInfoANDROID} C++ XrResult xrGetFineTrackingEyesInfoANDROID( XrEyeTrackerANDROID eyeTracker, const XrEyesGetInfoANDROID* getInfo, XrEyesANDROID* eyesOutput);

Nội dung mô tả tham số

Môi trường thời gian chạy phải trả về XR_ERROR_PERMISSION_INSUFFICIENT nếu ứng dụng không có quyền android.permission.EYE_TRACKING_FINE.

Thông tin về mắt được phân giải và tương ứng với không gian cơ sở tại thời điểm gọi xrGetFineTrackingEyesInfoANDROID bằng cách sử dụng XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace.

Tại bất kỳ thời điểm nào, cả vị trí và hướng của tư thế mắt đều được theo dõi hoặc không được theo dõi. Điều này có nghĩa là các ứng dụng có thể dự kiến rằng cả XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT sẽ được đặt hoặc xoá trên XrEyesANDROID::eyes được cung cấp và XrEyesANDROID::mode sẽ cho biết trạng thái theo dõi.

Cách sử dụng hợp lệ (ngầm ẩn)

Mã trả về

Thành công

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Không thành công

  • 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
  • XR_ERROR_PERMISSION_INSUFFICIENT

Cấu trúc XrEyesGetInfoANDROID chứa thông tin cần thiết để truy xuất các tư thế và trạng thái của mắt.

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

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.
  • timeXrTime tại đó để đánh giá toạ độ tương ứng với baseSpace.
  • baseSpace tư thế mắt sẽ tương ứng với XrSpace này tại time.

Cách sử dụng hợp lệ (ngầm ẩn)

Cấu trúc XrEyesANDROID chứa thông tin về mắt được theo dõi.

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

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.
  • eyes là một mảng XrEyeANDROID cho mắt trái và phải được lập chỉ mục bằng XrEyeIndexANDROID.
  • modeXrEyeTrackingModeANDROID để cho biết liệu mắt có đang theo dõi hay không và theo dõi mắt nào.

Cách sử dụng hợp lệ (ngầm ẩn)

Cấu trúc XrEyeANDROID mô tả trạng thái, vị trí và hướng của mắt.

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

Nội dung mô tả thành viên

  • eyeStateXrEyeStateANDROID của mắt.
  • pose là một XrPosef xác định vị trí và hướng của gốc mắt trong khung tham chiếu của XrEyesGetInfoANDROID::baseSpace tương ứng. Hướng nhận dạng ở đây đại diện cho trục toạ độ với +Z vào mắt người dùng, +X sang phải và +Y lên trên.

Cách sử dụng hợp lệ (ngầm ẩn)

  • Bạn phải bật tiện ích XR_ANDROID_eye_tracking trước khi sử dụng XrEyeANDROID
  • eyeState phải là một giá trị XrEyeStateANDROID hợp lệ

Biến đếm XrEyeStateANDROID xác định các trạng thái khác nhau của mắt được theo dõi.

typedef enum XrEyeStateANDROID {
    XR_EYE_STATE_INVALID_ANDROID = 0,
    XR_EYE_STATE_GAZING_ANDROID = 1,
    XR_EYE_STATE_SHUT_ANDROID = 2
} XrEyeStateANDROID;

Các enum có ý nghĩa như sau:

Enum

Nội dung mô tả

XR_EYE_STATE_INVALID_ANDROID

Cho biết rằng mắt đang ở trạng thái lỗi hoặc không có.

XR_EYE_STATE_GAZING_ANDROID

Cho biết mắt đang nhìn chăm chú.

XR_EYE_STATE_SHUT_ANDROID

Cho biết mắt đang nhắm do nháy mắt hoặc chớp mắt.

Biến đếm XrEyeIndexANDROID xác định chỉ mục của mắt trái hoặc mắt phải.

typedef enum XrEyeIndexANDROID {
    XR_EYE_INDEX_LEFT_ANDROID = 0,
    XR_EYE_INDEX_RIGHT_ANDROID = 1
} XrEyeIndexANDROID;

Các enum có ý nghĩa như sau:

Enum

Nội dung mô tả

XR_EYE_INDEX_LEFT_ANDROID

Mắt trái.

XR_EYE_INDEX_RIGHT_ANDROID

Mắt phải.

Biến đếm XrEyeTrackingModeANDROID xác định các chế độ theo dõi mắt.

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;

Các enum có ý nghĩa như sau:

Enum

Nội dung mô tả

XR_EYE_TRACKING_MODE_NOT_TRACKING_ANDROID

Cho biết tính năng theo dõi chuyển động mắt không hoạt động.

XR_EYE_TRACKING_MODE_RIGHT_ANDROID

Cho biết chỉ mắt phải đang theo dõi.

XR_EYE_TRACKING_MODE_LEFT_ANDROID

Cho biết chỉ mắt trái đang theo dõi.

XR_EYE_TRACKING_MODE_BOTH_ANDROID

Cho biết cả mắt trái và mắt phải đều đang theo dõi.

Mã ví dụ cho tính năng theo dõi chuyển động mắt

Mã ví dụ sau đây minh hoạ cách lấy thông tin về mắt tương ứng với không gian xem.

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));

Các loại đối tượng mới

Hằng số enum mới

  • XR_EYE_MAX_ANDROID

Bổ sung enum XrObjectType bằng:

  • XR_OBJECT_TYPE_EYE_TRACKER_ANDROID

Bổ sung enum XrStructureType bằng:

  • XR_TYPE_EYES_ANDROID
  • XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_EYES_GET_INFO_ANDROID
  • XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID

Enum mới

Cấu trúc mới

Hàm mới

Vấn đề

Nhật ký phiên bản

  • Bản sửa đổi 1, ngày 17 tháng 1 năm 2025 (Kenny Vercaemer)
    • Nội dung mô tả ban đầu của tiện ích