Hiromuブログ

最近はこちら(https://zenn.dev/hiromu)が本体

HoloLens 2 の Eye Tracking 設定

アイトラッキングの実装をするたびに調べることになっているのでまとめることにしました。 基本的には以下ドキュメントがベースになっており、実装部分で関連リンク先の内容などを少しまとめたものになっています。

設定だけであればスクショを見るだけで完了すると思います。

確認環境

アイトラッキング要件

  1. Eye Gaze Data Provider を追加する
  2. GazeInput ケイパビリティを有効にする
  3. 現在のユーザーに対してキャリブレーションされていること

キャリブレーションされていない場合、アイトラッキングシステムは入力を返さない 以下のどちらかでキャリブレーションを行う

  • バイザーを上に上げてからもとに戻す(手っ取り早い方法)
  • 設定の[システム]> [調整]> [視線調整の実行]

プロファイル設定

  • DefaultMixedRealityToolkitConfigurationProfile を選択して'Copy & Customize'を選択する
  • プロファイルの Input タブを選ぶ
  • DefaultMixedRealityInputSystemProfile を選択してクローンする
  • Input Data Provider の '+ Add Data Provider' を選択する
  • Type に 'Microsoft.MixedReality.Toolkit.WindowsMixedReality.Input' -> 'WindowsMixedRealityEyeGazeDataProvider' を設定する
  • Supported Platform(s) に Platform(s) select 'Windows Universal' を設定する
    f:id:HiromuKato:20200501033237p:plain
    Profile

Unity Editor でアイトラッキングをシミュレートする場合

  • プロファイルの Input タブを選ぶ
  • 'Input Data Providers' -> 'Input Simulation Service' を開く
  • 'DefaultMixedRealityInputSimpulationProfile' をクローンする
  • 'Simulate Eye Position' にチェックを入れる

    f:id:HiromuKato:20200501033304p:plain
    simulation

  • default head gaze cursor を無効にすることが推奨されている

    • プロファイルの Input タブを選ぶ
    • 'Pointers' を開く
    • 'DefaultMixedRealityInputPointerProfile' をクローンする
    • 'Pointer Settings' の Gaze Cursor Prefab に EyeGazeCursor を設定する
      f:id:HiromuKato:20200501033131p:plain
      Gaze Setting

GazeProvider の eye-based gaze 有効化

  • Main Camera についている GazeProvider の Use Eye Tracking にチェックを入れる(入れない場合はアイゲイズではなくヘッドゲイズになる)
    f:id:HiromuKato:20200501033342p:plain
    Use Eye Tracking

視線データへのアクセス

ドキュメント

// Show the object at the hit position of the user's eye gaze ray with the target.
gameObject.transform.position = CoreServices.InputSystem.EyeGazeProvider.HitPosition;

// If no target is hit, show the object at a default distance along the gaze ray.
gameObject.transform.position =
CoreServices.InputSystem.EyeGazeProvider.GazeOrigin +
CoreServices.InputSystem.EyeGazeProvider.GazeDirection.normalized * defaultDistanceInMeters;

ハンドレイを無効にする方法

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

 // Restore default behavior for rays (on if not near something grabbable)
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

// Turn off hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

// Turn off the gaze pointer
PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOff);

視線入力によるターゲットの選択

ドキュメント

汎用のフォーカスおよびポインターハンドラーを使用する場合

  • IMixedRealityFocusHandler、IMixedRealityPointerHandler を継承する
  • ハンドレイがある場合ハンドレイが優先される

視線固有のBaseEyeFocusHandler を利用する場合

  • 視線入力のみフォーカスに反応する(ハンドレイは反応しない)
  • BaseFocusHandler を継承したクラスで以下を実装する
    • OnEyeFocusStart:視線がこのターゲットのコライダーと交差し始めるとトリガーされる
    • OnEyeFocusStay:トリガーながら視線光線は、このターゲットのコライダーと交差している
    • OnEyeFocusStop:視線がこのターゲットのコライダーとの交差を停止するとトリガーされる
    • OnEyeFocusDwell:視線がこのターゲットのコライダーと特定の時間交差すると、トリガーされる

EyeTrackingTarget を利用する場合

  • 視線入力のみフォーカスに反応する(ハンドレイは反応しない)
  • MRTK の EyeTrackingTarget コンポーネントを付ける

視線のフォーカスとハンドレイの両方を同時に使用する方法

  • ハンドレイが有効の場合ハンドレイがプライマリポインターとして機能する
  • BaseEyeFocusHandler もしくは EyeTrackingTarget で視線入力のみの検出が可能
  • この2つを組み合わせればよい

サンプル実装

  • GitHub (この中の EyeTrackingSample シーン)