Если коротко:

Для hand tracking в Unity через OpenXR установите совместимые версии OpenXR Plugin и XR Hands, включите OpenXR для целевой платформы и функцию Hand Tracking. Данные приходят через XRHandSubsystem: проверяйте, что subsystem запущена, рука отслеживается, а конкретный сустав имеет валидную pose. Поддержка зависит от OpenXR runtime и устройства, поэтому оставляйте управление контроллерами как fallback.

Unity OpenXR hand tracking использует OpenXR Plugin для связи с runtime и XR Hands как API кистей. Runtime должен поддерживать XR_EXT_hand_tracking, а приложение — проверять данные.

Какие пакеты и версии нужны

Для Unity 6000.0 проверены XR Hands 1.7.3 и OpenXR Plugin 1.16.1. Для иной версии сверяйтесь с Package Manager.

Минимальный набор:

  • XR Plug-in Management и OpenXR Plugin как provider;
  • XR Hands для XRHandSubsystem и joints;
  • Input System, а для готовых взаимодействий — XR Interaction Toolkit.

XR Hands не получает data от камер: provider реализует subsystem. Основа проекта разобрана в материале Unity и OpenXR, взаимодействия — в руководстве по XR Interaction Toolkit.

Настройка проекта

  1. Через Package Manager установите XR Hands и OpenXR Plugin.
  2. Для целевой платформы активируйте OpenXR в разделе управления XR-плагинами.
  3. В OpenXR Features включите Hand Tracking и исправьте ошибки Project Validation.
  4. Оставьте нужные controller profiles для резервного ввода.
  5. Импортируйте sample HandVisualizer. Его skeleton соответствует joint layout OpenXR, но не заменяет логику приложения.

Hand Tracking Feature обновляет XRHandSubsystem. Meta Aim Hand добавляет aim и pinch, но доступен не в каждом runtime.

Как читать данные кисти и суставов

Получите работающий XRHandSubsystem через SubsystemManager.GetSubsystems и подпишитесь на updatedHands. Dynamic update подходит для логики interaction, BeforeRender — для визуального положения с меньшей задержкой.

Кисти доступны как leftHand и rightHand. Проверьте XRHand.isTracked, получите joint через GetJoint(XRHandJointID.IndexTip) и вызовите TryGetPose. false означает невалидную pose либо неподдерживаемую точку. Случаи различают trackingState, jointsInLayout и update flags.

Стандарт OpenXR описывает 26 точек на руку: wrist, palm, суставы и fingertips. Runtime может вернуть pose и radius. Это tracking data, а не модель: XRHandSkeletonDriver переносит позы на Transform-иерархию, mesh лишь рисует руку.

Жесты и interaction

Щипок определяйте по расстоянию между thumb tip и index tip, валидности pose и устойчивости условия. Разные границы включения и выключения уменьшают дребезг.

Для UI и захвата объектов hand data связывают с XRI-interactors. Tracking, gesture и interaction остаются разными слоями: потеря joint не должна вызывать случайный Select. Базовая модель описана в статье OpenXR hand tracking.

Runtime support и fallback на контроллеры

Проверяйте сборку на каждой заявленной гарнитуре: активный OpenXR loader не доказывает поддержку кистей. Если subsystem отсутствует, не запущена, isTracked равен false или joints невалидны, скройте hand interactor и включите controller interactor без перезапуска сцены.

Используйте состояния Hands active, Controllers active и No tracked input. В последнем покажите подсказку, а критичным действиям дайте кнопку. Fallback покрывает выход рук из поля камер и runtime без расширения, не выдавая временную потерю tracking за отказ сцены.

Проверка по шагам

Настройка проекта

Выполнено 0 из 5

0 из 5
Поделиться:TelegramВКонтакте

Источники

  1. Unity — XR Hands 1.7
  2. Unity — Hand tracking OpenXR feature
  3. Unity — Access hand data
  4. Khronos — XR_EXT_hand_tracking