開発
開発
プラットフォームを選択

Movement SDK for OpenXRでのアイトラッキング

このトピックでは、以下について説明します。
  • Meta Quest Proのアイトラッキングの概要
  • ポリシー、
  • アイトラッキングOpenXR拡張機能の利用ガイド
  • 関連トピックへのリンク

アイトラッキングとは

Meta Quest Proのアイトラッキングが目の動きを検知することによって、Eye Gaze APIがユーザーの視線の動きに応じてユーザーのキャラクターの目の変化を制御できます。APIに用意されている抽象化された視線表現により、キャラクターが別のユーザーのキャラクターとアイコンタクトを取ることもでき、ソーシャルプレゼンスが格段に向上します。また、3D空間でどこを見ているかが分かるので、どの領域に興味があるのかを理解したり、ゲームのターゲット設定に使ったりすることもできます。

ポリシーと免責事項

アイトラッキングAPIを使用するには、Oculus SDKライセンス契約開発者データ利用ポリシー、ならびに適用されるすべてのOculusおよびMetaのポリシーと利用規約に従う必要があります。プライバシーとデータ保護に関して適用される法律が、Movementの利用について、またプライバシーとデータ保護に関して適用されるすべての法律に対応する可能性があります。
特に、アイトラッキングAPIによるデータの取得、使用、保持、および処理について明確に説明しているプライバシーポリシーを、一般公開で容易に閲覧できる状態で掲載し、それに準拠する必要があります。プライバシーとデータ保護について適用される法律により求められているものも含め、抽象化された視線データを収集する前に、そのようなデータへのアクセスおよび使用に関する明確で包括的な情報をユーザーに提供し、ユーザーの同意を得ておかなければなりません。
アイトラッキングAPIの利用が当社のポリシーに準拠しているかを確認するため、その利用状況を監視する権利を弊社が留保していることに注意してください。
ユーザーがアプリでアイトラッキングをオンにすると、そのアプリには、リアルタイムの抽象化視線データへのアクセス許可が付与されます。このデータは、開発者データの使用ポリシーの下でのユーザーデータです。このデータをデータ使用の禁止行為に使うことは明示的に禁止されています。アイトラッキング機能は、MetaのアイトラッキングAPIテクノロジーを利用しています。

XrEyesのサンプルアプリ

XrEyesのサンプルアプリをビルドする

Oculus Mobile OpenXR SDK (v47以降)をダウンロードし、XrEyesサンプルアプリケーションをビルドしてください。
adb uninstall com.oculus.sdk.xreyes
cd XrSamples/XrEyes/Projects/Android
../../../../gradlew installDebug

XrEyesのサンプルアプリを使う

ユーザーがサンプルアプリを開くと、ワールドロックされたテーブルが表示されます。そのテーブルには、両目の視線データのエントリーがあります。各目について、回転は4つのクォータニオンと3つのオイラー角の両方で示されており、目の位置および信頼値もあわせて記載されています。アプリでの視線は、ワールド座標系で指定します。
Using the XrEyes Sample App
頭を動かし、ワールドロックされたテーブルをトラッキングしてみると、視線の回転はほとんど変化しません。これは想定されていることであり、目が正しくトラッキングされている証拠です。その代わり、視線を動かして画面の記録を取れば、視線が正しく更新されることがわかります。また、アイトラッキングの信頼値は0.5で、変化しないことがわかります。トラッカーによるアイトラッキング信頼出力値は現在完全に信頼できるものではなく、0.5に設定されているため、これも想定内です。

アクセス許可

アプリでアイトラッキング機能を使用するためには、Androidマニフェストで"com.oculus.permission.EYE_TRACKING" アクセス許可を宣言する必要があります。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><uses-feature android:name="oculus.software.eye_tracking" android:required="true" /><uses-permission android:name="com.oculus.permission.EYE_TRACKING" />

    ....
