XR_ANDROID_eye_tracking

سلسلة الاسم

XR_ANDROID_eye_tracking

نوع الإضافة

إضافة مثيل

رقم الإضافة المسجَّل

457

المراجعة

1

حالة التصديق

لم تتم المصادقة

الاعتماديات على الإضافات والإصدارات

OpenXR 1.0

تاريخ آخر تعديل

2025-01-17

حالة عنوان 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 في ملف البيان الخاص بها. وتُعدّ هذه الأذونات أذونات خطيرة. يجب أن يطلب التطبيق الإذن أثناء التشغيل لاستخدام الوظائف التالية:

(مستوى الحماية: خطير)

فحص إمكانات النظام

يتم تعريف بنية XrSystemEyeTrackingPropertiesANDROID على النحو التالي:

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

أوصاف الأعضاء

  • type هو XrStructureType لهذه البنية.
  • next هي NULL أو مؤشر إلى البنية التالية في سلسلة البنية. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.
  • supportsEyeTracking هو XrBool32 يشير إلى ما إذا كان النظام الحالي يتيح تتبّع العين.

يمكن لأحد التطبيقات التحقّق مما إذا كان النظام يتيح تتبُّع العين من خلال توسيع XrSystemProperties باستخدام بنية XrSystemEyeTrackingPropertiesANDROID عند استدعاء xrGetSystemProperties .

إذا كان وقت التشغيل يعرض XR_FALSE لـ supportsEyeTracking، يجب أن يعرض وقت التشغيل XR_ERROR_FEATURE_UNSUPPORTED من xrCreateEyeTrackerANDROID .

الاستخدام الصحيح (الضمني)

إنشاء معرّف لجهاز تتبُّع حركة العين

XR_DEFINE_HANDLE(XrEyeTrackerANDROID)

يمثّل معرّف XrEyeTrackerANDROID جهاز تتبُّع العين لتتبُّع حركة العينين وتحديد موضع نظر المستخدم بدقة.

بيانات تتبّع العين هي معلومات شخصية حساسة ومرتبطة ارتباطًا وثيقًا بالخصوصية الشخصية وسلامة البيانات. ننصح بشدة بأن تطلب التطبيقات التي تخزّن بيانات تتبُّع حركة العين أو تنقلها من المستخدم دائمًا الموافقة النشطة والمحدّدة على إجراء ذلك.

يستخدم التطبيق هذا المعرّف للوصول إلى بيانات تتبُّع العين باستخدام دوال أخرى في هذا الامتداد.

توفّر ميزة "تتبُّع العين" تمثيلاً لوضع العين وحالتها في المشهد.

يتم تعريف الدالة xrCreateEyeTrackerANDROID على النحو التالي:

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

أوصاف المَعلمات

  • session هو معرّف XrSession سيتم فيه تفعيل ميزة تتبّع العين.
  • createInfo هو XrEyeTrackerCreateInfoANDROID المستخدَم لتحديد إعدادات تتبُّع العين.
  • eyeTracker هو مقبض XrEyeTrackerANDROID الذي تم عرضه.

ينشئ التطبيق معرّف XrEyeTrackerANDROID باستخدام الدالة xrCreateEyeTrackerANDROID.

إذا كان النظام لا يتيح تتبّع العين، يجب أن تعرض بيئة التشغيل القيمة XR_ERROR_FEATURE_UNSUPPORTED من xrCreateEyeTrackerANDROID .

الاستخدام الصحيح (الضمني)

رموز الإرجاع

تم بنجاح

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذُّر

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

يتم تعريف بنية XrEyeTrackerCreateInfoANDROID على النحو التالي:

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

أوصاف الأعضاء

  • type هو XrStructureType لهذه البنية.
  • next هي NULL أو مؤشر إلى البنية التالية في سلسلة البنية. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.

يصف بنية XrEyeTrackerCreateInfoANDROID المعلومات اللازمة لإنشاء معرّف XrEyeTrackerANDROID.

الاستخدام الصحيح (الضمني)

يتم تعريف الدالة xrDestroyEyeTrackerANDROID على النحو التالي:

XrResult xrDestroyEyeTrackerANDROID(
    XrEyeTrackerANDROID                         eyeTracker);

أوصاف المَعلمات

تؤدي الدالة xrDestroyEyeTrackerANDROID إلى تحرير eyeTracker والموارد الأساسية عند الانتهاء من تجارب تتبُّع العين.

الاستخدام الصحيح (الضمني)

أمان سلاسل المحادثات

  • يجب مزامنة حساب eyeTracker وأي أسماء مستخدمين للأطفال بشكل خارجي

رموز الإرجاع

تم بنجاح

  • XR_SUCCESS

تعذُّر

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

الحصول على معلومات عن العينَين

يتم تعريف الدالة xrGetCoarseTrackingEyesInfoANDROID على النحو التالي:

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

أوصاف المَعلمات

  • eyeTracker هو XrEyeTrackerANDROID تم إنشاؤه سابقًا بواسطة xrCreateEyeTrackerANDROID .
  • getInfo هو مؤشر إلى XrEyesGetInfoANDROID يُستخدَم لتقديم معلومات عن طلب وضعيات العين وحالاتها.
  • eyesOutput هو مؤشر إلى XrEyesANDROID الذي يحتوي على معلومات العينَين التي تم إرجاعها، بما في ذلك الوضعيات والحالات.

