Если коротко:
WebXR hand tracking запрашивают как функцию `hand-tracking` при создании immersive-сессии. После согласия пользователя совместимый браузер добавляет источники ввода с объектом XRHand; позы 25 суставов читаются из XRFrame относительно выбранного пространства. Если функция, устройство или текущий кадр не дают данные руки, интерфейс должен продолжать работать с контроллерами.
WebXR hand tracking передаёт браузерной VR-сцене позы суставов рук. Браузер проверяет устройство, запрашивает согласие пользователя и может открыть сессию без данных рук. Поэтому контроллеры остаются запасным способом управления.
Как запросить функцию
Сначала проверьте navigator.xr и поддержку режима через isSessionSupported("immersive-vr"). Затем запросите руки как необязательную функцию:
const session = await navigator.xr.requestSession("immersive-vr", {
optionalFeatures: ["hand-tracking"]
});
optionalFeatures позволяет открыть сцену без hand input. requiredFeatures уместен, если без рук она бесполезна, но запрос может завершиться отказом. Hand tracking доступен в immersive-vr и immersive-ar, не в inline-сессии.
Что находится в XRHand
В каждом кадре переберите session.inputSources. У источника руки inputSource.hand содержит XRHand, упорядоченную карту из 25 суставов: запястье, сегменты пальцев и кончики. Для нужного XRJointSpace вызовите frame.getJointPose(joint, referenceSpace). Результат содержит transform и приблизительный radius сустава.
Поза может быть null при потере наблюдения, поэтому жест нельзя строить на старых данных. Для множества суставов предусмотрены fillPoses() и fillJointRadii().
Разрешения, проверка и fallback
W3C требует согласия на сенсорные данные при создании сессии. Наличие XRHand в MDN или JS-движке не доказывает поддержку связки браузера и гарнитуры. После запуска у входного источника должен быть hand, а XRFrame должен возвращать позы.
Сохраните обработчики select и модели контроллеров. Кнопка, захват и навигация должны работать без распознавания пальцев; при исчезновении руки интерфейс переключается на доступный XRInputSource, не блокируя сцену. База WebXR описана в статье «WebXR: что это такое», а различия суставов и жестов на уровне runtime приведены в «OpenXR hand tracking extension».