눈 보정 - MRTK2

눈 보정 알림의 스크린샷

개요

시선 추적이 앱 환경의 기본적인 부분인 경우 사용자의 눈 보정이 유효한지 확인할 수 있습니다. 유효하지 않은 기본 이유는 사용자가 장치를 착용할 때 시선 추적 보정을 건너뛰도록 선택하기 때문입니다.

이 페이지에서는 다음을 다룹니다.

  • 사용자가 눈 보정을 받는지 감지하는 방법을 설명합니다.
  • 사용자에게 눈 보정을 진행하도록 지시하는 사용자 알림을 트리거하는 방법에 대한 샘플을 제공합니다.
    • 눈 보정이 유효해지면 자동으로 알림 해제
    • 사용자가 보정 없이 계속하도록 선택하는 경우 수동으로 알림 해제

눈 보정 상태를 감지하는 방법

MRTK의 시선 추적 구성은 인터페이스를 IMixedRealityEyeGazeProvider 통해 구성됩니다.

CoreServices.InputSystem.EyeGazeProvider를 사용하면 런타임 시 도구 키트에 등록된 기본 응시 공급자 구현이 제공됩니다. IMixedRealityEyeGazeProvider.IsEyeGazeValidbool? 는 아직 눈 추적기에서 정보를 사용할 수 없는 경우 null인 을 반환합니다. 데이터가 수신되면 true 또는 false를 반환하여 사용자의 시선 추적 보정이 유효하거나 유효하지 않음을 나타냅니다.

샘플 눈 보정 알림 - 단계별

  1. MRTK 시선 추적 예제 패키지 열기(Assets/MRTK/Examples/Demos/EyeTracking)

  2. EyeTrackingDemo-00-RootScene.unity 장면 로드

  3. EyeCalibrationChecker를 확인하세요.

    • 이 장면에서는 현재 사용자가 EyeCalibrationChecker 게임 개체에서 보정되었는지 여부를 감지하기 위한 샘플이 이미 있습니다. 단순히 몇 가지 텍스트 메시를 부모로 지정하고 알림을 안팎으로 혼합하기 위한 몇 가지 추가 트리거가 있습니다. 여기에는 정품 인증 시 크기와 불투명도를 서서히 늘리는 것이 포함됩니다. 알림이 해제되면 서서히 크기가 줄어들고 페이드 아웃됩니다.

    • EyeCalibrationChecker 게임 개체에 연결된 은 두 개의 Unity 이벤트를 노출하는 EyeCalibrationChecker 스크립트입니다.

      • OnEyeCalibrationDetected()
      • OnNoEyeCalibrationDetected()
    • 이러한 이벤트는 보정 상태 변경되는 경우에만 트리거됩니다. 따라서 사용자가 알림을 해제하도록 선택하면 알림이 다시 표시되지 않습니다.

      • 앱이 다시 시작됩니다.
      • 유효한 사용자가 검색된 다음, 비보정되지 않은 새 사용자가 디바이스를 켜 놓았습니다.
    • 애니메이션 및 이벤트가 올바르게 트리거되는지 여부를 테스트하기 위해 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;
      }
   }

추가 정보