Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Відстеження руки OpenXR
Вступ
Примітка
Ця сторінка присвячена особливому набору функцій, доступних через OpenXR. Деякі функції, представлені тут, також застосовуються до WebXR і можуть надаватися іншими інтерфейсами XR.
Обговорюючи відстеження рук, важливо знати, що існують розбіжності в думках щодо місця проведення ліній. Практичним результатом цього є те, що існують відмінності в реалізації між різними середовищами виконання OpenXR. Ви можете опинитися в такому місці, де вибране апаратне забезпечення не підтримує частину головоломки або робить речі настільки не так, як інші платформи, що вам потрібно зробити додаткову роботу.
Тим не менш, нещодавні вдосконалення специфікації OpenXR усувають ці прогалини, і оскільки платформи впроваджують ці вдосконалення, ми наближаємося до майбутнього, де ми матимемо або повну переносимість між платформами, або принаймні чіткий спосіб визначення можливостей платформи.
Коли ми дивимося на перші дні VR, основні платформи зосереджувалися на введенні даних на основі відстежуваного контролера. Тут ми відстежуємо фізичний пристрій, який також має кнопки для подальшого введення. З даних відстеження ми можемо зробити висновок про розташування рук гравця, але більше інформації невідомо. Традиційно грі залишалося реалізувати механізм для відображення руки гравця та анімації пальців на основі подальшого введення з контролера, бути це через натискання кнопок або через датчики наближення. Часто пальці також розміщуються на основі контексту, того, що тримає користувач і яку дію він виконує.
Останнім часом оптичне відстеження рук стало популярним рішенням, коли камери відстежують руки користувача та стають доступними повні дані відстеження положення рук і пальців. Багато постачальників вважали це абсолютно відокремленим від відстеження контролера та запровадили незалежні API для доступу до даних про положення рук і пальців і орієнтацію. Під час обробки введення розробник гри мав реалізувати механізм виявлення жестів.
Цей поділ також існує в OpenXR, де відстеження контролера в основному обробляється системою карт дій, тоді як оптичне відстеження рук в основному обробляється розширенням API відстеження рук.
Однак світ не такий чорно-білий, і ми бачимо низку сценаріїв, коли ми переходимо межу:
Пристрої, які підходять до обох категорій, як-от гусеничні рукавички та контролери, як-от контролер Index, які також виконують відстеження пальців.
XR Runtimes, які реалізують відстеження руки на основі даних контролера як засіб вирішення правильного розташування пальців для кількох контролерів.
Програми XR, які бажають плавно перемикатися між контролером і відстеженням рук, забезпечуючи однакову взаємодію з користувачем незалежно від використовуваного підходу.
OpenXR відповідає на цей заклик, запроваджуючи додаткові розширення, які дозволяють нам запитувати можливості середовища виконання/апаратного забезпечення XR або додають додаткові функції через цей розрив. Проблема, яка зараз залишається, полягає в тому, що існують прогалини в застосуванні цих розширень, тому деякі платформи не повідомляють про можливості в повному обсязі. Тому вам може знадобитися перевірити функції, доступні на певному апаратному забезпеченні, і відповідно скорегувати свій підхід.
Демо проект
Інформація, представлена на цій сторінці, була використана для створення демонстраційного проекту, який можна знайти тут.
API відстеження рук
Як згадувалося у нашому вступі, API відстеження рук в основному використовується з оптичним відстеженням рук і на багатьох платформах працює лише тоді, коли користувач не тримає контролер. Деякі платформи підтримують відстеження рук контролера, що означає, що ви отримуватимете дані відстеження рук, навіть якщо користувач тримає контролер. Це включає SteamVR, Meta Quest (наразі лише нативний, але, ймовірно, з’явиться підтримка метапосилання), і, сподіваюся, незабаром також інші.
Реалізація відстеження руки в Godot стандартизована навколо скелета людини Godot і працює як в OpenXR, так і в WebXR. Таким чином, наведені нижче інструкції працюватимуть в обох середовищах.
Щоб використовувати API відстеження руки з OpenXR, вам спочатку потрібно його ввімкнути. Це можна зробити в налаштуваннях проекту:
Для деяких автономних пристроїв XR вам також потрібно налаштувати розширення відстеження руки в налаштуваннях експорту, наприклад для Meta Quest:
Тепер вам потрібно додати 3 компоненти в вашу сцену для кожної руки:
Гусеничний вузол для позиціонування руки.
Правильно очищена ручна сітка зі скелетом.
Модифікатор скелета, який застосовує дані відстеження пальців до скелета.
Вузол відстеження руки
Система відстеження рук використовує окремі трекери для відстеження положення рук гравця в нашому просторі відстеження.
Ця інформація була розділена для наступних випадків використання:
Відстеження відбувається в локальному просторі вузла XROrigin3D. Для правильного розміщення цей вузол має бути дочірнім вузлом XROrigin3D.
Цей вузол можна використовувати як IK-мішень, коли використовується сітка верхньої частини тіла з руками замість окремих сіток рук.
Фактичне розташування рук може бути слабко пов’язане з відстеженням у таких сценаріях, як інтерфейси створення аватарів, підроблені дзеркала чи подібні ситуації, що призводить до того, що сітка рук і відстеження пальців локалізуються в іншому місці.
Ми зосередимося лише на першому випадку використання.
Для цього вам потрібно додати вузол XRNode3D до вашого вузла XROrigin3D.
На цьому вузлі
трекерповинен бути встановлений на/user/hand_tracker/leftабо/user/hand_tracker/rightдля лівої або правої руки відповідно.
Poseмає залишатися встановленимdefault, жоден інший параметр тут не працюватиме.Прапорець
Показувати під час відстеженняавтоматично приховає цей вузол, якщо дані відстеження недоступні, або зробить цей вузол видимим, якщо дані відстеження доступні.
Сфальсифікована ручна сітка
Для того, щоб показати нашу руку, нам потрібна сітка для рук, яка належним чином оснащена та покрита шкірою. Для цього Ґодо використовує структуру кісток руки, як визначено для Godot Humanoid, але необов’язково підтримує додаткову кінчикову кістку для кожного пальця.
Демонстрація відстеження рук OpenXR містить приклади файлів glTF правильно підлаштованих рук.
Ми будемо використовувати їх тут і додамо їх як дочірні до нашого вузла XRNode3D. Нам також потрібно дозволити дочірнім елементам, які можна редагувати, отримати доступ до нашого вузла Skeleton3D.
Модифікатор скелета руки
Нарешті, нам потрібно додати вузол XRHandModifier3D як дочірній до нашого вузла Skeleton3D. Цей вузол отримуватиме дані відстеження пальців з OpenXR та застосовуватиме їх до моделі руки.
Вам потрібно встановити властивість Hand Tracker на /user/hand_tracker/left або /user/hand_tracker/right залежно від того, застосовуємо ми дані відстеження відповідно лівого чи правого руку.
Ви також можете встановити режим Оновлення кістки для цього вузла.
Повнийповністю застосовує дані відстеження рук. Це означає, що розташування скелета потенційно відображатиме розмір фактичної руки користувача. Це може призвести до ефекту стиснення, якщо сітки не зважені належним чином для врахування цього. Переконайтеся, що ви тестуєте свою гру з гравцями будь-якого розміру, коли використовується оптичне відстеження руки!
Лише обертаннязастосовуватиме обертання лише до кісток рук і збереже довжину кістки як є. У цьому режимі розмір сітки руки не змінюється.
З додаванням цього, коли ми запускаємо проект, ми маємо бачити правильно відображену руку, якщо підтримується відстеження руки.
Джерело даних відстеження руки
Це розширення OpenXR, яке надає інформацію про джерело даних відстеження рук. На даний момент його реалізовано лише в кількох середовищах виконання, але якщо він доступний, Godot його активує.
Якщо це розширення не підтримується і тому повертається невідомий, ви можете зробити такі припущення:
Якщо ви використовуєте SteamVR (включаючи посилання Steam), підтримується лише відстеження рук на основі контролера.
Для будь-якого іншого середовища виконання, якщо підтримується відстеження рук, підтримується лише оптичне відстеження рук (Зверніть увагу, 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 pose– це поза, що розташовується посередині між кінчиком великого та кінчиком вказівного пальців і орієнтована таким чином, що промінь можна використовувати для ідентифікації цілі.Плаваючий вхід
pinch— це значення від 0,0 (кінчики великого та вказівного пальців розставлені) до 1,0 (кінчики великого та вказівного пальців торкаються).Вхідний сигнал
pinch readyє істинним, коли кінчики пальців (майже) торкаються один одного.
Жест захоплення активується стисненням кулака й часто використовується для підняття предметів, подібно до введення стискання на контролерах.
Введення
graspfloat є значенням від 0,0 (відкрита долоня) до 1,0 (кулак).Введення
grasp readyє істинним, коли користувач стиснув кулак.
Жест тикання запускається витягуванням вказівного пальця, цей виняток є невеликим винятком, оскільки поза на кінчику вказівного пальця часто використовується для тикання інтерактивного об'єкта. poke pose — це поза, розташована на кінчику вказівного пальця.
Нарешті, вхід aim activate (ready) визначається як вхід, який має значення 1.0/true, коли вказівний палець витягнутий і вказує на ціль, яку можна активувати. Як час виконання це інтерпретує, незрозуміло.
При такому налаштуванні використовуються звичайні трекери left_hand і right_hand, і таким чином ви можете плавно перемикатися між контролером і введенням відстеження руки.
Примітка
Вам потрібно ввімкнути розширення профілю взаємодії рук у налаштуваннях проекту OpenXR.
Профіль взаємодії рук Microsoft
Розширення профілю взаємодії з рукою Microsoft було представлено корпорацією Майкрософт і приблизно імітує простий профіль контролера. Meta також додала підтримку для цього розширення, але лише на рідному клієнті OpenXR, наразі воно недоступне через Meta Link.
Підтримка щипків доступна через вхід select, значення якого становить 0,0, коли кінчики великого та вказівного пальців розведені, і 1,0, коли вони разом.
Зауважте, що в цьому профілі позу прицілювання перевизначено як позу між великим і вказівним пальцями, орієнтовану таким чином, щоб можна було використовувати промінь для ідентифікації цілі.
Підтримка захоплення виявляється через введення стискання, значення якого становить 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 можуть вільно визначати, як працює простий профіль контролера, тому також немає впевненості щодо того, як цей профіль зіставляється з жестами.
Здається, найпоширенішим відображенням є те, що вибір клацання є істинним, коли кінчики великого та вказівного пальців торкаються, а долоня користувача спрямована від користувача. Натискання меню буде істинним, коли кінчики великого та вказівного пальців торкаються, а долоня користувача звернена до користувача.
При такому налаштуванні використовуються звичайні трекери left_hand і right_hand, і таким чином ви можете плавно перемикатися між контролером і введенням відстеження руки.
Примітка
Оскільки деякі з цих профілів взаємодії збігаються, важливо знати, що ви можете додати кожен профіль до своєї карти дій, і середовище виконання XR вибере найкращий профіль.
Наприклад, Meta Quest підтримує як профіль ручної взаємодії Microsoft, так і простий профіль контролера. Якщо вказано обидва, профіль взаємодії рук Microsoft матиме пріоритет і використовуватиметься.
Очікується, що як тільки Meta підтримає розширення профілю основної взаємодії рук, цей профіль матиме перевагу як над Microsoft, так і над простими профілями контролера.
Введення на основі жестів
Якщо платформа не підтримує жодних профілів взаємодії, коли використовується відстеження рук, або якщо ви створюєте програму, де вам потрібна складніша підтримка жестів, вам потрібно буде створити власну систему розпізнавання жестів.
Ви можете отримати повні дані відстеження рук через ресурс XRHandTracker для кожної руки. Ви можете отримати трекер рук, викликавши XRServer.get_tracker і використовуючи /user/hand_tracker/left або /user/hand_tracker/left як засіб відстеження. Цей ресурс надає доступ до всієї спільної інформації для даної руки.
Детальний опис повного алгоритму розпізнавання жестів виходить за рамки цього посібника, однак є кілька проектів спільноти, які ви можете переглянути: