WebXRInterface

Успадковує: XRInterface < RefCounted < Object

Інтерфейс XR за допомогою WebXR.

Опис

WebXR — це відкритий стандарт, який дозволяє створювати програми VR і AR, які запускаються у веб-браузері.

Таким чином, цей інтерфейс доступний лише під час запуску веб-експорту.

WebXR підтримує широкий спектр пристроїв, від дуже потужних (наприклад, Valve Index, HTC Vive, Oculus Rift і Quest) до набагато менш потужних (наприклад, Google Cardboard, Oculus Go, GearVR або простих смартфонів).

Оскільки WebXR базується на JavaScript, він широко використовує зворотні виклики, що означає, що WebXRInterface змушений використовувати сигнали, тоді як інші інтерфейси XR натомість використовували б функції, які негайно повертають результат. Це робить ініціалізацію WebXRInterface трохи складнішою, ніж інші інтерфейси XR.

Ось мінімальний код, необхідний для початку захоплюючого сеансу VR:

розширює Node3D

var webxr_interface
var vr_supported = false

func _ready():
 # Ми припускаємо, що цей вузол має дочірню кнопку.
 # Ця кнопка призначена для того, щоб користувач дав згоду на вхід у режим реальної реальності.
 $Button.pressed.connect(self._on_button_pressed)

webxr_interface = XRServer.find_interface("WebXR")
 якщо webxr_interface:
 # WebXR використовує багато асинхронних зворотних викликів, тому ми підключаємось до різних
 # сигнали для їх отримання.
webxr_interface.session_supported.connect(self._webxr_session_supported)
webxr_interface.session_started.connect(self._webxr_session_started)
webxr_interface.session_ended.connect(self._webxr_session_ended)
webxr_interface.session_failed.connect(self._webxr_session_failed)

 # Це негайно повертає - наш метод _webxr_session_supported().
 # (який ми підключили до сигналу "session_supported" вище) буде
 # нам зателефонують пізніше, щоб повідомити нам, чи підтримується це чи ні.
webxr_interface.is_session_supported("immersive-vr")

func _webxr_session_supported(session_mode, supported):
if session_mode == 'immersive-vr':
vr_supported = supported

func _on_button_pressed():
if vr_supported not:
OS.alert("Ваш браузер не підтримує VR")
return

 # Ми хочемо захоплюючого сеансу VR, на відміну від AR ("immersive-ar") або
 # простий переглядач 3DoF ('переглядач').
webxr_interface.session_mode = 'immersive-vr'
 # 'bounded-floor' — масштаб кімнати, 'local-floor' — стоячи або сидячи
 # досвід (це дає вам 1,6 м над землею, якщо у вас гарнітура 3DoF),
 # тоді як «локальний» ставить вас на XROrigin.
 # Цей список означає, що він спочатку спробує запитати 'bounded-floor', а потім
 # резервний варіант на 'local-floor' і зрештою на 'local', якщо нічого іншого немає
 # підтримується.
webxr_interface.requested_reference_space_types = 'обмежений поверх, локальний поверх, локальний'
 # Щоб використовувати 'local-floor' або 'bounded-floor', ми також повинні
 # позначити функції як обов’язкові чи необов’язкові. Включивши «відстеження рук»
 # як додаткова функція, вона буде ввімкнена, якщо підтримується.
webxr_interface.required_features = 'local-floor'
webxr_interface.optional_features = 'bounded-floor, hand-tracking'

 # Це поверне false, якщо ми не зможемо навіть запитати сеанс,
 # однак пізніше в цьому процесі може виникнути асинхронна помилка, тому ми
 # знати, чи дійсно це вдалося чи не вдалося, лише коли наш
 Викликаються # методи _webxr_session_started() або _webxr_session_failed().
if not webxr_interface.initialize():
OS.alert("Не вдалося ініціалізувати")
return

func _webxr_session_started():
 $Button.visible = false
 # Це повідомляє Godot почати рендеринг на гарнітурі.
get_viewport().use_xr = true
 # Це буде типовий еталонний простір, який ви остаточно отримали
 # типу, які ви запитували вище. Це корисно, якщо ви хочете, щоб гра
 # працювати трохи інакше в 'bounded-floor' проти 'local-floor'.
print("Тип посилального простору: ", webxr_interface.reference_space_type)
 # Це буде список функцій, які були успішно ввімкнені
 # (за винятком браузерів, які не підтримують цю властивість).
print("Увімкнені функції: ", webxr_interface.enabled_features)

func _webxr_session_ended():
 $Button.visible = ture
 # Якщо користувач виходить із режиму занурення, ми повідомляємо Godot відобразити в Інтернеті
 # сторінка знову.
get_viewport().use_xr = false

func _webxr_session_failed(message):
OS.alert("Не вдалося ініціалізувати: " + повідомлення)

Є кілька способів обробки введення "контролера":

  • Використання вузлів XRController3D і їхніх сигналів XRController3D.button_pressed і XRController3D.button_released. Так зазвичай обробляються контролери в програмах XR у Godot, однак це працюватиме лише з розширеними контролерами віртуальної реальності, такими як контролери Oculus Touch або Index, наприклад.

  • Використання select, squeeze та пов’язаних сигналів. Цей метод працюватиме як для розширених контролерів віртуальної реальності, так і для нетрадиційних джерел введення, як-от дотик до екрана, голосова команда чи натискання кнопки на самому пристрої.

