Настройка трекинга рук и жестов в AR-играх
Когда пользователь видит свои реальные руки поверх AR-контента и может взаимодействовать с виртуальными объектами без контроллеров — это другой уровень иммерсии. Но под капотом это одна из самых технически нетривиальных задач в AR-разработке: трекинг 21 точки на каждой руке в реальном времени, распознавание жестов из непрерывного потока поз, и всё это при изменяющемся освещении, частичном перекрытии рук и движении устройства.
Аппаратная и программная основа
Для мобильного AR (iOS/Android) основной путь — AR Foundation с XRHandSubsystem, появившийся в AR Foundation 5.x. На iOS под капотом используется ARKit Hand Tracking (доступен с iPhone X на A12 и новее), на Android — ARCore, но с важным ограничением: ARCore не имеет встроенного hand tracking в основном SDK. Для Android hand tracking нужно либо использовать устройство с поддержкой Qualcomm Snapdragon Spaces, либо интегрировать сторонние решения — MediaPipe Hands (работает через плагин или нативную интеграцию) или XR Hands package от Unity с кастомным провайдером.
Для шлемов без контроллеров: Meta Quest 2/3 — через OVR Hand компоненты из Meta XR SDK или через OpenXR Hand Tracking Extension (XR_EXT_hand_tracking). Второй путь предпочтительнее для кроссплатформенных проектов — один код работает на Quest, Pico, HoloLens 2 без условных компиляций под каждый SDK.
HoloLens 2 — через Microsoft Mixed Reality Toolkit (MRTK3), который предоставляет абстракцию над WMR hand tracking и уже включает готовые компоненты для pinch, grab, poke-взаимодействий.
Почему жесты сложнее, чем кажется
Распознавание жестов — это не просто «проверить, сжата ли ладонь». Это классификация временного паттерна поз с учётом переходных состояний и шума трекинга.
Проблема первая: дрожание joints. Даже неподвижная рука даёт колебание позиций суставов на ±2–5 мм из-за шума сенсора. Если проверять жест «щипок» (pinch) по raw-позициям большого и указательного пальца — trigger будет срабатывать случайно. Решение: low-pass фильтр на позиции каждого joint (Kalman filter или простой exponential moving average с alpha ≈ 0.3–0.5) перед классификацией.
Проблема вторая: threshold hysteresis. Один порог для входа и выхода из состояния жеста — путь к мерцанию состояния. Правильно: порог для активации жеста (например, pinch_distance < 15 мм), и отдельный, более широкий порог для деактивации (pinch_distance > 25 мм). Это стандартная техника, но её часто забывают.
Проблема третья: temporal consistency. Жест должен удерживаться минимум N кадров (обычно 3–5 при 30 fps) перед тем, как считаться распознанным. Это фильтрует случайные совпадения при переходах между позами.
В XR Interaction Toolkit с XR Hands package есть HandShape и GestureDetector компоненты, которые реализуют часть этой логики. Но для нестандартных жестов (например, «нарисовать круг в воздухе» или «двойной щипок») нужна кастомная логика — конечный автомат или sequence recognizer с временными окнами.
Интеграция трекинга рук с игровыми объектами
После того как трекинг настроен, нужно привязать руки к игровой логике. Типичные взаимодействия в AR: near interaction (потрогать/нажать объект физически рукой) и far interaction (ray из ладони или пальца).
Для near interaction ключевой компонент — правильная настройка Poke Interactor из MRTK или кастомный коллайдер на кончике пальца с isTrigger = true. Главная проблема: скорость перемещения кончика пальца при быстром движении может быть такой, что за один фрейм он перемещается на 5–10 см, проходя сквозь тонкие объекты без срабатывания trigger. Решение: sweep test (SphereCast вдоль вектора движения пальца) вместо простого коллайдера.
Для AR-игр на мобильных устройствах важно учитывать, что рука периодически выходит из поля зрения камеры. Нужно реализовывать graceful degradation: при потере трекинга руки прерывать текущее взаимодействие корректно, а не оставлять объект «зависшим» в воздухе с последним известным позиционированием.
Этапы настройки
Начинаем с выбора SDK под целевые платформы и устройства. Это определяет 80% дальнейшей архитектуры.
Затем настройка базового hand tracking: импорт joints, визуализация скелета для отладки, проверка качества трекинга на целевых устройствах при разных условиях освещения.
Дальше: реализация жестов (начиная с pinch как базового interaction trigger), интеграция с interactable-объектами, тонкая настройка фильтров и thresholds.
Финальный этап — тестирование на реальных пользователях. Ни один разработчик не предугадает все варианты того, как люди держат руки.
| Задача | Ориентировочные сроки |
|---|---|
| Базовый hand tracking (pinch + grab) | 1–2 недели |
| Кастомный набор жестов (5–10 жестов) | 2–4 недели |
| Полная система взаимодействия без контроллеров | 4–8 недель |
Стоимость рассчитывается после анализа платформ и требуемых взаимодействий.