</manifest>
詳しくは、Meta Questヘッドセット用OpenXRサポートのガイドをご覧ください。
com.oculus.permission.EYE_TRACKINGアクセス許可は「実行時」アクセス許可であるため、アプリからユーザーに明示的に許可の付与を求める必要があります。実行時アクセス許可について詳しくは、実行時アクセス許可をご覧ください。メインアクティビティでアクセス許可を処理する例を以下に示します。
  private static final String PERMISSION_EYE_TRACKING = "com.oculus.permission.EYE_TRACKING";
  private static final int REQUEST_CODE_PERMISSION_EYE_TRACKING = 1;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestEyeTrackingPermissionIfNeeded();
  }

  private void requestEyeTrackingPermissionIfNeeded() {
    if (checkSelfPermission(PERMISSION_EYE_TRACKING) != PackageManager.PERMISSION_GRANTED) {
      requestPermissions(
          new String[] {PERMISSION_EYE_TRACKING}, REQUEST_CODE_PERMISSION_EYE_TRACKING);
    }
  }

アイトラッキング拡張機能

XR_FB_eye_tracking_socialは、視線による操作を可能にすることを目的とした既存のXR_EXT_eye_gaze_interaction拡張機能とは異なるソーシャルアプリケーションを可能にする拡張機能を導入します。XR_FB_eye_tracking_social拡張機能により、それぞれの目の視線方向とそれに対応する位置の情報が提供されます。さらに、それぞれの目の視線の信頼度の値も、[0, 1]の範囲の浮動小数点数として出力されます。ただし、現在のところその値は0.5に固定されています。ソーシャルアプリはスペース内の点/人への凝視を利用するため、両目の視線出力は一時的に平滑化されて、必然的にユーザーの正面に収束します。
アイトラッキングはデバイス上の専用センサーを利用するため、Meta Quest ProではこのAPIがサポートされていますが、それらのセンサーのないMeta Quest 2やそれ以前のデバイスではサポートされていません。
APIのリファレンス全体については、Movement APIリファレンスをご覧ください。

設定

ヘッダーをインクルードする

ソースコードに、アイトラッキング用の以下のヘッダーをインクルードします。
   #include <openxr/openxr.h>

OpenXRを初期化する

アイトラッキングを使う前に、OpenXRセッションを初期化し、拡張機能を有効にする必要があります。セッションの初期化について詳しくは、インスタンスとセッションの作成をご覧ください。

初期化

アプリから特定のOpenXR拡張機能にアクセスするには、事前にOpenXRセッションを作成し、必要なOpenXR拡張機能を有効にする必要があります。アプリのその部分は、どの拡張機能についても共通です。
初期化時には、アプリのすべてのOpenXR拡張機能で共有される、以下のオブジェクトセットを作成できます。
XrInstance instance;
XrSystemId system;
XrSession session;
XrSpace sceneSpace;
詳しくは、Oculus OpenXRモバイルSDKにあるSampleXrFramework/Src/XrApp.hヘッダーをご確認ください。
処理については、OpenXRの仕様で説明されています。
実装の詳細については、Oculus OpenXRモバイルSDKにあるSampleXrFramework/Src/XrApp.cppをご覧ください。

拡張機能を有効にする

XrInstanceを作成するには、すべての拡張機能を明示的に列挙してください。
std::vector<const char*> extensions;

// ...

XrInstance Instance = XR_NULL_HANDLE;

XrInstanceCreateInfo instanceCreateInfo = {XR_TYPE_INSTANCE_CREATE_INFO};

// ...
instanceCreateInfo.enabledExtensionCount = extensions.size();
instanceCreateInfo.enabledExtensionNames = extensions.data();

// ...
OXR(initResult = xrCreateInstance(&instanceCreateInfo, &Instance));
実装の詳細については、Oculus OpenXRモバイルSDKにあるSampleXrFramework/Src/XrApp.cppをご覧ください。

アイトラッキングの初期化

OpenXR拡張機能を1度初期化して、OpenXR APIに対するすべての呼び出しの間で共有する必要があります。それが成功すると、以下のデータが取得されます。
    XrSession Session;
    XrSpace StageSpace;
