Реализация 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 + depth (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 из ладони/пальца → intersection с 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 недели. Стоимость рассчитывается индивидуально.