Ви можете використовувати обидва методи, щоб дозволити вашій грі чи додатку підтримувати ширший або вужчий набір пристроїв і методів введення або дозволити розширенішу взаємодію з більш досконалими пристроями.

Посібники

Властивості

String

enabled_features

String

optional_features

String

reference_space_type

String

requested_reference_space_types

String

required_features

String

session_mode

String

visibility_state

Методи

Array

get_available_display_refresh_rates() const

float

get_display_refresh_rate() const

TargetRayMode

get_input_source_target_ray_mode(input_source_id: int) const

XRControllerTracker

get_input_source_tracker(input_source_id: int) const

bool

is_input_source_active(input_source_id: int) const

void

is_session_supported(session_mode: String)

void

set_display_refresh_rate(refresh_rate: float)


Сигнали

display_refresh_rate_changed() 🔗

Після зміни частоти оновлення дисплея.


reference_space_reset() 🔗

Увімкнути, щоб вказати, що посилання було скидання або переналаштувати.

Якщо користувач змінив розміри ігрового простору (які ви можете отримати доступ через XRInterface.get_play_area()) або / натиснути кнопку до останнього положення.

Див. WebXR's XRReferenceSpace скидання для отримання додаткової інформації.


select(input_source_id: int) 🔗

Після того, як один з джерел вводу закінчив свою «примірну дію».

Використовуйте Get_input_source_tracker() і get_input_source_target_ray_mode() для отримання додаткової інформації про джерело введення.


selectend(input_source_id: int) 🔗

Увімкнено, коли один з джерел вводу закінчив свою «примірну дію».

Використовуйте Get_input_source_tracker() і get_input_source_target_ray_mode() для отримання додаткової інформації про джерело введення.


selectstart(input_source_id: int) 🔗

Увімкнено, коли один з джерел введення почав свою «примірну дію».

Використовуйте Get_input_source_tracker() і get_input_source_target_ray_mode() для отримання додаткової інформації про джерело введення.


session_ended() 🔗

Увімкнено, коли користувач закінчує сеанс WebXR (що можна зробити за допомогою UI з браузера або пристрою).

У цьому пункті ви повинні зробити get_viewport().use_xr = false, щоб інструктувати Godot, щоб відновити рендеринг на екрані.


session_failed(message: String) 🔗

Випробувано XRInterface.initialize(), якщо сеанс не запускається.

message може додатково містити повідомлення про помилку від WebXR або порожній рядок, якщо немає повідомлення.


session_started() 🔗

Випробувано XRInterface.initialize(), якщо розпочато сеанс.

У цій точці, це безпечно зробити get_viewport().use_xr = true для інструктального Godot для запуску рендерингу на пристрій XR.


session_supported(session_mode: String, supported: bool) 🔗

Видається методом is_session_supported(), щоб вказати, чи підтримується заданий параметр session_mode.


squeeze(input_source_id: int) 🔗

Після того, як один з джерел вводу закінчив свою «примірну стискну дію».

Використовуйте Get_input_source_tracker() і get_input_source_target_ray_mode() для отримання додаткової інформації про джерело введення.


squeezeend(input_source_id: int) 🔗

Увімкнено, коли одна з джерел вводу завершила свою «прозору дію».

Використовуйте Get_input_source_tracker() і get_input_source_target_ray_mode() для отримання додаткової інформації про джерело введення.


squeezestart(input_source_id: int) 🔗

Увімкнено, коли одна з джерел вводу розпочала свою «примірну дію».

Використовуйте Get_input_source_tracker() і get_input_source_target_ray_mode() для отримання додаткової інформації про джерело введення.


visibility_state_changed() 🔗

Видається, коли змінюється visibility_state.


Переліки

enum TargetRayMode: 🔗

TargetRayMode TARGET_RAY_MODE_UNKNOWN = 0

Ми не знаємо режим цільового променя.

TargetRayMode TARGET_RAY_MODE_GAZE = 1

Цільові промені виявляються на очах глядача та точках у напрямку, які вони шукають.

TargetRayMode TARGET_RAY_MODE_TRACKED_POINTER = 2

Цільовий промінь з ручного тостера, швидше за все, VR сенсорний контролер.

TargetRayMode TARGET_RAY_MODE_SCREEN = 3

Цільовий промінь від сенсорного екрана, миша або іншого пристрою вводу.


Описи властивостей

String enabled_features 🔗

  • String get_enabled_features()

Список функцій, розділених комами, які були успішно ввімкнені методом XRInterface.initialize під час налаштування сеансу WebXR.

Це може включати функції, запитувані шляхом встановлення параметрів required_features та optional_features, і будуть доступні лише після генерації сигналу session_started.

Примітка: Це може не підтримуватися всіма веббраузерами, і в такому разі це буде порожній рядок.


String optional_features 🔗

  • void set_optional_features(value: String)

  • String get_optional_features()