詳しくは、SampleXrFramework\Src\XrApp.hヘッダーをご覧ください。
拡張機能の名前には、定数XR_FB_EYE_TRACKING_SOCIAL_EXTENSION_NAMEを使うことをおすすめします。

互換性を確認する

ユーザーのヘッドセットでアイトラッキングがサポートされているかどうかを確認する必要があります。確認するには、特定のXrInstanceに関して、xrGetSystemProperties関数を呼び出すことにより、システムプロパティを受け取る必要があります。
そのためには、システムがアイトラッキングをサポートしているかどうかを示すXrSystemEyeTrackingPropertiesFB構造体を使ってください。その定義は次のとおりです。
typedef struct XrSystemEyeTrackingPropertiesFB {
   XrStructureType type;
   void* XR_MAY_ALIAS next;
   XrBool32 supportsEyeTracking;
} XrSystemEyeTrackingPropertiesFB;
この構造体の詳細については、Movement APIリファレンスにあるXrSystemEyeTrackingPropertiesFBをご覧ください。
以下の例は、アイトラッキングのサポートを確認する方法を示しています。
        XrSystemEyeTrackingPropertiesFB eyeTrackingSystemProperties{
            XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_FB};
        XrSystemProperties systemProperties{
            XR_TYPE_SYSTEM_PROPERTIES, &eyeTrackingSystemProperties};
        OXR(xrGetSystemProperties(GetInstance(), GetSystemId(), &systemProperties));
        if (!eyeTrackingSystemProperties.supportsEyeTracking) {
            return;
        }
XrSystemEyeTrackingPropertiesFBeyeTrackingSystemPropertiesフィールドでtrueが返される場合、アイトラッキングがサポートされています。

関数ポインターを取得する

アイトラッカーを作成するには、拡張機能を使う前に、その中のすべての関数へのリンクを取得する必要があります。詳しくは、OpenXR仕様書のxrGetInstanceProcAddrをご覧ください。取得方法の例は次のとおりです。
    PFN_xrCreateEyeTrackerFB xrCreateEyeTrackerFB_ = nullptr;
    PFN_xrDestroyEyeTrackerFB xrDestroyEyeTrackerFB_ = nullptr;
    PFN_xrGetEyeGazesFB xrGetEyeGazesFB_ = nullptr;

        OXR(xrGetInstanceProcAddr(
            GetInstance(), "xrCreateEyeTrackerFB", (PFN_xrVoidFunction*)(&xrCreateEyeTrackerFB_)));
        OXR(xrGetInstanceProcAddr(
            GetInstance(),
            "xrDestroyEyeTrackerFB",
            (PFN_xrVoidFunction*)(&xrDestroyEyeTrackerFB_)));
        OXR(xrGetInstanceProcAddr(
            GetInstance(), "xrGetEyeGazesFB", (PFN_xrVoidFunction*)(&xrGetEyeGazesFB_)));

拡張機能の使用

アイトラッカーを作成する

アイトラッカーを作成するには、xrCreateEyeTrackerFB関数を呼び出します。この関数は、アイトラッカーのXrEyeTrackerFBハンドルを作成して取得するために使用します。その関数定義は次のとおりです。
XrResult xrCreateEyeTrackerFB(
	XrSession session,
	const XrEyeTrackerCreateInfoFB* createInfo,
	XrEyeTrackerFB* eyeTracker);
この関数を呼び出すにはXrEyeTrackerCreateInfoFB構造体を使用する必要があります。この構造体は、アイトラッカーを作成するために、リクエストする機能について記述するものです。この構造体の定義は次のとおりです。
typedef struct XrEyeTrackerCreateInfoFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;
} XrEyeTrackerCreateInfoFB;
詳しくは、Movement APIリファレンスにあるXrEyeTrackerCreateInfoFBをご覧ください。使用例は次のとおりです。
   XrEyeTrackerFB eyeTracker_ = XR_NULL_HANDLE;
         XrEyeTrackerCreateInfoFB createInfo{XR_TYPE_EYE_TRACKER_CREATE_INFO_FB};
         OXR(xrCreateEyeTrackerFB_(GetSession(), &createInfo, &eyeTracker_));
