視線調整 — MRTK2

視線調整通知のスクリーンショット

概要

視線追跡がアプリのエクスペリエンスの基本部分である場合は、ユーザーの視点の調整が有効であることを確認する必要があります。 これが無効になる主な理由は、ユーザーがデバイスを装着するときに視線追跡の調整をスキップすることを選択したことです。

このページでは、次の内容について説明します。

  • ユーザーの視点が調整されていることを検出する方法について説明します
  • ユーザーに視点の調整を行うように案内するユーザー通知をトリガーする方法のサンプルを示します
    • 視点の調整が有効になった場合に自動的に通知を閉じます
    • ユーザーが調整をしないで続行することを選択した場合は、手動で通知を閉じます

視線の調整状態を検出する方法

MRTK での視線追跡の構成は IMixedRealityEyeGazeProvider インターフェイスで行います。

CoreServices.InputSystem.EyeGazeProvider を使用すると、実行時にツールキットに登録されている既定の視線入力プロバイダーの実装が提供されます。 IMixedRealityEyeGazeProvider.IsEyeGazeValid からは bool? が返されます。これは、視線トラッカーからの情報がまだ利用できない場合は null になります。 データが受信されると、ユーザーの視線追跡の調整が有効か無効かを示すために、true または false が返されます。

サンプルの視点の調整通知 - 詳細手順

  1. MRTK 視線追跡サンプル パッケージ (Assets/MRTK/Examples/Demos/EyeTracking) を開きます

  2. EyeTrackingDemo-00-RootScene.unity シーンを読み込みます

  3. EyeCalibrationChecker を確認します。

    • このシーンには、現在のユーザーが EyeCalibrationChecker ゲーム オブジェクトで調整されているかどうかを検出するためのサンプルが既に用意されています。 これは、単にいくつかのテキスト メッシュの親となるほか、通知の表示と消去をブレンドするための追加のトリガーを提供します。これには、アクティブ化時にサイズと不透明度を徐々に上げることが含まれます。 通知が閉じられると、そのサイズが徐々に小さくなり、フェードアウトします。

    • EyeCalibrationChecker ゲーム オブジェクトにアタッチされている EyeCalibrationChecker スクリプトでは、次の 2 つの Unity イベントが公開されます。

      • OnEyeCalibrationDetected()
      • OnNoEyeCalibrationDetected()
    • これらのイベントは、調整の状態が変化した場合にのみトリガーされます。 このため、ユーザーが通知を閉じることを選択した場合、通知は次の状況になるまで表示されません

      • アプリが再起動された
      • 有効なユーザーが検出された後、新しい未調整のユーザーがデバイスを装着した
    • アニメーションとイベントが正しくトリガーされるかどうかをテストするために、EyeCalibrationChecker スクリプトには bool editorTestUserIsCalibrated フラグが用意されています。 たとえば、Unity Editor で実行する場合、次のことをテストできます。

      1. 調整状態が true から false に変更されたときに通知を自動的にポップアップするかどうか
      2. 状態が false から true に変更されたときに通知を再度自動的に閉じるかどうか。
    private bool? prevCalibrationStatus = null;
    ...

   void Update()
   {
      // Get the latest calibration state from the EyeGazeProvider
      bool? calibrationStatus = CoreServices.InputSystem?.EyeGazeProvider?.IsEyeCalibrationValid;

      ...

      if (calibrationStatus != null)
      {
         if (prevCalibrationStatus != calibrationStatus)
         {
            if (calibrationStatus == false)
            {
               OnNoEyeCalibrationDetected.Invoke();
            }
         else
         {
            OnEyeCalibrationDetected.Invoke();
         }

         prevCalibrationStatus = calibrationStatus;
      }
   }

関連項目