Meta Quest ProをMeta Horizon LinkでPCへ接続し、Unity EditorのPlay Mode上でアイトラッキングを行う環境を構築した。
本ページでは、Unity OpenXRの一般的なEye Gaze取得方法では視線情報を取得できなかった事例と、OpenXR Extension XR_FB_eye_tracking_social を利用して取得に成功した方法についてまとめる。
HMD:Meta Quest Pro
接続:Meta Horizon Link
Meta Horizon Link:208系
Unity:6000.4.7f1
XR:Unity OpenXR
実行環境:Windows
実行方法:Unity Editor Play Mode
OpenXR Runtime:Meta Quest Link側OpenXR Runtime
本検証では、Quest向けAndroidアプリとしてビルドするのではなく、Meta Horizon Linkを介してQuest ProをPCへ接続し、Unity Editor上でVR表示とアイトラッキングを同時に行うことを対象とした。
Meta Quest Proを使用するため、当初はMetaが提供するMeta XR SDKを導入し、OpenXR設定内のMeta XR Featureを有効化した。
しかし、本検証環境ではこの状態でUnity EditorのPlay Modeを開始すると、Meta Horizon Linkとの接続自体は成立しているものの、HMD側が待機画面からUnityのVR画面へ遷移せず、Editor Playを行うことができなかった。
検証の結果、Standalone環境では以下の構成とすることで、Meta Horizon Link経由のEditor Playが可能となった。
OpenXR ON
Initialize XR on Startup ON
Oculus Touch Controller Profile ON
Meta XR Feature OFF
Meta XR Foveation OFF
このため、本環境ではMeta XR Featureを使用せず、Unity OpenXRを基本とした構成で開発を進めた。
また、Meta Project Setup Toolでは推奨設定への変更が提示される場合があるが、設定を一括で適用すると、動作確認済みのOpenXR設定が変更される可能性がある。そのため、本環境では各項目を確認しながら個別に設定した。
はじめに、Unity OpenXRで一般的に用いられる Eye Gaze Interaction Profile を有効化し、Unity Input Systemの<EyeGaze>デバイスから視線Poseを取得する方法を試した。
Unity側ではEye Gazeデバイス自体は認識され、OpenXR Runtime上でも XR_EXT_eye_gaze_interaction が利用可能であることを確認できた。しかし、実際に取得される値は初期値のままであり、HMD内で視線を移動させても値は変化せず、有効な視線Poseを取得することができなかった。
このことから、今回のUnity・Meta Horizon Link・OpenXR Runtimeの組み合わせでは、Unity標準の XR_EXT_eye_gaze_interaction を利用する経路からQuest Proの視線情報を取得できないと判断した。
なお、これはQuest Proのアイトラッキング機能そのものが利用できないことを意味するものではない。同じHMD・PC・Meta Horizon Link環境において別の実行環境では視線取得が可能であったため、Unity標準のEye Gaze取得経路に原因があると考えた。
次に、Unityから利用可能なOpenXR Extensionを確認した。その結果、Eye Trackingに関連するExtensionとして以下が確認できた。
XR_EXT_eye_gaze_interaction
XR_FB_eye_tracking_social
XR_HTC_eye_tracker
XR_EXT_eye_gaze_interaction では正常に取得できなかった一方で、Meta向けExtensionである XR_FB_eye_tracking_social がRuntimeから公開されていた。
そこで、Unity標準のEye Gaze Interaction Profileを経由せず、XR_FB_eye_tracking_social を直接利用する方法を試した。
Unity OpenXRのカスタムFeatureを作成し、XR_FB_eye_tracking_social を有効化した。
OpenXRの関数ポインタを取得し、主に以下のAPIを利用した。
xrCreateEyeTrackerFB
xrDestroyEyeTrackerFB
xrGetEyeGazesFB
Eye Trackerの生成は正常終了し、xrGetEyeGazesFB を呼び出すことで左右眼それぞれの視線Poseを取得できた。
取得時には左右眼とも有効状態となり、Confidenceも約0.998を示した。
LeftValid = True
RightValid = True
LeftConfidence ≈ 0.998
RightConfidence ≈ 0.998
HMD内で視線を移動させると、取得される眼球回転も連続的に変化し、Meta Horizon Link経由でもQuest Proのアイトラッキング情報がUnity Editorまで届いていることを確認した。
xrGetEyeGazesFB から取得したPoseは、そのままではUnityの座標系と一致しないため変換を行った。
本環境では、位置およびQuaternionについて以下の変換を用いた。
Position (x, y, z) → (x, y, -z)
Rotation (x, y, z, w) → (-x, -y, z, w)
正面・左・右・上・下に配置したターゲットを注視するテストを行い、それぞれの方向に対して取得した視線ベクトルが正しく変化することを確認した。
今回の結果は、Meta Quest Pro、Meta Horizon Link、Unity 6000.4.7f1、Unity OpenXRを組み合わせた検証環境における結果である。
そのため、
「UnityではQuest ProのEye Trackingを取得できない」
という意味ではなく、
「今回の環境ではUnity OpenXR標準の XR_EXT_eye_gaze_interaction 経路では正常に取得できず、XR_FB_eye_tracking_social を直接利用することで取得できた」
という結果である。
Meta Horizon Link、OpenXR Runtime、Unity、OpenXR Plugin等の更新によって挙動が変化する可能性がある。また、XR_FB_eye_tracking_social はMeta向けExtensionであるため、他社製HMDへの移植性についても注意が必要である。