Как мне получить местоположение взгляда в 2D-приложениях UWP с помощью HoloLens 2 в C#

#c# #uwp #2d #hololens #eye-tracking

Вопрос:

Онлайн — документы, такие как-Соображения по дизайну 2D-приложений: Пользовательский интерфейс/UX утверждают, что в 2D-приложениях UWP

Когда пользователь смотрит на что-то или указывает с помощью контроллера движения, произойдет событие наведения касания. Это состоит из точки указателя, где тип указателя-Касание, но значение IsInContact равно false.

Это означает, что взгляд глаз автоматически отображается в окне вашего 2D-приложения на HoloLens 2 и доступен через такие события, как событие PointerMovedEvent. Однако, основываясь на моих тестах, я обнаружил, что в приложение в качестве события наведения на сенсорное изображение передается не взгляд глаз или даже не взгляд головы, а на HoloLens 2.На самом деле это луч, направленный вашим пальцем через распознавание рук, если вы указываете на рамку окна 2D-приложения в 3D-пространстве. Но если кто-то знает, что взгляд глаз на самом деле отображается и доступен в окне приложения 2D UWP, пожалуйста, дайте мне знать.

Следующий подход, по-видимому, заключается в использовании API SpatialPointPose

Я могу захватить начальное положение HoloLens при запуске приложения и закрепить неподвижную ссылку на это местоположение с помощью следующих строк кода:

   private async void Page_Loaded(object sender, RoutedEventArgs e)
     {
        if (EyesPose.IsSupported() == true)
           {
            var ret = await EyesPose.RequestAccessAsync();
            originLocator = SpatialLocator.GetDefault(); 
            originRefFrame = originLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();
            coordinateSystem = originRefFrame .CoordinateSystem;
           }
         gazeTimer.Start();
    }
 

Мне также удалось затем использовать эту систему отсчета для получения системы координат
, и с помощью таймера отправки я могу передать ее вместе с отметкой времени восприятия, чтобы получить пространственно-точечный объект:

Из которого я затем могу извлечь источник взгляда и направление взгляда, а также отобразить и обновить значения на экране в текстовых блоках xaml:

 private void GazeTimer_Tick(object sender, object e)
    {
      timestamp = PerceptionTimestampHelper.FromHistoricalTargetTime(DateTime.Now);
      spPose = SpatialPointerPose.TryGetAtTimestamp( coordinateSystem, timestamp );

      if (spPose.Eyes != null amp;amp; spPose.Eyes.IsCalibrationValid)
            {
                if (spPose.Eyes.Gaze != null)
                {
                   OriginXtextBlock.Text = spPose.Eyes.Gaze.Value.Origin.X.ToString();
                   OriginYtextBlock.Text = spPose.Eyes.Gaze.Value.Origin.Y.ToString();
                   OriginZtextBlock.Text = spPose.Eyes.Gaze.Value.Origin.Z.ToString();
                   DirectionXtextBlock.Text = spPose.Eyes.Gaze.Value.Direction.X.ToString();
                   DirectionYtextBlock.Text = spPose.Eyes.Gaze.Value.Direction.Y.ToString();
                   DirectionZtextBlock.Text = spPose.Eyes.Gaze.Value.Direction.Z.ToString();
                 }
            }
    }
 

Однако я не нашел способа определить местоположение рамки окна 2D-приложения UWP в 3D-пространстве или найти сведения о том, как разрешение пикселей окон приложения сопоставляется с этим кадром,чтобы затем я мог каким-то образом определить координаты экрана x, y, которые пересекает указатель взгляда в окне 2d-приложения.

Я в основном хочу получить аналогичный результат с помощью взгляда, как описано в документах онлайн-справки (который, похоже, фактически реализован для распознавания указательного пальца руки). Но если он не отображается через что-то вроде события указателя, я не возражаю против использования api SpatialPointPose, если есть способ завершить последнюю милю запроса местоположения рамки окна 2D-приложения и разрешения координат экрана, которые пересекаются лучом взгляда глаза.

Комментарии:

1. 2D-приложение будет помещено в голографическую оболочку операционной системы, и нет никакого API, который мог бы получить местоположение окна приложения из системной оболочки. Аналогично, голографическая оболочка операционной системы не позволяет вам вернуться к взгляду головы и начать показывать курсор взгляда головы для взаимодействия с 2d-приложением. Кроме того, Корпорация Майкрософт рекомендует избегать прикрепления курсора непосредственно к взгляду пользователя, поскольку это может привести к эффекту «бегущего курсора» из-за небольших смещений в проецируемом сигнале взгляда.

2. Для получения дополнительной информации, пожалуйста, смотрите: Рекомендации по дизайну

3. @HoloSheep Ты смог это сделать?

4. @yaali еще нет, есть идеи?

Ответ №1:

Поведение взгляда, описанное в документации по разработке 2D — приложений, относится к HoloLens первого поколения.

В HoloLens 2 взгляд запускает события указателя в 2D-приложениях, когда пользователь находится в режиме выбора. Это делается для предотвращения проблемы «непреднамеренного всплывающего окна или нежелательного взаимодействия», возникшей у приложений с пристальным взглядом в HoloLens 2. Взаимодействие с пристальным взглядом теперь происходит только намеренно.

Мы обновим документы, чтобы уточнить.

2D-приложение не может найти свое местоположение в голографическом пространстве, поэтому не существует согласованного способа отображения пространственной точки в координатное пространство 2D-приложения. Этот API полезен только для голографических приложений.