Меню рук — MRTK3

Меню

Меню рук позволяет пользователям создавать пользовательский интерфейс, подключенный вручную, для часто используемых функций. Обычно это небольшие группы кнопок , которые предлагают быстрые действия. Однако иногда более сложные макеты для отображения информации или параметров предоставляются пользователю в виде меню для рук, часто с возможностью "оторвать" меню от руки и привязать его к миру.

Меню "Рука" предоставляет параметры "Требовать плоскую руку" и "Использовать активацию взгляда", чтобы предотвратить ложную активацию при взаимодействии с другими объектами. Рекомендуется использовать эти параметры для предотвращения нежелательной активации.

Пример сцены и заготовок

Если вы используете проект шаблона, HandMenuExamples.unity демонстрирует несколько распространенных конфигураций для меню рук, при этом используется HandConstraintPalmUp скрипт.

Пример сцены меню

HandMenuLarge

Эта заготовка демонстрирует пример большого или сложного пользовательского интерфейса, требующего длительного времени взаимодействия. Для этого типа пользовательского интерфейса рекомендуется заблокировать меню под рукой, чтобы повысить удобство использования и избежать усталости рук. В этом примере также поддерживается "захват и извлечение" для блокировки меню.

В этом примере меню становится видимым и невидимым, активируя объект MenuContent в событии OnFirstHandDetected( ). При событии OnLastHandLost() активируется кнопка закрытия и активируется анимация размещения. Анимация представляет собой простое изменение масштаба. Так как мы не скрывали событие MenuContent on OnLastHandLost(), меню будет автоматически заблокировано, если рука не видна. Значения в разделе Palm Up были оптимизированы, чтобы меню было заблокировано без перетаскивания вниз слишком много при падении.

Пример меню

Конфигурация Palm Up

В этом примере представлена панель захвата в нижней области меню и поведение автоматической блокировки мира. Пользователь может явно отсоединить меню от руки и поместить его в мир, захватив его. Для этого для события ManipulationStarted() в ObjectManipulator мы отключаем SolverHandler.UpdateSolvers. В противном случае меню не будет отсоединяться, так как решатель HandConstraint попытается разместить меню рядом с положением руки. Мы также используем HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine , чтобы пользователь поднял руку, чтобы повторно подключить меню к руке.

Пример меню

Наконец, кнопка закрытия должна повторно активировать SolverHandler.UpdateSolvers , чтобы восстановить функциональные возможности решателя HandConstraint.

Пример меню

Скрипты

Поведение HandConstraint предоставляет решателя, который ограничивает отслеживаемый объект регионом, безопасным для содержимого, ограничиваемого руками (например, пользовательского интерфейса руки, меню и т. д.). Безопасные регионы считаются областями, которые не пересекаются с рукой. Производный класс HandConstraint, вызываемый HandConstraintPalmUp, также включен для демонстрации общего поведения активации объекта, отслеживаемого решателем, когда ладонь обращена к пользователю.

Дополнительные сведения см. в подсказках, доступных для каждого HandConstraint свойства. Ниже приведены более подробные описания некоторых свойств.

  • Безопасная зона. Безопасная зона указывает, где на руке нужно ограничить содержимое. Рекомендуется размещать содержимое на стороне Ulnar, чтобы избежать перекрытия с рукой и улучшения качества взаимодействия. Безопасные зоны вычисляются на основе ориентации рук, проецируемых в плоскость ортогональной для обзора камеры, и лучами на ограничивающий прямоугольник вокруг рук. Безопасные зоны определяются для работы с XRNode. Рекомендуется изучить, что представляет каждая безопасная зона в разных типах контроллеров.

  • Следите за рукой до лицом камеры При этом решатель будет следить за вращением рук, пока меню не будет достаточно выровнено с взглядом, когда оно обращено к камере. Чтобы выполнить эту работу, измените в параметре SolverRotationBehaviorHandConstraintSolverс LookAtTrackedObject на по LookAtMainCamera мере GazeAlignment изменения угла с решателем.

Пример безопасной зоны меню

  • События активации. В настоящее HandConstraint время активирует четыре события активации. Эти события можно использовать в различных сочетаниях для создания уникальных HandConstraint поведений.

    • OnHandActivate: активируется, когда рука удовлетворяет методу IsHandActive.
    • OnHandDeactivate: активируется, если метод IsHandActive больше не удовлетворяется.
    • OnFirstHandDetected: происходит, когда состояние отслеживания рук меняется с точки зрения отсутствия рук в представлении на первую руку в представлении.
    • OnLastHandLost: происходит, когда состояние отслеживания рук изменяется с по крайней мере с одной руки в представлении на нет рук в поле зрения.
  • Логика активации и деактивации решателя. В настоящее время рекомендуется активировать и деактивировать HandConstraintPalmUp логику с помощью SolverHandlerзначения , UpdateSolver а не путем отключения или включения объекта. Это можно увидеть в примере сцены с помощью обработчиков на основе редактора, активирующихся после событий ManipulationHandler вложенного меню OnManipulationStarted/Ended.

    • Остановка логики ограничения рук. При попытке остановить объект с ограничением руки (а не запускать логику активации и деактивации), установите для updateSolver значение False, а не отключать HandConstraintPalmUp.
      • Если вы хотите включить логику повторного подключения на основе взгляда (или даже не на основе взгляда), после этого следует вызвать функцию HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() . Это приведет к активации сопрограммы, которая продолжает проверка, если условия "IsValidController" выполнены, и установит для UpdateSolver значение True после того, как это будет установлено (или объект отключен).
    • Запуск логики ограничения рук. При попытке задать объект с ограничением руки, чтобы он снова начал следовать за рукой (в зависимости от того, соответствует ли он условиям активации), задайте для элемента SolverHandler UpdateSolver значение true.
  • Логика повторного подключения. В настоящее HandConstraintPalmUp время объект может автоматически повторно подключить целевой объект к отслеживаемой точке, независимо от того, имеет ли SolverHandlerзначение True для объекта UpdateSolver . Это делается путем вызова HandConstraintPalmUpфункции после того, как она будет заблокирована StartWorldLockReattachCheckCoroutine() во всем мире (что в данном случае фактически устанавливает для UpdateSolver SolverHandler значение False).