XR_ANDROID_eye_tracking

Name String

XR_ANDROID_eye_tracking

拡張機能の種類

インスタンス拡張

登録済みの内線番号

457

リビジョン

1

承認ステータス

未批准

拡張機能とバージョンの依存関係

OpenXR 1.0

最終更新日

2025-01-17

IP ステータス

既知の IP 申し立てはありません。

寄与者

Spencer Quin、Google
Jared Finder、Google
Levana Chen、Google
Kenny Vercaemer、Google
Prasanthi Gurumurthy、Google
Nihav Jain、Google

概要

この拡張機能により、アプリはユーザーの目の位置と向き、アイ トラッキングのステータスを取得できます。

アイ トラッキング データは、粗いモードと細かいモードの 2 つのモードで提供されます。粗いトラッキングではユーザーの目の位置を大まかに推定し、細かいトラッキングではより正確に推定します。粗いトラッキングは、基本的なアバターのような表現を提供するアプリケーション向けであり、細かいトラッキングは、より正確なアプリケーション向けです。

インタラクションには XR_EXT_eye_gaze_interaction を使用すべきです。

権限

Android アプリは、マニフェストに android.permission.EYE_TRACKING_COARSE 権限または android.permission.EYE_TRACKING_FINE 権限を記載する必要があります。これらの権限は危険な権限と見なされます。アプリは、これらの関数を使用するために、実行時に権限をリクエストしなければなりません。

(保護レベル: dangerous)

システム機能を検査する

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_DEFINE_HANDLE(XrEyeTrackerANDROID)

XrEyeTrackerANDROID ハンドルは、目をトラッキングするアイ トラッカーを表し、ユーザーが見ている場所を正確にマッピングします。

アイ トラッキング データは機密性の高い個人情報であり、個人のプライバシーと誠実性に密接に関連しています。アイトラッキング データを保存または転送するアプリでは、常にユーザーに明示的な同意を求めることを強くおすすめします。

アプリケーションは、このハンドルを使用して、この拡張機能の他の関数を使用してアイ トラッキング データにアクセスします。

アイ トラッキングは、シーン内の目のポーズとステータスを表現します。

xrCreateEyeTrackerANDROID 関数は次のように定義されます。

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

パラメータの説明

アプリは、xrCreateEyeTrackerANDROID 関数を使用して XrEyeTrackerANDROID ハンドルを作成します。

システムがアイ トラッキングをサポートしていない場合、ランタイムは xrCreateEyeTrackerANDROID から XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。

有効な使用方法(暗黙的)

  • XR_ANDROID_eye_tracking 拡張機能は、xrCreateEyeTrackerANDROID を呼び出す前に有効にする必要があります。
  • session は、有効な XrSession ハンドルでなければなりません。
  • createInfo は、有効な XrEyeTrackerCreateInfoANDROID 構造体へのポインタでなければなりません
  • eyeTracker は XrEyeTrackerANDROID ハンドルへのポインタでなければなりません

戻りコード

成功

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

パラメータの説明

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

パラメータの説明

xrGetFineTrackingEyesInfoANDROID 関数は、xrGetCoarseTrackingEyesInfoANDROID よりも高い精度で目の状態とポーズに関する情報を取得します。

アプリに android.permission.EYE_TRACKING_FINE 権限がない場合、ランタイムは XR_ERROR_PERMISSION_INSUFFICIENT を返さなければなりません。

目の情報は、XrEyesGetInfoANDROID :: time、XrEyesGetInfoANDROID :: baseSpace を使用して xrGetFineTrackingEyesInfoANDROID を呼び出した時点のベーススペースを基準として解決されます。ランタイムは、呼び出し時に 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 を設定してトラッキング状態を示す必要があります。

有効な使用方法(暗黙的)

  • xrGetFineTrackingEyesInfoANDROID を呼び出す前に、XR_ANDROID_eye_tracking 拡張機能を有効にする必要があります。
  • eyeTracker は、有効な XrEyeTrackerANDROID ハンドルでなければなりません。
  • getInfo は、有効な XrEyesGetInfoANDROID 構造体へのポインタでなければなりません
  • eyesOutput は XrEyesANDROID 構造体へのポインタでなければなりません

戻りコード

成功

  • 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 は、baseSpace を基準として座標を評価する XrTime です。
  • baseSpace は、目のポーズを返す XrSpace です。

有効な使用方法(暗黙的)

  • XrEyesGetInfoANDROID を使用する前に、XR_ANDROID_eye_tracking 拡張機能を有効にする必要があります。
  • 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 は、XrEyeIndexANDROID でインデックス付けされた左右の目の XrEyeANDROID の配列(サイズ XR_EYE_MAX_ANDROID)です。
  • mode は、現在トラッキングされている目を表す XrEyeTrackingModeANDROID です。

有効な使用方法(暗黙的)

  • XrEyesANDROID を使用する前に、XR_ANDROID_eye_tracking 拡張機能を有効にする必要があります。
  • type は XR_TYPE_EYES_ANDROID にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • eyes のすべての要素は、有効な XrEyeANDROID 構造体でなければなりません。
  • mode は、有効な XrEyeTrackingModeANDROID 値でなければなりません。

XrEyeANDROID 構造体は、目の状態、位置、向きを記述します。

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

メンバーの説明

  • eyeState は、目の XrEyeStateANDROID です。
  • eyePose は、対応する XrEyesGetInfoANDROID :: baseSpace の基準フレーム内での瞳孔の位置と向きを定義する XrPosef です。ここでのアイデンティティの向きは、+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,
    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、2025-01-17(Kenny Vercaemer)

    • 拡張機能の初期説明