تحصل الدالة xrGetCoarseTrackingEyesInfoANDROID على معلومات حول حالات العينين ووضعيتهما بطريقة تحافظ على خصوصية المستخدم.

يجب أن تعرض بيئة التشغيل XR_ERROR_PERMISSION_INSUFFICIENT إذا لم يكن لدى التطبيق الإذن android.permission.EYE_TRACKING_COARSE.

يتم التعبير عن أوضاع العينين في XrEyesGetInfoANDROID :: baseSpace في XrEyesGetInfoANDROID :: time .

في أي وقت، يتم تتبُّع موضع العين واتجاهها أو عدم تتبُّعهما. وهذا يعني أنّه يجب أن يضبط وقت التشغيل كلاً من XR_SPACE_LOCATION_POSITION_TRACKED_BIT وXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT أو يمحوهما في XrEyesANDROID :: eyes المقدَّم، وأن يضبط XrEyesANDROID :: mode للإشارة إلى حالات التتبُّع.XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT

الاستخدام الصحيح (الضمني)

رموز الإرجاع

تم بنجاح

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذُّر

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_PERMISSION_INSUFFICIENT
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE

يتم تعريف الدالة xrGetFineTrackingEyesInfoANDROID على النحو التالي:

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

أوصاف المَعلمات

  • eyeTracker هو XrEyeTrackerANDROID تم إنشاؤه سابقًا بواسطة xrCreateEyeTrackerANDROID .
  • getInfo هو مؤشر إلى XrEyesGetInfoANDROID يُستخدَم لتحديد الناتج المطلوب.
  • eyesOutput هو مؤشر إلى XrEyesANDROID الذي يحتوي على معلومات العينَين التي تم إرجاعها، بما في ذلك الوضعيات والحالات.

تحصل الدالة xrGetFineTrackingEyesInfoANDROID على معلومات حول حالات العينين ووضعيتهما بدقة أعلى من الدالة xrGetCoarseTrackingEyesInfoANDROID .

يجب أن تعرض بيئة التشغيل القيمة XR_ERROR_PERMISSION_INSUFFICIENT إذا لم يكن لدى التطبيق الإذن android.permission.EYE_TRACKING_FINE.

يتم تحديد معلومات العينين بالنسبة إلى المساحة الأساسية في وقت استدعاء xrGetFineTrackingEyesInfoANDROID باستخدام XrEyesGetInfoANDROID :: time وXrEyesGetInfoANDROID :: baseSpace . يجب أن يحلّ وقت التشغيل الموقع الجغرافي المحدّد بواسطة XrEyesGetInfoANDROID :: baseSpace في وقت المكالمة.

في أي وقت، يتم تتبُّع موضع العين واتجاهها أو عدم تتبُّعهما. وهذا يعني أنّ وقت التشغيل يجب أن يضبط كلاً من XR_SPACE_LOCATION_POSITION_TRACKED_BIT وXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT أو يمحوهما في XrEyesANDROID :: eyes المقدَّم، وأن يضبط XrEyesANDROID :: mode للإشارة إلى حالات التتبُّع.XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT

الاستخدام الصحيح (الضمني)

رموز الإرجاع

تم بنجاح

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذُّر

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_PERMISSION_INSUFFICIENT
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE

يحتوي البنية XrEyesGetInfoANDROID على المعلومات المطلوبة لاسترداد أوضاع العين وحالاتها.

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

أوصاف الأعضاء

  • type هو XrStructureType لهذه البنية.
  • next هي NULL أو مؤشر إلى البنية التالية في سلسلة البنية. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.
  • time هي XrTime التي يتم عندها تقييم الإحداثيات بالنسبة إلى baseSpace .
  • 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 الذي يشير إلى العين التي يتم تتبّعها حاليًا.

الاستخدام الصحيح (الضمني)

يصف بنية 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

تشير هذه الحالة إلى أنّ كلتا العينين اليسرى واليمنى يتم تتبُّعهما.

#define XR_EYE_MAX_ANDROID                2

XR_EYE_MAX_ANDROID هو الحدّ الأقصى لعدد العيون التي يتم إعداد تقارير عن بيانات XrEyeANDROID لها.

مثال على الرمز البرمجي لتتبّع العين

يوضّح نموذج الرمز البرمجي التالي كيفية الحصول على معلومات العينين بالنسبة إلى مساحة العرض.

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_ANDROID_EYE_TRACKING_EXTENSION_NAME
  • XR_ANDROID_eye_tracking_SPEC_VERSION
  • XR_EYE_MAX_ANDROID
  • تمديد XrObjectType :

    • XR_OBJECT_TYPE_EYE_TRACKER_ANDROID
  • تمديد XrStructureType :

    • XR_TYPE_EYES_ANDROID
    • XR_TYPE_EYES_GET_INFO_ANDROID
    • XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
    • XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID

المشاكل

سجلّ الإصدارات

  • المراجعة 1، 17-01-2025 (كيني فيركامير)

    • الوصف الأوّلي للإضافة