Розділений комами список опціональних функцій, які використовуються XRInterface.initialize() під час налаштування сеансу WebXR.

Якщо браузер або пристрій користувача не підтримує одну з зазначених функцій, ініціалізація продовжиться, але ви не зможете використовувати запитувану функцію.

Це не впливає на інтерфейс, якщо він вже ініціалізований.

Перелік можливих значень див. у документації MDN про функції сеансу WebXR.


String reference_space_type 🔗

  • String get_reference_space_type()

Тип простору посилань (зі списку запитуваних типів, встановленого у властивості requested_reference_space_types), який зрештою використовувався методом XRInterface.initialize під час налаштування сеансу WebXR.

Можливі значення взяті з WebXR XRReferenceSpaceType. Якщо ви хочете використовувати певний тип простору посилань, він має бути вказаний у required_features або optional_features.


String requested_reference_space_types 🔗

  • void set_requested_reference_space_types(value: String)

  • String get_requested_reference_space_types()

Список типів просторів посилань, розділених комами, що використовуються методом XRInterface.initialize під час налаштування сеансу WebXR.

Типи просторів посилань запитуються по порядку, і буде використано перший, який підтримується пристроєм або браузером користувача. Властивість reference_space_type містить тип простору посилань, який був вибраний зрештою.

Це не впливає на інтерфейс, коли він вже ініціалізований.

Можливі значення взяті з WebXR XRReferenceSpaceType. Якщо ви хочете використовувати певний тип простору посилань, він має бути вказаний у required_features або optional_features.


String required_features 🔗

  • void set_required_features(value: String)

  • String get_required_features()

Розділений комами список необхідних функцій, які використовуються XRInterface.initialize() під час налаштування сеансу WebXR.

Якщо браузер або пристрій користувача не підтримує одну з зазначених функцій, ініціалізація не відбудеться і буде видано session_failed.

Це не впливає на інтерфейс, якщо він вже ініціалізований.

Перелік можливих значень див. у документації MDN про функції сеансу WebXR.


String session_mode 🔗

  • void set_session_mode(value: String)

  • String get_session_mode()

Режим сеансу використовується XRInterface.initialize() при налаштуванні сеансу WebXR.

Це не має ніякого ефекту на інтерфейсі, коли вже ініціалізовано.

Можливі значення ` WebXR's XRSessionMode <https://developer.mozilla.org/en-US/docs/Web/API/XRSessionMode>`__, в тому числі: "immersive-vr", "immersive-ar", і "inline".


String visibility_state 🔗

  • String get_visibility_state()

Призначається, якщо зображення сеансу WebXR видно користувачеві.

Можливі значення ` WebXR's XRVisibilityState <https://developer.mozilla.org/en-US/docs/Web/API/XRVisibilityState>`__, в тому числі "hidden", `` "невидимий", і ``"невидимий-blurred".


Описи методів

Array get_available_display_refresh_rates() const 🔗

Повертаємо ціни на оновлення, що підтримується струмом HMD. Тільки повернулися, якщо ця функція підтримується браузером і після того, як інтерфейс був ініціалізований.


float get_display_refresh_rate() const 🔗

Повертає частоту оновлення дисплея для поточного HMD. Не підтримується на всіх HMDs і браузерах. Не можна повідомляти про точну вартість до використання set_display_refresh_rate().


TargetRayMode get_input_source_target_ray_mode(input_source_id: int) const 🔗

Повертаємо цільовий режим променя для вказаного input_source_id.

Це може допомогти інтерпретувати вхід, що надходить з цього джерела введення. XRInputSource.targetRayMode для отримання додаткової інформації.


XRControllerTracker get_input_source_tracker(input_source_id: int) const 🔗

Отримує XRControllerTracker для заданого input_source_id.

У контексті WebXR джерелом вхідного сигналу може бути вдосконалений VR-контролер, такий як контролери Oculus Touch або Index, або навіть дотик до екрана, голосова команда чи натискання кнопки на самому пристрої. Коли використовується нетрадиційне джерело вхідного сигналу, інтерпретуйте положення та орієнтацію XRPositionalTracker як промінь, що вказує на об'єкт, з яким користувач бажає взаємодіяти.

Використовуйте цей метод, щоб отримати інформацію про джерело вхідного сигналу, яке спрацювало один із цих сигналів:


bool is_input_source_active(input_source_id: int) const 🔗

Повертає true, якщо є активне джерело введення з заданим вхід_source_id.


void is_session_supported(session_mode: String) 🔗

Перевіряє, якщо надана session_mode підтримується браузером користувача.

Можливі значення ` WebXR's XRSessionMode <https://developer.mozilla.org/en-US/docs/Web/API/XRSessionMode>`__, в тому числі: "immersive-vr, "immersive-ar", і "inline".

Цей метод повертає нічого, замість того, як він випромінює сигнал session_supported з результатом.


void set_display_refresh_rate(refresh_rate: float) 🔗

Налаштовує частоту оновлення дисплея для поточного HMD. Не підтримується на всіх HMDs і браузерах. Не втрачайте ефект прямо до того, як display_refresh_rate_changed.