Реалізація Hand Tracking в AR-додатку
Hand tracking — це відстеження рук та пальців без маркерів, через камеру. Самостійне управління AR-інтерфейсом, віртуальні музичні інструменти, навчальні додатки з хірургії чи механіки, AR-ігри де руки — контролер. Технічно складна задача: 21 joint на кожну руку, швидкі рухи, перекриття пальців, втрата трекінгу при поганому освітленні.
Платформенна ситуація
iOS: ARKit до iOS 18 не надавав публічний Hand Tracking API. Починаючи з visionOS 1.0 та iOS 18 / ARKit 6 — HandAnchor з HandSkeleton доступні у RealityKit. На iPhone працює через задню камеру. 26 joints на кожну руку.
До iOS 18 на iPhone — тільки сторонні ML-рішення. Після iOS 18 — нативний ARKit.
Android: ARCore не має hand tracking. MediaPipe Hands — стандарт на Android (і iOS, якщо потрібна крос-платформеність).
ARKit Hand Tracking (iOS 18+)
// iOS 18+, RealityKit
let session = ARKitSession()
let handTrackingProvider = HandTrackingProvider()
Task {
try await session.run([handTrackingProvider])
for await update in handTrackingProvider.anchorUpdates {
let handAnchor = update.anchor
guard handAnchor.isTracked else { continue }
// Позиція кінчика вказівного пальця
if let indexTip = handAnchor.skeleton.joint(named: .indexFingerTip) {
let worldTransform = handAnchor.originFromAnchorTransform * indexTip.anchorFromJointTransform
// Прив'язати об'єкт до кінчика пальця
}
}
}
На visionOS той же API, але з двома руками одночасно і без необхідності тримати пристрій.
MediaPipe Hands: крос-платформене рішення
MediaPipe Hand Landmark Task — 21 joint на кожну руку, до 2 рук одночасно. iOS + Android. Безплатно.
// Android
val handLandmarker = HandLandmarker.createFromOptions(context,
HandLandmarkerOptions.builder()
.setBaseOptions(BaseOptions.builder().setModelAssetPath("hand_landmarker.task").build())
.setNumHands(2)
.setMinHandDetectionConfidence(0.5f)
.setMinTrackingConfidence(0.5f)
.build()
)
val result = handLandmarker.detect(mpImage)
// result.landmarks() — List<List<NormalizedLandmark>>
// 21 точка на кожну руку у нормалізованих координатах [0..1]
21 joint у MediaPipe: WRIST, THUMB_CMC через THUMB_TIP, INDEX_FINGER_MCP через INDEX_FINGER_TIP, аналогічно для інших 4 пальців.
Для AR-прив'язки у 3D: нормалізовані 2D-координати → unproject через camera intrinsics + глибина (LiDAR або monocular depth estimation).
Розпізнавання жестів
Базові жести без ML — через геометрію joints:
Pinch (щипок): відстань між THUMB_TIP та INDEX_FINGER_TIP < поріг (звичайно 2–3 см у реальних координатах).
Відкрита ладонь: усі _TIP joints вище відповідних _MCP joints за Y-віссю.
Кулак: усі _TIP joints нижче _MCP за Y-віссю.
Victory (V-жест): index та middle _TIP вище _MCP, решта — нижче.
Складні жести (ASL алфавіт, кастомні комбінації) — CreateML GestureClassifier або TensorFlow Lite custom model. Навчання на 500–1000 зразках кожного жеста.
Взаємодія рук з AR-об'єктами
Picking об'єктів: ray з ладоні/пальця → перетин з AR-об'єктами. Pinch gesture = "схватити", розжати = "відпустити".
Деформація AR-об'єкта руками: дві руки одночасно → масштабування (відстань між ладонями), вращение (орієнтація вектора між ладонями).
Хірургічна симуляція: кончик пальця взаємодіє з віртуальними органами — collision detection між joint position та AR mesh. CollisionComponent + PhysicsBodyComponent у RealityKit для фізично коректної взаємодії.
Обмеження у реальних умовах
Трекінг пальців погіршується при перекритті (один палець за іншим — поширена ситуація). MediaPipe та ARKit обидва використовують 2.5D підхід — проблема самоперекриття не вирішена повністю.
Темний фон + темна шкіра рук — контрастність знижується, detection confidence падає. Мінімальне освітлення для стабільного трекінгу — 200 лк. Потрібен UI-індикатор при confidence < 0.5.
Latency: MediaPipe на середньому Android (Snapdragon 720G) — 35–45 мс на кадр. ARKit HandTracking на iPhone 15 — 15–20 мс. Для музичних інструментів різниця помітна.
Сроки
Базовий hand tracking з розпізнаванням pinch/open жестів на iOS 18+ (ARKit) — 1–2 тижні. Крос-платформене рішення на MediaPipe — 2–3 тижні. Кастомний класифікатор жестів з навчанням — плюс 2–3 тижні. Інтерактивна взаємодія рук з AR-об'єктами (picking, deformation) — плюс 2–4 тижні. Вартість розраховується індивідуально.







