Налаштування розпізнавання жестів рук для керування в AR іграх
Управління жестами в AR – це коли гра відповідає на форму руки, а не на натиск кнопки. Відкрита ладонь викликає меню. Щипок вибирає об'єкт. Сжатий кулак – атака. Звучить як магія, реалізується як математика над joint positions.
Що дає платформа й що потрібно будувати самостійно
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 на значній відстані від Palm joint. Перевіряємо Vector3.Distance(fingertip, palm) > openThreshold для всіх п'яти пальців. Додатково – нормаль ладні (вектор від Palm до Middle Metacarpal) повинна дивитись приблизно на камеру, інакше відкрита ладонь ззаду теж спрацює.
Point (указівний жест): IndexTip витягнут (велика відстань від IndexMetacarpal), інші пальці згнуті (мала tip→metacarpal відстань). Плюс кут між вектором IndexProximal → IndexTip та вектором ладні.
Це не магія – просто кілька distance checks та dot products в Update().
Debounce та запобігання помилковим спрацюванням
Жести потрібно debounce. Рука природно дрижить – 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 та обробляє дані у колбеку.
Важливо не робити тяжких обчислень у цьому колбеку – він може викликатися не в main thread. Або буферизовувати дані та обробляти в Update, або використовувати Job System з IJobParallelFor для багаторукого розпізнавання.
Для MediaPipe на Android – окрема інтеграція через Native Plugin або готові обертки (mediapipe-unity-plugin), дані приходять через callback з ML-результатами.
Терміни: базові 3–5 жестів на Meta SDK – 3–5 робочих днів; повна система з debounce, confidence filter та 10+ жестами для AR Foundation – 1–2 тижні. Вартість визначається індивідуально.





