Используя обновленный API отслеживания рук платформы Presence, компания представила отслеживание рук в последнем обновлении Myst на платформе Meta Quest под названием «Руки и многое другое». Это наконец-то позволить людям играть в Myst на Quest без физических контроллеров! В этом посте мы обсудим эволюцию и итерацию реализации отслеживания рук в Myst и, в частности, добавление его дополнительной поддержки в Unreal Engine 4.27.2.
Этап проектирования и соображения
Проектирование навигации для отслеживания рук
Изображение, указывающее, куда вы хотите отправиться. Вы, вероятно, думали указать, не так ли? Вот почему было решено использовать метод «указания» для движения в Myst.
Когда вы находитесь в режиме телепорта, вы можете указать, куда хотите отправиться, и в месте назначения появится кольцо телепорта. Когда вы «не указываете» (вытягивая остальные пальцы или просто втягивая указательный палец обратно в ладонь), выполняется телепорт.
Когда вы находитесь в режиме плавного движения, указывая рукой с преобладанием свободного движения (которую можно настроить в настройках управления, но по умолчанию это левая рука), вы начнете плавно перемещаться в том направлении, в котором указываете.
При тестировании движения с указыванием было обнаружено, что отслеживание руки иногда может быть ненадежным с указательным и средним пальцами, когда они закрыты остальной частью вашей руки. Система не уверена, полностью ли эти пальцы направлены или полностью «закрыты» в вашей руке. Разработчики добавили в код немного фактора «выдумки», чтобы учесть более стабильное инициирование/выполнение движений на этом фронте, о чем мы поговорим чуть позже, когда будем обсуждать изменения, внесенные в готовое отслеживание рук.
Поворот
Метод «точка» работает не для всех способов навигации. Когда дело доходит до поворота, мы сначала совмещаем указание с вращением запястья. Сравнение запястья игрока и прямого вектора камеры указывало бы направление поворота (и насколько большим должен быть поворот). Сначала разработчики попробовали это, поскольку казалось интуитивно понятным сохранить тему «указания» для навигации между всеми режимами.
Однако в тестах на комфорт возникли сложности. Во время игрового тестирования большинство игроков указывали вперед ладонью к земле, как и при попытке указать на что-то вне игры. Вращение запястья влево и вправо (вокруг оси запястья вверх), когда ваша ладонь обращена к земле, является сложной задачей и имеет очень ограниченный диапазон движения, особенно если вы пытаетесь отвернуться от груди.
Эта проблема не изменится, даже если вы попросите игрока указать на что-то перед ним ладонями внутрь. Вы можете немного согнуть запястье по направлению к телу, но не получите такой же диапазон движения, сгибая запястье от тела.
Итак, как был решён этот вопрос? Всё закончилось тем, что поворот был назначен на жест «большой палец вверх» вместо жеста указательного пальца.
Представьте, что вы поднимаете большой палец вверх. Теперь поверните запястье вправо и влево. Обратите внимание, что даже если у вас нет большого диапазона движений, вы все равно довольно последовательно указываете большим пальцем «влево» и «вправо» в этом жесте.
Это то, на чем мы остановились для включения режима отслеживания рук. Хотя указание пальцем не кажется самым интуитивным способом поворота, в конечном итоге это оказалось наиболее удобным и последовательным способом.
При мгновенном повороте вращение запястья влево или вправо из положения поднятого большого пальца приводит к началу одиночного резкого поворота. Затем вам нужно вернуть руку в «центральное» (прямо вверх) положение, чтобы сбросить щелчок, и дополнительно подождать, пока не произойдет очень короткое время восстановления, чтобы снова начать мгновенный поворот.
При плавном повороте поворот запястья в положении с поднятым вверх большим пальцем начнет вращать вас влево или вправо — как только вы покинете «мертвую зону», которая предотвращает поворот, пока вы не преодолеете порог.
Разрешение конфликтов между позами движения и взаимодействия с объектами
Конечно, указание пальцем — слишком широкий жест, чтобы его можно было использовать только для навигации. Люди будут делать тот же указывающий жест, чтобы нажимать кнопки или взаимодействовать с другими вещами в мире просто по привычке или из своих собственных ожиданий. Было бы довольно неприятно подойти к кнопке (но не прямо к ней), указать пальцем, чтобы нажать на нее, а затем внезапно (и нежелательно) приблизиться к ней в игре (или непреднамеренно инициировать телепорт)!
Способ, которым предотвращается движение, когда игрок может с чем-то взаимодействовать, заключается в предотвращении запуска любого кода движения, когда рука, выполняющая жест «движение», находится в пределах определенного диапазона интерактивного объекта. Этот диапазон несколько раз корректировался, чтобы достичь «наилучшего результата» на основе игрового тестирования.
Разработчики обнаружили, что эта точка наилучшего восприятия находится примерно в 25 см от положения кости кончика указательного пальца в мировом пространстве. В Myst полно интерактивных объектов разных размеров (от маленьких кнопок до очень больших рычагов), расположенных как на широких открытых пространствах, так и в узких коридорах, поэтому потребовалось немало испытаний, чтобы определить это число. Сначала пробовали 60 см (около двух футов), но это не позволяло происходить движению, когда игрокам все еще нужно было приблизиться к объекту. Точно так же все, что ниже 25 см, вызывало нежелательное движение игрока, когда игроки пытались схватить или коснуться объекта.
Одной из лучших площадок для тестирования была генераторная на острове Myst, где вы проходите через узкий вход, а затем сразу же встречаете панель, полную кнопок. Когда область тестирования взаимодействия была слишком большой, игроки не могли пройти через вход и к панели, потому что она обнаруживала кнопки в пределах досягаемости указательного пальца.
Тем не менее, 25 см — это то, что сработало именно для Myst. В других играх может потребоваться изменить это число, если они хотят реализовать что-то подобное с учетом своих собственных критериев.
Проектирование взаимодействия объектов для отслеживания рук
В настоящее время все захватываемые взаимодействия в Myst построены для работы с отслеживанием рук — поворот клапанов, открытие дверей, нажатие кнопок, перелистывание книжных страниц и т. д.
Взаимодействия основаны на том, что уже настроено для Myst с сенсорными контроллерами. Там нажатие кнопки захвата автоматически смешивает внутриигровое представление сетки вашей руки с «схваченной» позой, либо сжимая руку в кулак (если она пуста), либо захватывая объект. С отслеживанием рук разработчики добавили код, который будет делать квалифицированное предположение о том, когда вы достаточно согнули пальцы, чтобы «схватить» что-то, и запустить ту же логику, что упоминалась ранее.
Например, когда вы используете отслеживание рук и ваша рука зависает над чем-то, что можно схватить, цвет вашей руки становится оранжевым (именно это происходит, когда вы не используете отслеживание рук и в Myst VR). Когда вы берете интерактивный объект, начиная сжимать пальцы в кулак, оранжевая сфера заменяет вашу сетку руки и показывает, где рука прикреплена к объекту.
Причина, по которой был выбран этот метод вместо того, чтобы создавать настраиваемые модели для ваших рук или позволять вашим рукам/пальцам физически взаимодействовать с частями этих объектов, заключается в том, что разработчики хотели, чтобы взаимодействия были на одном уровне с тем, что мы предлагаем на сенсорном контроллере на данный момент.
Однако нажатие кнопок работает по-другому. Нет необходимости в абстракции, поскольку кнопки не являются захватываемыми объектами, и вместо этого вам нужно просто нажимать кнопку, используя сгенерированные капсульные коллайдеры между каждым из суставов пальцев на подвижной сетке руки. Из-за этого вы можете делать всевозможные странные и забавные вещи — например, использовать только мизинец или костяшку безымянного пальца для взаимодействия с каждой кнопкой в игре, если вы действительно этого хотите.
Эта реализация немного отличается от того, как сенсорные контроллеры взаимодействуют с кнопками в игре, тем, что мы обычно ожидаем, что игроки будут использовать кнопку захвата на своем контроллере, чтобы настроить руку как сетку, указывающую пальцем, чтобы получить точную игровую кнопку. С отслеживанием рук, очевидно, значительно больше гибкости в позе, которую вы можете создать своей рукой, и, следовательно, значительно больше способов нажимать кнопки с тем же уровнем точности.
Взаимодействие с меню/интерфейсом
Для взаимодействия с меню была в конечном итоге использована та же парадигма взаимодействия, которую Meta использует для Quest Platform: сведение двух пальцев между большим и указательным пальцами на любой руке. Это можно использовать как для открытия игрового меню, так и для взаимодействия с элементами в меню. Нет смысла изобретать велосипед, когда игроков уже учат делать это в меню уровня ОС, когда они впервые включают отслеживание рук в Quest!
Сообщение всего этого игроку
Поскольку отслеживание рук не так распространено в Quest, как контроллеры Touch, и поскольку некоторые люди могут играть в Myst впервые (или даже играть в свою самую первую игру VR!), мы старались быть внимательными к тому, как передать всю эту информацию об отслеживании рук игроку. Мы позаботились о том, чтобы включить еще одну версию «диаграммы контроллера», специально предназначенную для описания взаимодействия с отслеживанием рук (если она включена в Myst), и показать игрокам специальные уведомления, которые точно сообщают им, как передвигаться руками.
Кроме того, было бы очень важно напомнить игроку, как обеспечить плавное отслеживание рук после его включения. В меню Myst игрок уведомляется о том, что стабильность отслеживания рук намного лучше, если он находится в хорошо освещенной комнате и держит руки в поле зрения.
Meta также информирует игроков о том, что это является ключом к хорошо отслеживаемой среде отслеживания рук, но мы понимаем, что некоторые игроки могут начать игру, не проанализировав предварительно уведомления Meta об этом, поэтому решили напомнить людям, если они забыли.
Модификации движка, сделанные в Unreal
Вот тут-то и будет немного больше технических деталей… пристегнитесь!
В настоящее время компания использует Unreal Engine 4.27.2 для Myst. В Meta есть некоторый базовый код для отслеживания рук в Unreal, но его недостаточно для такой игры, как эта, которая требует лучшего распознавания жестов и уверенности. Большая часть библиотек Meta для обнаружения жестов и физического отслеживания рук в настоящее время доступна только в Unity, поэтому нужно было проделать некоторую подготовительную работу в этом направлении, чтобы простые жесты, такие как жесты «большой палец вверх» и «указывание пальцем», распознавались в Unity Unreal.
Кроме того, есть некоторые другие элементы, которые людям нужно будет реализовать для готового проекта отслеживания рук, о котором подробно будет рассказано ниже.
Исправление спама системными жестами
Системный жест левой рукой Oculus (это для кнопки меню) срабатывает, даже если вы начинаете щипок, вместо того, чтобы ждать подтверждения того, что щипок находился в одном и том же состоянии в течение определенного периода времени. Теперь это исправлено, изменив событие в библиотеке ввода Oculus, чтобы дождаться завершения захвата (подождать, пока системный жест заполнит круг подтверждения), прежде чем запускать событие уведомления, а не делать это во время его выполнения.
Многоплатформенная стабильность сборки
Сериализация компонента Oculus Hand с любым Blueprint приведет к сбою сборки для других платформ (например, Xbox) на этапе нативизации. Это связано с тем, что компонент Oculus Hand является частью подключаемого модуля OculusVR, который включен только для Windows и Android, и поэтому ни один из его компонентов не может быть указан в чертежах при создании других платформ.
Нативизация официально не поддерживается в Unreal Engine 5, но для пользователей Unreal Engine 4 может быть полезно оставить ее включенной в зависимости от потребностей вашего проекта. Следовательно, невозможно включить ручной компонент на уровне Blueprint для игр, упакованных для всех платформ.
Решение этой проблемы заключается в том, что мы создаем и уничтожаем компонент Oculus Hand на C++ на наших сенсорных контроллерах только тогда, когда отслеживание рук определяется как включенное или отключенное, и эта функция включена только для сборок Android, созданных для Quest. Исходный код Hand Component и весь наш код отслеживания рук исключены из всех других платформ.
К сожалению, это означает, что если вы являетесь разработчиком проекта, предназначенного только для Blueprints, который нацелен на несколько платформ и использует нативизацию в Unreal Engine 4, и вы планируете внедрить отслеживание рук для Quest, вам, возможно, придется преобразовать свой проект в исходный проект, чтобы избежать проблем с нативизацией при сборке для платформ, отличных от Quest.
Пользовательское распознавание жестов всей рукой
В библиотеку ввода Oculus не встроено значимое распознавание жестов всей руки (кроме щипков пальцев для системных жестов) в Unreal. Это означает, что если вы делаете жест «большой палец вверх» или жест «указывающий пальцем», требующий, чтобы все остальные пальцы были спрятаны, в Unreal не встроено ничего, что уведомляло бы вас об этом конкретном жесте.
Решение для этого заключалось в том, чтобы реализовать собственное обнаружение вращения костей в компоненте Oculus Hand с регулируемыми допусками, чтобы сделать вывод, когда:
- Происходит указание пальцем (указательным)
- Происходит захват
- Происходит жест поднятия большого пальца
Все они запускаются как события ввода, к которым мы можем привязаться на C++, где мы размещаем большую часть кода нашего базового контроллера игрока, персонажа и сенсорного контроллера.
Регулировка стабильности жестов и отслеживания
При внедрении и тестировании поддержки отслеживания рук для Myst в Unreal мы заметили некоторые особенности стабильности отслеживания определенных пальцев, когда они закрыты остальной частью вашей руки. Например, если вы:
- Хватаете что-либо всеми пальцами, обращенными от вас
- Указательный палец направлен прямо от вас
Обнаружилось, что в случае захвата чего-либо всеми пальцами, обращенными от вас, отслеживание рук может иногда думать, что ваш мизинец не заключен в кулак, как если бы он был слегка расслаблен. На самом деле, точность отслеживания всех пальцев в сжатом кулаке, когда пальцы закрыты тыльной стороной ладони, не особенно высока, даже если достоверность отслеживания не считается низкой. Это проблема, когда мы ожидаем, что игрок схватится за такие вещи, как клапаны или рычаги, и начнет поворачивать / перемещать их, не отпуская слишком быстро — система отслеживания рук может решить, что вы больше не хватаете объект, потому что она думает, что вы расслабили пальцы.
В случае направления указательного пальца в сторону от себя иногда система слежения за руками считала ваш средний палец более расслабленным, чем он был на самом деле, или даже указывала указательным пальцем. Это было проблемой для систем навигации и движения. Если система больше не считает, что вы указываете только указательным пальцем, вместо этого она может подумать, что вы пытаетесь что-то схватить и не дать вам двигаться, или невольно выполняет телепорт, который вы не были готовы инициировать.
Решение для обоих этих сценариев состояло в том, чтобы добавить некоторые пороговые значения для отдельных пальцев, определяющие, насколько мы позволим проблемным пальцам в этих сценариях быть расслабленными, прежде чем считать руку «не хватающей» или «не указывающей». Чаще всего система отслеживания считала, что пальцы более расслаблены, чем они были на самом деле, а не наоборот. Эти пороги были встроены прямо в то место, где было решено уведомить пользователя о жестах, которые делает рука, — прямо в компоненте Oculus Hand.
Другие удобные утилиты для Oculus Hand Component
Множество изменений было внесено в исходный код Oculus Hand Component для нашего собственного распознавания жестов, но также внесены некоторые изменения в него для некоторых служебных функций. Одной из написанных функций была утилита для получения ближайшей точки столкновения руки из какой-то другой точки в мировом пространстве. Кроме того, он возвращает имя ближайшей кости. Мы использовали эту функцию полезности для разных проверок входных данных для различных взаимодействий.
Чего бы это ни стоило, было обнаружено, что надежность отслеживания кости запястья была наиболее стабильной независимо от глубины руки, поэтому тесты проводились для этой кости чаще, чем для других.
Заключительные мысли
Отслеживание рук может быть действительно мощным и доступным дополнением к вашей игре. Для Myst это потребовало некоторой работы, но компания работала «умно», пытаясь связать его с существующими системами ввода, чтобы не нужно было вносить слишком много всеобъемлющих изменений в игру в целом. Основной целью было создать пользовательский интерфейс, который был бы интуитивно понятным и удобным, без создания полностью отдельной системы ввода на серверной части.
Ветка Meta с Unreal Engine поставляется с поддержкой отслеживания рук из коробки и определенно может использоваться командой, способной вносить изменения в движок. С учетом сказанного, ему нужны некоторые модификации, чтобы заставить его распознавать полезные жесты всей рукой. Очень надеемся, что поддержка Meta для отслеживания рук в Unreal достигнет паритета с тем, что предлагают в Unity. Тем временем команды, которым удобно работать с проектами на основе исходного кода в Unreal, должны обнаружить, что у них будет достаточно гибкости, чтобы настроить отслеживание рук в соответствии с их проектом.