Ручной тренер — MRTK2

Hand Coach Menu

Ручной тренер — это трехмерная модельная рука, которая активируется, когда система не обнаруживает руки пользователя. Это реализуется как компонент обучения, который помогает направлять пользователя, когда жест не был обучен. Если пользователи не выполняли указанный жест в течение определенного периода, руки будут циклически с задержкой. Ручной тренер может использоваться для представления нажатия кнопки или получения голограммы.

Текущая модель взаимодействия представляет широкий спектр элементов управления жестами, таких как прокрутка, удаленное выделение и касание. Ниже приведен полный список существующих примеров ручного тренера:

  • Рядом с касанием — используется для кнопок или закрытия взаимодействуемых объектов
  • Дальний выбор — используется для объектов, которые находятся далеко
  • Перемещение — используется для перемещения голограммы в пространстве
  • Поворот — используется для демонстрации поворота голограмм или объектов
  • Масштабирование — используется для демонстрации того, как управлять голограммами, чтобы быть большими или меньшими
  • Отражение руки — используется для создания начальной панели пользовательского интерфейса или меню рук
  • Ладонь вверх - Используется для колибри момент в из коробки опыт. Другое предложение — открыть начальную панель пользовательского интерфейса
  • Прокрутка — используется для прокрутки списка или длинного документа

Пример сцены

Примеры можно найти в сцене HandCoachExample в разделе: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes

3D-ресурсы руки

Ресурсы можно найти в папке MixedRealityToolkit.SDK/Experimental/HandCoach.

Качество

Если вы заметили искажения на скинированной сетке, необходимо убедиться, что проект использует правильное количество суставов. Перейдите к редактированию > Unity Project Параметры > качества > других > весов смешения. Убедитесь, что выбраны "4 кости", чтобы увидеть Гладкие суставы. Project Setting

Скрипты

Указание взаимодействия

Этот InteractionHint.cs скрипт предоставляет функциональные возможности оболочки для активации анимаций и исчезания для ручной установки.

Настройка подсказки взаимодействия

Чтобы настроить подсказку взаимодействия, рекомендуется использовать предоставленные префабы "StaticHandCoachRoot_L.prefab" и "StaticHandCoachRoot_R.prefab". Этот префаб содержит скрипт InteractionHint и ручную буровую платформу, а также правильную иерархию, чтобы гарантировать, что предоставленные анимации подсказок работают должным образом. В противном случае вам потребуется поместить сценарий на gameObject один родительский уровень с ручной установки с аниматором.

Свойства инспектора

  • HideIfHandTracked Это логическое значение указывает, следует ли использовать состояние отслеживания рук для скрытия визуальных элементов при отслеживании рук пользователя. Если задано значение false, для определения необходимости скрытия подсказки будет использоваться только свойство скрипта customShouldHideVisuals.

  • MinDelay Это свойство указывает минимальную задержку отображения визуальных элементов. По умолчанию визуальные элементы для руки будут отображаться через это много секунд, если руки пользователя не отслеживаются.

  • MaxDelay Это свойство задает максимальную задержку отображения визуальных элементов. По умолчанию визуальные элементы для руки будут отображаться через это много секунд, даже если отслеживаются руки пользователя.

  • UseMaxTimer Если для этого логического значения задано значение false, он отключает максимальный таймер и позволяет отображать указание руки только в том случае, если руки пользователя находятся вне представления, или пользовательское условие возвращает значение false.

  • Повторяет Это свойство определяет, сколько раз воспроизводится анимация подсказки при прохождении минимального или максимального таймера. Затем подсказка скрывается и ожидает задержки еще раз.

  • Автоматическая активация Если для этого логического значения задано значение true, указание будет автоматически выполняться через логику таймера, когда GameObject скрипта активен в иерархии и скрипт включен. Это значение должно быть задано только в том случае, если вы планируете вручную контролировать внешний вид подсказки и исчезновение с помощью кода.

  • AnimationState Имя состояния анимации, которое должно воспроизводиться при активном указании. Это необходимо задать перед вызовом функции StartHintLoop() (во время OnEnable, если установлен флажок AutoActivate).

Управление InteractionHint с помощью скрипта

  • StartHintLoop Эта функция запускает цикл show/hide, который в противном случае запускает OnEnable, если для флага AutoActivate задано значение true.
  • StopHintLoop Эта функция вызывает состояние исчезания анимации, если оно в данный момент не воспроизводится, затем деактивирует цикл отображения и скрытия и задает неактивный режим ручной установки в иерархии.
  • AnimationState Эта строка определяет, какое состояние анимации воспроизводит во время цикла. Вы можете изменить эту строку, чтобы изменить воспроизведение состояния, но это необходимо сделать после вызова StopHintLoop, и после изменения состояния необходимо снова вызвать StartHintLoop.
  • CustomShouldHideVisuals Эту функцию можно задать с помощью собственной функции, которая должна возвращать значение true, если вы хотите скрыть визуальные элементы рук (имейте в виду MinMaxTimer, в частности, максимальный параметр).

Рекомендации по пользовательской анимации

Исчезание по умолчанию составляет 0,5 секунды, поэтому любые пользовательские анимации, созданные для использования с буровой установки, должны составлять не менее 1,5 секунды для передачи важных сведений.

Предоставленные по умолчанию состояния исчезания и исчезания, Fade_In и Fade_Out могут быть изменены путем изменения метки времени второго ключевого кадра, чтобы задать длину исчезания.

Аниматор и скрипт были настроены таким образом, чтобы сделать настройку максимально простой. Чтобы добавить новые состояния анимации, просто импортируйте fbx, убедитесь, что имя анимации задано с уникальным именем и перетащите ее в аниматор.

MoveToTarget

Скрипт MoveToTarget.cs предоставляет функциональные возможности для перемещения подсказки руки из позиции отслеживания в целевую позицию с течением времени.

Настройка MoveToTarget

Предоставленные префабы "MovingHandCoachRoot_L.prefab" и "MovingHandCoachRoot_R.prefab" содержат объект MoveToTarget в их иерархиях. Если вы хотите использовать этот скрипт на собственной настройке, необходимо поместить его в корневой игровой объект, содержащий аниматор для установки.

Свойства инспектора

  • TrackingObject Задайте его с объектом, который требуется выполнить, прежде чем он начнет движение. Рекомендуется создать пустой GameObject и переместить его в определенную позицию, чтобы помочь определить отслеживание.
  • TargetObject Задайте это с объектом, к которому требуется переместить буровую платформу во время его движения. Рекомендуется создать пустой GameObject и переместить его в определенную позицию, чтобы помочь определить отслеживание.
  • RootObject Задайте для него общий родительский объект для отслеживания и целевого объекта, чтобы относительные позиции можно было вычислить правильно. Включенный префаб содержит как отслеживание, так и целевые объекты в иерархии, но вы можете задать целевой объект как gameObject за пределами префаб и изменить корневой объект на общий родительский объект.
  • Длительность Время, необходимое (в секундах) для перехода из TrackingObject в TargetObject в секунды.
  • TargetOffset Настраиваемое смещение, чтобы получить GameObject, чтобы добраться до нужной целевой позиции. Это полезно, если анимация включает смещение позиции во время анимации.
  • AnimationCurve По умолчанию используется линейная кривая, но вы можете изменить кривую, чтобы обеспечить ослабление при запуске и остановке пути движения.

Управление MoveToTarget с помощью скрипта

В пользовательском скрипте выполните вызов в Follow(), когда вы хотите, чтобы ручная установка следила за TrackingObject, а затем выполните вызов MoveToTargetPosition(), если вы хотите, чтобы ручная установка начала движения к TargetObject.

Управление MoveToTarget с помощью анимаций

В анимации, необходимой для перемещения, задайте два события: один с вызовом Follow() и один с вызовом MoveToTargetPosition(). Следуйте указаниям в первом ключевом кадре, так как это приводит к тому, что ручная установка будет следовать за Приложением TrackingObject. MoveToTargetPosition должен быть установлен в ключевом кадре, в котором требуется, чтобы буровая установка начала переходить к целевому объекту. Вот как функции скрипта используются в предоставленных префабах.

RotateAroundPoint

Скрипт RotateAroundPoint.cs предоставляет функциональные возможности для поворота подсказки руки вокруг точки свертывания с течением времени.

Настройка RotateAroundPoint

Предоставленные префабы "RotatingHandCoachRoot_L.prefab" и "RotatingHandCoachRoot_R.prefab" содержат значение RotateAroundPoint в их иерархиях. Если вы хотите использовать этот скрипт на собственной настройке, необходимо поместить его в корневой игровой объект, содержащий аниматор для установки.

Свойства инспектора

  • CenteredParent Задайте его с родительским объектом, вокруг которого требуется развернуть буровую платформу.
  • InverseParent Установите это значение с родительским элементом для поворота обратно в центрedParent, чтобы сохранить ориентацию руки одинаково. Как правило, это родительский объект со сценарием InteractionHint.
  • Сводная положение Задайте для этого точку, в которой нужно, чтобы подсказка начала движения.
  • Длительность Время, которое должно занять (в секундах) для поворота вокруг CenteredParent.
  • AnimationCurve По умолчанию используется линейная кривая, но вы можете изменить кривую, чтобы обеспечить ослабление при запуске и остановке пути движения.
  • RotationVector Сколько градусов повернуть вдоль каждой оси.

Управление RotateAroundPoint с помощью скрипта

В пользовательском скрипте вызовите RotateToTarget(), если вы хотите, чтобы ручная установка начала поворота вокруг CenteredParent. Если вы хотите, чтобы позиция сброшена в исходную сводную позицию, выполните вызов ResetAndDeterminePivot().

Управление RotateAroundPoint с помощью анимаций

В анимации, необходимой для перемещения, задайте два события: один с вызовом ResetAndDeterminePivot() и один с вызовом RotateToTarget(). ResetAndDeterminePivot должен быть установлен на первом ключевом кадре, так как он приводит к сбросу ручной установки в сводную позицию. RotateToTarget должен быть установлен на ключевом кадре, где вы хотите, чтобы буровая установка начала поворота вокруг CenteredParent. Вот как функции скрипта используются в предоставленных префабах.