アイトラッカーはセッションごとに1つしか使用できないため、xrCreateEyeTrackerFB関数を複数回呼び出した場合は同じハンドルが返されます。このハンドルはプロセスごとに固有であり、複数のプロセス間でシェアすることはできません。
重要:xrCreateEyeTrackerFB関数の呼び出しが成功するには、アプリのマニフェストにおいてcom.oculus.permission.EYE_TRACKINGアクセス許可をリクエストし、ユーザーによってこのアクセス許可が付与される必要があります。

視線データを取得する

視線データと目の位置の情報は、片目ごとにアイトラッカーにより計算および提供されます。アイトラッキングからの視線データは、xrCreateEyeTrackerFBの呼び出し完了後、xrGetGazesFB関数を呼び出すことですぐに利用できるようになります。xrGetEyeGazeFB関数を呼び出すと、特定の時刻の、特定の座標系内でのユーザーの目のポーズが取得されます。
xrGetGazesFB関数の定義は、次のとおりです。
XrResult xrGetEyeGazesFB(
   XrEyeTrackerFB eyeTracker,
   const XrEyeGazesInfoFB* gazeInfo,
   XrEyeGazesFB* eyeGazes);
詳しくは、Movement APIリファレンスにあるxrGetGazesFBをご覧ください。xrGetGazesFBのパラメーターであるXrEyeGazesInfoFB構造体は、必要な視線位置情報のために必要な時刻とスペースを含みます。呼び出し側では、レンダリングフレームの予測表示時刻に等しい時刻をリクエストしてください。システムでは、その時刻の視線を提供するために適切なモデリングを採用します。XrEyeGazesInfoFB構造体の定義は次のとおりです。
typedef struct XrEyeGazesInfoFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;
   XrSpace baseSpace;
   XrTime time;
} XrEyeGazesInfoFB;
xrGetGazesFB関数の呼び出しは、それぞれの目の視線のポーズと信頼度、およびタイムスタンプの配列が含まれるXrEyeGazesFB構造体を返します。XrEyeGazesFB構造体の定義は次のとおりです。
typedef struct XrEyeGazesFB {
   XrStructureType type;
   void* XR_MAY_ALIAS next;
   XrEyeGazeFB gaze[XR_EYE_INDEX_COUNT_FB];
   XrTime time;
} XrEyeGazesFB;
この構造体の詳細については、Movement APIリファレンスにあるXrEyeGazesFBをご覧ください。注:gaze配列のインデックス0はユーザーの左目、インデックス1は右目を表します。
次の例は、xrGetEyeGazesFB関数を呼び出す方法を示しています。
XrEyeGazesFB eyeGazes{XR_TYPE_EYE_GAZES_FB};
eyeGazes.next = nullptr;

XrEyeGazesInfoFB gazesInfo{XR_TYPE_EYE_GAZES_INFO_FB};
gazesInfo.baseSpace = GetStageSpace();
gazesInfo.time = GetPredictedDisplayTime();

OXR(xrGetEyeGazesFB_(eyeTracker_, &gazesInfo, &eyeGazes));
アイトラッキングデータを使用するには、視線が有効であることを確認する必要があります。一般的なパターンは次のとおりです。
for (int eye = 0; eye < 2; ++eye) {
    if (eyeGazes.gaze[eye].isValid) {
        // eyeGazes.gaze[eye].gazePose.orientation contains orientation of an eye gaze
        // eyeGazes.gaze[eye].gazeConfidence contains confidential
        ....
    }
}

トラッカーを破棄する

アプリケーションを完了する前に、xrDestroyEyeTrackerFB関数を使用してリソースを解放することをおすすめします。
OXR(xrDestroyEyeTrackerFB_(eyeTracker_));
ナビゲーションロゴ
日本語
© 2026 Meta