Система отслеживания рук использует ладони и пальцы человека в качестве входных данных. Доступны данные о положении и повороте каждого пальца, всей ладони и жестов руки. Начиная с Unreal 4.26, отслеживание рук основано на подключаемом модуле Unreal HeadMountedDisplay и использует общий API на всех платформах XR и устройствах. Функциональные возможности одинаковы для систем Windows Mixed Reality и OpenXR.
Положение руки
Положение руки позволяет отслеживать и использовать руки и пальцы пользователей в качестве входных данных, доступ к которым можно получить как в Схемах, так и в C++. Api Unreal отправляет данные в виде системы координат с тактами, синхронизированными с Unreal Engine.
Все эти данные можно получить из рук пользователя с помощью функции Получить данные контроллера движения . Эта функция возвращает структуру XRMotionControllerData . Ниже приведен пример скрипта схемы, который анализирует структуру XRMotionControllerData для получения расположений совместного расположения рук и рисует отладочную систему координат в расположении каждого соединения.
Важно проверка, является ли структура допустимой и что это рука. В противном случае вы можете получить неопределенное поведение при доступе к позициям, поворотам и массивам радиусов.
Перечисление EWMRHandKeypoint описывает иерархию кости Руки. Вы можете найти каждую ключевую точку руки, указанную в схеме:
Для возврата пространственных данных из руки можно использовать GetHandJointTransform . Данные обновляют каждый кадр, но если вы находитесь внутри кадра, возвращаемые значения кэшируются. Не рекомендуется использовать в этой функции логику высокой нагрузки из соображений производительности.
Ниже приведена разбивка параметров функции GetHandJointTransform:
Рука — может быть левой или правой рукой пользователя.
Ключевая точка — кость руки.
Преобразование — координаты и ориентация основания кости. Вы можете запросить основание следующей кости, чтобы получить данные преобразования для конца кости. Специальный кончик кости дает конец дистальности.
**Радиус — радиус основания кости.
**Возвращаемое значение — true, если кость отслеживается в этом кадре, значение false, если кость не отслеживается.
Если включены подключаемые модули Windows Mixed Reality и Live Link:
Выберите Окно > Динамическая ссылка , чтобы открыть окно редактора Live Link.
Выберите Источник и включите Windows Mixed Reality источник отслеживания рук.
После включения источника и открытия ресурса анимации разверните раздел Анимация на вкладке Предварительный просмотр сцены , чтобы просмотреть дополнительные параметры.
Иерархия анимации рук такая же, как и в EWMRHandKeypoint. Анимацию можно перенацелить с помощью WindowsMixedRealityHandTrackingLiveLinkRemapAsset:
Его также можно классифицировать в редакторе:
Сетка рук
Важно!
Для ручной сетки требуется OpenXR.
Необходимо использовать подключаемый модуль Microsoft OpenXR, доступный в Unreal Marketplace или GitHub.
Ручная сетка как отслеживаемая геометрия
Важно!
Чтобы получить сетки рук в виде отслеживаемой геометрии в OpenXR, необходимо вызвать команду Set Use Hand Mesh with Enabled Tracking Geometry.
Чтобы включить этот режим, необходимо вызвать команду Set Use Hand Mesh with Enabled Tracking Geometry (Задать использование ручной сетки с включенной геометрией отслеживания):
Примечание
Невозможно включить оба режима одновременно. Если один из них включен, другой автоматически отключается.
Доступ к данным сетки рук
Прежде чем получить доступ к данным сетки рук, необходимо выполнить следующие действия:
Выберите ресурс ARSessionConfig, разверните параметры AR Settings — World Mapping (Параметры AR —> сопоставление мира) и проверка Создать данные сетки из отслеживаемой геометрии.
Ниже приведены параметры сетки по умолчанию.
Использование данных сетки для окклюзии
Создание конфликтов для данных сетки
Создание сетки навигации для данных сетки
Отрисовка данных сетки в каркасе — параметр отладки, отображающий созданную сетку
Эти значения параметров используются в качестве сетки пространственного сопоставления и сетки рук по умолчанию. Их можно изменить в любое время в разделе Схемы или код для любой сетки.
Справочник по API C++
Используется EEARObjectClassification для поиска значений сетки рук во всех отслеживаемых объектах.
enum class EARObjectClassification : uint8
{
// Other types
HandMesh,
};
Следующие делегаты вызываются, когда система обнаруживает любой отслеживаемый объект, включая сетку рук.
class FARSupportInterface
{
public:
// Other params
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};
Убедитесь, что обработчики делегатов соответствуют сигнатуре функции ниже:
Затем в редакторе схем следует использовать функцию Set Use Hand Mesh из подключаемого модуля Microsoft OpenXR с включенной XRVisualization в качестве параметра:
Для управления процессом отрисовки следует использовать контроллер движения отрисовки из XRVisualization:
Получаются такие результаты:
Если вам нужно что-то более сложное, например рисование ручной сетки с помощью пользовательского шейдера, необходимо получить сетки в виде отслеживаемой геометрии.
Лучи рук
Получение позиции руки работает для близкого взаимодействия, например захвата объектов или нажатия кнопок. Однако иногда приходится работать с голограммами, которые находятся далеко от пользователей. Это можно сделать с помощью лучей рук, которые можно использовать в качестве указывающих устройств в C++ и Blueprints. Вы можете нарисовать луч из руки в дальней точке и с помощью трассировки лучей Unreal выбрать голограмму, которая в противном случае была бы недоступна.
Важно!
Так как все результаты функции изменяют каждый кадр, все они стали вызываемыми. Дополнительные сведения о чистых и нечистых или вызываемых функциях см. в разделе Guid пользователя схемы в функциях.
Чтобы получить данные для лучей рук, следует использовать функцию Получить данные контроллера движения из предыдущего раздела. Возвращаемая структура содержит два параметра, которые можно использовать для создания луча руки: положение цели и поворот цели. Эти параметры образуют луч, направленный на локоть. Вы должны взять их и найти голограмму, на которую указывает.
Ниже приведен пример определения того, попадает ли луч руки в мини-приложение, и настройки результата пользовательского попадания:
Чтобы использовать лучи рук в схемах, выполните поиск любого из действий в разделе Windows Mixed Reality HMD:
Чтобы получить доступ к ним на C++, добавьте WindowsMixedRealityFunctionLibrary.h в начало файла кода вызова.
Перечисление
У вас также есть доступ к входным вариантам в EHMDInputControllerButtons, которые можно использовать в схемах:
Для доступа в C++ используйте класс перечисления EHMDInputControllerButtons :
enum class EHMDInputControllerButtons : uint8
{
Select,
Grasp,
//......
};
Ниже приведена разбивка двух применимых вариантов перечисления:
HoloLens 2 отслеживает пространственные жесты, что означает, что вы можете записать эти жесты в качестве входных данных. Отслеживание жестов основано на модели подписки. Используйте функцию "Настроить жесты", чтобы сообщить устройству, какие жесты вы хотите отслеживать. Дополнительные сведения о жестах см. в HoloLens 2 документе "Базовое использование".
Затем необходимо добавить код для подписки на следующие события:
OpenXR
В OpenXR события жестов отслеживаются через входной конвейер. При взаимодействии с рукой устройство может автоматически распознавать жесты касания и удержания, но не другие. Они называются сопоставлениями OpenXRMsftHandInteraction Select и Grip. Вам не нужно включать подписку, следует объявлять события в разделе Параметры проекта/Подсистема/Входные данные, как показано ниже:
Вы можете найти функцию Blueprint в разделе Windows Mixed Reality Пространственные входные данные и функцию C++, добавив WindowsMixedRealitySpatialInputFunctionLibrary.h в файл вызывающего кода.
Вы можете включить и отключить захват жестов CaptureGestures с помощью функции . Если включенный жест вызывает входные события, функция возвращает значение true , если захват жеста выполнен успешно, и false если возникла ошибка.
Если вы следуете изложенным нами инструкциям по разработке для Unreal, вы как раз прошли половину в изучении основных стандартных блоков MRTK. Отсюда вы можете перейти к следующему стандартному блоку: