Настройка распознавания жестов рук в Unity и Unreal для AR
Ложные срабатывания жестов — бич AR-игр. Рука дрожит, pinch срабатывает впустую, кулак распознаётся как open palm. В проекте на Meta Quest мы потратили две недели только на то, чтобы отсеять шум от 26 joint positions от Meta Hand Tracking SDK. Вот как мы решили эту задачу без переусложнения.
Что даёт платформа и что нужно строить самостоятельно
Meta Quest (через Meta Hand Tracking SDK или OpenXR Hand Interaction Extension) предоставляет 26 joint positions пальцев и запястья в мировых координатах, обновляемых с частотой 30–60 Hz. Это сырые данные — позиции костей. ARKit (iOS, через AR Foundation) с Vision framework даёт аналогичный набор hand landmarks через ARHandTrackingConfiguration, доступный с iOS 18. На Android через ARCore прямого Hand Tracking API нет — используются сторонние решения (MediaPipe через ML Kit) или Google ARCore Geospatial + кастомная ML модель. Из коробки вы получаете данные, но не жесты. Распознавание жестов — ваша задача.
Как строится gesture recognizer
Каждый жест — это набор условий над joint positions:
-
Pinch (щипок): расстояние между
ThumbTipиIndexTip< threshold (обычно 2–3 см в мировых единицах). Плюс дополнительная проверка:MiddleTip,RingTip,PinkyTipдалеко от большого пальца (открыты). Без второго условия кулак ложно срабатывает как pinch. -
Open Palm: все fingertip joints на значительном расстоянии от
Palmjoint. ПроверяемVector3.Distance(fingertip, palm) > openThresholdдля всех пяти пальцев. Дополнительно — нормаль ладони (вектор от Palm к Middle Metacarpal) должна смотреть примерно в сторону камеры, иначе открытая ладонь сзади тоже сработает. -
Point (указательный жест):
IndexTipвытянут (большое расстояние отIndexMetacarpal), остальные пальцы согнуты (малое расстояние tip→metacarpal). Плюс угол между векторомIndexProximal → IndexTipи вектором ладони.
Почему важен debounce и confidence фильтр?
Рука естественно дрожит — ThumbTip и IndexTip могут случайно сближаться и расходиться быстрее, чем 1 кадр. Без debounce pinch срабатывает 5 раз в секунду при попытке сделать его один раз. Стандартная техника: state machine с временным порогом. Жест считается активным, только если условие выполнялось непрерывно минимум N кадров (или T секунд). Значения: 3–5 кадров для быстрых жестов, 10–15 кадров (≈ 0.2 с при 60 Hz) для статических поз типа Open Palm. Дополнительно — confidence фильтр. Meta Hand Tracking SDK предоставляет OVRHand.HandConfidence — при низкой достоверности трекинга (рука частично вне поля зрения, плохое освещение) жесты не обрабатываются. Это критично для AR на смартфоне, где условия съёмки непредсказуемы.
Как интегрировать жесты в AR Foundation?
В AR Foundation (Unity) Hand Tracking подключается через XRHandSubsystem (пакет com.unity.xr.hands). XRHandJoint для каждого joint даёт TryGetPose() — позицию и ротацию в пространстве. Gesture recognizer подписывается на XRHandSubsystem.handsUpdated event и обрабатывает данные в колбэке. Важно не делать heavy computation в этом колбэке — он может вызываться не в main thread. Либо буферизовать данные и обрабатывать в Update, либо использовать Job System с IJobParallelFor для многорукого распознавания. Для MediaPipe на Android — отдельная интеграция через Native Plugin или готовые обёртки (mediapipe-unity-plugin), данные приходят через callback с ML‑результатами.
Типичные жесты и их пороги
| Жест | Условие | Порог | Время удержания |
|---|---|---|---|
| Pinch | distance ThumbTip-IndexTip < threshold | 2–3 см | 3 кадра |
| Open Palm | all fingertips far from palm, palm normal facing camera | openThreshold 4–5 см | 10–15 кадров |
| Point | IndexTip extended, others curled | distance > 3 см | 3–5 кадров |
| Fist | all fingertips close to palm | distance < 2 см | 5–10 кадров |
| Swipe | velocity of palm > 0.5 м/с | — | 2 кадра |
Что входит в настройку распознавания жестов?
| Этап | Что делаем | Результат |
|---|---|---|
| Аналитика | Выбор SDK, платформы, списка жестов | Техническая спецификация |
| Прототип | Базовый recognizer для 3–5 жестов | Демо на целевой платформе |
| Продакшен | Анимации, дебаунс, фильтры, конфигурация | SDK для встраивания в игру |
| Тестирование | QA на разных устройствах, UX‑тесты | Отчёт и устранение багов |
| Документация | Интеграционный гайд, примеры кода | Wiki или pdf |
Сроки и бюджет
Сроки: от 3–5 рабочих дней на базовый прототип до 2–3 недель на полноценную систему с 10+ жестами, дебаунсом и confidence‑фильтром. Бюджет проекта рассчитывается индивидуально, зависит от сложности и количества платформ. Для точной оценки свяжитесь с нами.
Как начать?
Чтобы оценить объём работы, пишите — мы проанализируем ваш проект и предложим решение. Опыт в AR — более 7 лет, реализовали жесты для 15 проектов на Meta Quest и iOS.
Подробнее про Meta Hand Tracking SDK и OpenXR Hand Interaction. Обращайтесь — получите консультацию инженера.






