Як налаштувати розпізнавання жестів рук у 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та вектором долоні.
Для порівняння, Unity AR Foundation з XRHandSubsystem забезпечує вдвічі швидшу обробку, ніж MediaPipe на Android, завдяки оптимізованим Native API.
Чому важливий 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 на смартфоні, де умови зйомки непередбачувані. Для додаткового згладжування застосовуємо low-pass фільтр на quaternion суглобів.
Як інтегрувати жести в 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‑фільтром. Бюджет проєкту розраховується індивідуально, залежить від складності та кількості платформ. Для точної оцінки зв'яжіться з нами. Приклад вартості: базовий прототип (3–5 жестів) — від 500$, продакшен-система з 10+ жестами та повним тестуванням — від 3000$.
Як почати?
Щоб оцінити обсяг роботи, пишіть — ми проаналізуємо ваш проєкт і запропонуємо рішення. Ми гарантуємо якість — кожен проєкт проходить сертифіковане тестування. Наша команда має 7+ років досвіду в AR та 15 реалізованих проєктів з жестами. На ринку з 2018 року.
Докладніше про Meta Hand Tracking SDK та OpenXR Hand Interaction. Звертайтеся — отримайте консультацію інженера.






