視点の調整

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

概要

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

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

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

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

MRTK の視線追跡の構成は、インターフェイスを使用して構成され IMixedRealityEyeGazeProvider ます。

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

サンプルの視線調整通知-ステップバイステップ

  1. MRTK アイ tracking サンプルパッケージ (Assets/MRTK/example/EyeTracking) を開きます。

  2. Load EyeTrackingDemo-00-rootscene. unity シーン

  3. EyeCalibrationChecker をチェックアウトします。

    • このシーンでは、現在のユーザーが EyeCalibrationChecker game オブジェクト で調整されているかどうかを検出するためのサンプルが既に用意されています。 いくつかのテキストメッシュを親とするだけでなく、通知の入力と出力をブレンドするための追加のトリガーがいくつかあります。これには、アクティブ化時のサイズと不透明度の増加が含まれます。 通知が破棄されると、サイズが遅くなり、フェードアウトします。

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

      • OnEyeCalibrationDetected()
      • OnNoEyeCalibrationDetected()
    • これらのイベントは、調整の状態が変化した場合にのみトリガーされます。 このため、ユーザーが通知を破棄することを選択した場合、通知は再び表示されます。

      • アプリが再起動されました
      • 有効なユーザーが検出され、新しい uncalibrated ユーザーがデバイスをに配置しました。
    • アニメーションとイベントが正しくトリガーされるかどうかをテストするために、EyeCalibrationChecker スクリプトには bool editorTestUserIsCalibrated フラグがあります。 たとえば、Unity エディターで実行する場合、次のいずれかをテストできます。

      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;
      }
   }

こちらもご覧ください