Отслеживание рук OpenXR
Введение
Примечание
Эта страница посвящена функционалу, предоставляемому OpenXR. Некоторые из представленных здесь функций также применимы к WebXR и могут быть реализованы другими интерфейсами XR.
При обсуждении отслеживания рук важно понимать, что существуют различные мнения относительно того, где проводить границы. Практическим результатом этого являются различия в реализации между различными средами выполнения OpenXR. Вы можете оказаться в ситуации, когда выбранное оборудование не поддерживает какую-либо часть головоломки или работает настолько иначе, чем другие платформы, что вам потребуется дополнительная работа.
Тем не менее, недавние улучшения спецификации OpenXR закрывают эти пробелы, и по мере того, как платформы реализуют эти улучшения, мы приближаемся к будущему, в котором у нас будет либо полная переносимость между платформами, либо, по крайней мере, четкий способ определения возможностей платформы.
На заре развития виртуальной реальности основное внимание основных платформ уделялось отслеживанию ввода с помощью контроллера. Здесь мы отслеживаем физическое устройство, также имеющее кнопки для дальнейшего ввода. По данным отслеживания мы можем определить положение рук игрока, но никакой дополнительной информации нет. Традиционно игра реализовывала механизм отображения руки игрока и анимации пальцев в зависимости от дальнейших действий с контроллера, будь то нажатие кнопок или датчики приближения. Часто положение пальцев также определяется контекстом, предметом в руках пользователя и выполняемым им действием.
В последнее время оптическое отслеживание рук стало популярным решением, при котором камеры отслеживают руки пользователя, и становятся доступны полные данные о положении рук и пальцев. Многие разработчики рассматривали этот подход как нечто совершенно отдельное от отслеживания контроллеров и внедрили независимые API для доступа к данным о положении рук и пальцев, а также об их ориентации. При обработке ввода разработчику игры приходилось реализовывать механизм распознавания жестов.
Такое разделение существует и в OpenXR, где отслеживание контроллера в основном осуществляется системой карты действий, тогда как оптическое отслеживание руки в основном осуществляется расширением API отслеживания руки.
Однако мир не такой уж черно-белый, и мы видим ряд сценариев, в которых мы пересекаем черту:
Устройства, подпадающие под обе категории, такие как отслеживаемые перчатки и контроллеры, такие как контроллер Index, которые также отслеживают движения пальцев.
Среды выполнения XR, реализующие отслеживание положения рук на основе данных контроллера в качестве средства для определения правильного расположения пальцев для нескольких контроллеров.
Приложения XR, которые хотят плавно переключаться между отслеживанием контроллера и рук, обеспечивая одинаковый пользовательский опыт независимо от используемого подхода.
OpenXR отвечает на этот вызов, предлагая дополнительные расширения, позволяющие нам запрашивать возможности среды выполнения /аппаратного обеспечения XR или расширять функциональность, преодолевая этот разрыв. Проблема, которая в настоящее время сохраняется, заключается в том, что существуют пробелы в применении этих расширений, и некоторые платформы не предоставляют информацию о возможностях в полном объёме. В связи с этим может потребоваться тестирование функций, доступных на конкретном оборудовании, и соответствующая корректировка вашего подхода.
Демонcтрационный проект
Информация, представленная на этой странице, была использована для создания демонстрационного проекта, который можно найти здесь.
API отслеживания рук
Как упоминалось во введении, API отслеживания рук в основном используется для оптического отслеживания рук и на многих платформах работает только тогда, когда пользователь не держит контроллер. Некоторые платформы поддерживают отслеживание рук по контроллеру, что означает, что данные будут получены, даже если пользователь держит контроллер. К ним относятся SteamVR, Meta Quest (пока только нативная поддержка, но поддержка Meta Link, вероятно, появится), а вскоре, возможно, и другие.
Реализация отслеживания рук в Godot стандартизирована на основе Godot Humanoid Skeleton и работает как в OpenXR, так и в WebXR. Таким образом, инструкции ниже будут работать в обеих средах.
Чтобы использовать API отслеживания рук в OpenXR, необходимо сначала включить его. Это можно сделать в настройках проекта:
Для некоторых автономных устройств XR также необходимо настроить расширение отслеживания рук в настройках экспорта, например для Meta Quest:
Теперь вам нужно добавить в сцену по 3 компонента для каждой руки:
Отслеживаемый узел для позиционирования руки.
Правильно обработанная сетка руки со скелетом.
Модификатор скелета, который применяет данные отслеживания пальцев к скелету.
Узел отслеживания рук
Система отслеживания рук использует отдельные трекеры для отслеживания положения рук игрока в пределах пространства отслеживания.
Эта информация была разделена для следующих вариантов использования:
Отслеживание происходит в локальном пространстве узла XROrigin3D. Для корректного размещения этот узел должен быть дочерним по отношению к узлу XROrigin3D.
Этот узел можно использовать в качестве цели IK, когда вместо отдельных сеток кистей рук используется сетка верхней части тела с руками.
Фактическое размещение рук может быть слабо связано с отслеживанием в таких сценариях, как пользовательские интерфейсы создания аватара, поддельные зеркала или аналогичные ситуации, в результате чего сетка руки и отслеживание пальцев локализуются в другом месте.
Мы сосредоточимся только на первом варианте использования.
Для этого вам необходимо добавить узел XRNode3D к вашему узлу XROrigin3D.
На этом узле
trackerдолжен быть установлен на/user/hand_tracker/leftили/user/hand_tracker/rightдля левой или правой руки соответственно.
poseследует оставить на уровнеdefault, никакой другой вариант здесь не подойдет.Флажок
Show When Trackedавтоматически скроет этот узел, если данные отслеживания недоступны, или сделает этот узел видимым, если данные отслеживания доступны.
Полигональная сетка для рук с Rigged
Для отображения руки нам нужна правильно настроенная и скинированная модель руки. Для этого Godot использует структуру костей руки, как определено для Godot Humanoid, но опционально поддерживает дополнительную кость кончика каждого пальца.
Демонстрационная версия отслеживания рук OpenXR <https://github.com/godotengine/godot-demo-projects/tree/master/xr/openxr_hand_tracking_demo>`_ содержит примеры файлов glTF с правильно настроенными руками.
Мы будем использовать их здесь и добавим в качестве дочерних элементов к нашему узлу XRNode3D. Также нам нужно разрешить редактирование дочерних элементов для доступа к нашему узлу Skeleton3D.
Модификатор скелета руки
Наконец, нам нужно добавить узел XRHandModifier3D в качестве дочернего к нашему узлу Skeleton3D. Этот узел будет получать данные отслеживания пальцев из OpenXR и применять их к модели руки.
Вам необходимо установить свойство Hand Tracker на /user/hand_tracker/left или /user/hand_tracker/right в зависимости от того, применяем ли мы данные отслеживания левой или правой руки соответственно.
Вы также можете установить режим Bone Update на этом узле.
Fullприменяет данные отслеживания рук в полном объёме. Это означает, что положение скелета потенциально будет отражать размер реальной руки пользователя. Это может привести к эффекту сжатия, если сетки не будут правильно взвешены с учётом этого. Обязательно протестируйте игру с игроками всех размеров при использовании оптического отслеживания рук!
Rotation Onlyприменяет вращение только к костям рук, сохраняя длину костей. В этом режиме размер сетки руки не меняется.
После добавления этого параметра при запуске проекта мы должны увидеть корректное отображение руки, если поддерживается отслеживание руки.
Источник данных отслеживания рук
Это расширение OpenXR, предоставляющее информацию об источнике данных отслеживания рук. В настоящее время оно реализовано лишь в нескольких средах выполнения, но если оно доступно, Godot его активирует.
Если это расширение не поддерживается и, следовательно, возвращается неизвестное значение, можно сделать следующие предположения:
Если вы используете SteamVR (включая Steam Link), поддерживается только отслеживание рук на основе контроллера.
Для любой другой среды выполнения, если поддерживается отслеживание рук, поддерживается только оптическое отслеживание рук (обратите внимание, Meta Link в настоящее время попадает в эту категорию).
Во всех остальных случаях отслеживание рук вообще не поддерживается.
Вы можете получить доступ к этой информации с помощью кода:
var hand_tracker : XRHandTracker = XRServer.get_tracker('/user/hand_tracker/left')
if hand_tracker:
if hand_tracker.has_tracking_data:
if hand_tracker.hand_tracking_source == XRHandTracker.HAND_TRACKING_SOURCE_UNKNOWN:
print("Hand tracking source unknown")
elif hand_tracker.hand_tracking_source == XRHandTracker.HAND_TRACKING_SOURCE_UNOBSTRUCTED:
print("Hand tracking source is optical hand tracking")
elif hand_tracker.hand_tracking_source == XRHandTracker.HAND_TRACKING_SOURCE_CONTROLLER:
print("Hand tracking data is inferred from controller data")
else:
print("Unknown hand tracking source ", hand_tracker.hand_tracking_source)
else:
print("Hand is currently not being tracked")
else:
print("No hand tracker registered")
В этом примере регистрируется состояние левой руки.
Если в этом примере get_tracker не возвращает отслеживание рук, это означает, что API отслеживания рук вообще не поддерживается в среде выполнения XR.
Если трекер есть, но has_tracking_data имеет значение false, рука пользователя в данный момент не отслеживается. Вероятно, это вызвано одной из следующих причин:
Рука игрока не видна ни одной из камер слежения на гарнитуре
В данный момент игрок использует контроллер, а гарнитура поддерживает только оптическое отслеживание рук
Контроллер выключен, поддерживается только отслеживание движений руки контроллера.
Обработка пользовательского ввода
Реакция на действия пользователя осуществляется через Карта действий XR при использовании контроллеров. На карте действий можно сопоставить различные входные сигналы, например, нажатие на триггер или джойстик на контроллере, с действием. Это затем может управлять логикой вашей игры.
При использовании отслеживания рук изначально таких входов не было, и ввод управлялся жестами пользователя, например, сжатием кулака для захвата или сведением большого и указательного пальцев для выбора чего-либо. Реализация этого была задачей разработчика игры.
Учитывая растущий спрос на приложения, способные плавно переключаться между отслеживанием контроллера и рук, а также потребность в базовых возможностях ввода, в спецификацию был добавлен ряд расширений, которые обеспечивают базовое распознавание жестов и могут использоваться с картой действий.
Профиль взаимодействия рук
Расширение профиля взаимодействия рук — это новое базовое расширение, поддерживающее жесты сжатия, захвата и тыкания, а также связанные с ними позы. Поддержка этого расширения пока ограничена, но в ближайшем будущем оно должно стать доступным в большем количестве сред выполнения.
Жест "pinch" (щипок) активируется сведением большого и указательного пальцев вместе. Он часто используется для выбора в системах меню, подобно тому, как если бы вы указывали на объект с помощью контроллера и нажимали на триггер для его выбора, и поэтому часто отображается соответствующим образом.
pinch pose— это поза, при которой палец располагается посередине между кончиком большого пальца и кончиком указательного пальца и ориентирован таким образом, что с помощью луча можно определить цель.Плавающее входное значение
pinch- это значение от 0,0 (кончики большого и указательного пальцев раздвинуты) до 1,0 (кончики большого и указательного пальцев соприкасаются).Вход
pinch readyсчитается истинным, когда кончики пальцев (почти) соприкасаются.
Жест хватания активируется сжатием кулака и часто используется для подъема предметов, аналогично активации функции сжатия на контроллерах.
Входной параметр
graspс плавающей точкой представляет собой значение от 0,0 (открытая ладонь) до 1,0 (кулак).Вход
grasp readyстановится истинным, когда пользователь сжимает кулак.
Жест "poke" (тычёк) активируется вытягиванием указательного пальца. Этот жест — небольшое исключение, поскольку поза кончика указательного пальца часто используется для тыканья во интерактивный объект. Poke pose (Поза тыканья) — поза, при которой опора делается на кончик указательного пальца.
Наконец, вход aim activate (ready) определяется как вход, который принимает значение "1.0/true", когда указательный палец вытянут и указывает на цель, которую можно активировать. Как это интерпретируется средой выполнения, неясно.
При такой настройке используются обычные трекеры left_hand и right_hand, и вы можете легко переключаться между контроллером и отслеживанием руки.
Примечание
Вам необходимо включить расширение профиля взаимодействия рук в настройках проекта OpenXR.
Профиль взаимодействия рук Microsoft
Расширение профиля взаимодействия рук Microsoft было представлено компанией Microsoft и в общих чертах имитирует простой профиль контроллера. Meta также добавила поддержку этого расширения, но только в своём собственном клиенте OpenXR; в настоящее время оно недоступно через Meta Link.
Поддержка сжатия доступна через вход select, значение которого равно 0,0, когда кончики большого и указательного пальцев раздвинуты, и 1,0, когда они вместе.
Обратите внимание, что в этом профиле aim pose переопределена как поза между большим и указательным пальцами, ориентированная таким образом, чтобы можно было использовать луч для определения цели.
Поддержка захвата осуществляется через вход squeeze, значение которого равно 0,0, когда ладонь открыта, и 1,0, когда ладонь сжата в кулак.
При такой настройке используются обычные трекеры left_hand и right_hand, и вы можете легко переключаться между контроллером и отслеживанием руки.
Профиль взаимодействия рук HTC
Расширение профиля взаимодействия рук HTC было представлено компанией HTC и определено аналогично расширению Microsoft. Оно поддерживается HTC только для гарнитур Focus 3 и Elite XR.
Информацию о поддержке жестов см. в профиле взаимодействия рук Microsoft.
Главное отличие заключается в том, что это расширение добавляет два новых трекера: /user/hand_htc/left и /user/hand_htc/right. Это означает, что необходимо реализовать дополнительную логику для переключения между трекерами по умолчанию и трекерами HTC, когда пользователь кладёт или поднимает контроллер.
Простой профиль контроллера
Простой профиль контроллера — это стандартный основной профиль, определяемый как резервный профиль, когда используется контроллер, для которого не существует профиля.
Существует ряд сред выполнения OpenXR, которые имитируют контроллеры с помощью простого профиля контроллера при использовании отслеживания рук.
К сожалению, нет надежного способа определить, используется ли неизвестный контроллер или отслеживание рук эмулирует контроллер через этот профиль.
Среды выполнения XR могут свободно определять, как работает простой профиль контроллера, поэтому нет никакой определенности в том, как этот профиль сопоставляется с жестами.
Наиболее распространенное сопоставление, по-видимому, состоит в том, что select click будет истинным, когда кончики большого и указательного пальцев соприкасаются, а ладонь пользователя обращена от пользователя. menu click будет истинным, когда кончики большого и указательного пальцев соприкасаются, а ладонь пользователя обращена к пользователю.
При такой настройке используются обычные трекеры left_hand и right_hand, и вы можете легко переключаться между контроллером и отслеживанием руки.
Примечание
Поскольку некоторые из этих профилей взаимодействия перекрываются, важно знать, что вы можете добавить каждый профиль на свою карту действий, а среда выполнения XR выберет наиболее подходящий профиль.
Например, Meta Quest поддерживает как профиль взаимодействия рук Microsoft, так и профиль простого контроллера. Если указаны оба профиля, приоритет будет отдан профилю взаимодействия рук Microsoft.
Ожидается, что как только Meta начнет поддерживать расширение основного профиля взаимодействия с рукой, этот профиль будет иметь приоритет над профилями Microsoft и простыми профилями контроллеров.
Ввод с помощью жестов
Если платформа не поддерживает какие-либо профили взаимодействия при отслеживании рук или если вы создаете приложение, в котором требуется более сложная поддержка жестов, вам придется создать собственную систему распознавания жестов.
Полные данные отслеживания движений рук можно получить через ресурс XRHandTracker для каждой руки. Получить данные отслеживания движений рук можно, вызвав XRServer.get_tracker и указав /user/hand_tracker/left или /user/hand_tracker/left в качестве трекера. Этот ресурс предоставляет доступ ко всей информации о суставах для данной руки.
Подробное описание полного алгоритма распознавания жестов выходит за рамки данного руководства, однако есть ряд проектов сообщества, с которыми вы можете ознакомиться: