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...
AR / Наскрізний
Доповнена реальність підтримується різними методами залежно від можливостей апаратного забезпечення.
Гарнітури, такі як Magic Leap, і окуляри, такі як TiltFive, показують результат візуалізації на «прозорих дисплеях <https://en.wikipedia.org/wiki/See-through_display>`__, що дозволяє користувачеві бачити реальний світ.
Такі гарнітури, як Quest, HTC Elite та Lynx R1, реалізують це за допомогою техніки, яка називається передача відео, коли камери записують реальний світ, а ці зображення використовуються як фон, поверх якого використовується наш відтворений результат.
Примітка
Передача реалізується дуже по-різному на різних платформах.
У Godot 4.3 ми реалізували уніфікований підхід, який пояснюється на цій сторінці довідки, тож вам не потрібно турбуватися про ці відмінності. Реалізація XRInterface тепер відповідає за застосування правильного залежного від платформи методу [1].
Для таких гарнітур, як Meta Quest і HTC Elite, вам знадобиться використовувати плагін OpenXR vendors v3.0.0 або пізніший, щоб увімкнути передачу відео.
Для зворотної сумісності старий API для проходження все ще доступний, але рекомендується дотримуватися нових інструкцій нижче.
Режими змішування середовища
Ми налаштовуємо функціональність VR або AR за допомогою налаштування режиму змішування середовища. Цей режим визначає, як середовище (реального світу) поєднується з віртуальним світом.
Режим змішування |
Опис |
|---|---|
XR_ENV_BLEND_MODE_OPAQUE |
Відтворене зображення непрозоре, ми не бачимо реальний світ. Ми в режимі VR. Це вимкне передачу, якщо використовується передача відео. |
XR_ENV_BLEND_MODE_ADDITIVE |
Відтворене зображення додається до реального світу та виглядатиме напівпрозорим. Цей режим зазвичай використовується з прозорими пристроями, які не можуть затулити реальний світ. Це ввімкне передачу, якщо використовується передача відео. |
XR_ENV_BLEND_MODE_ALPHA_BLEND |
Відтворене зображення альфа-версії змішано з реальним світом. На прозорих пристроях, які підтримують це, альфа контролюватиме напівпрозорість оптики. На пристроях передачі відео альфа-змішування застосовується до відеозображення. також буде ввімкнено передачу, якщо це можливо. |
Ви можете встановити режим змішування середовища для вашої програми за допомогою властивості environment_blend_mode екземпляра XRInterface.
Ви можете запитати підтримувані режими змішування на апаратному забезпеченні, використовуючи властивість get_supported_environment_blend_modes того самого екземпляра.
Налаштування фону
Встановлюючи режим змішування XR_ENV_BLEND_MODE_ALPHA_BLEND, ви повинні встановити для властивості transparent_bg Viewport значення true. У разі використання режиму змішування XR_ENV_BLEND_MODE_ADDITIVE вам слід встановити чорний колір фону.
Будь-яке рішення призведе до того, що візуалізація фону не сприятиме освітленню. Тому також рекомендується відповідно налаштувати параметри середовища та переконатися, що навколишнє освітлення достатньо для освітлення сцени.
Примітка
Деякі AR SDK дійсно надають інформацію про навколишнє освітлення або навіть надають повну карту яскравості, щоб урахувати відображення реального світу у ваших віртуальних об’єктах. Основна функція Godot XR наразі не підтримує це, однак цю функцію можна відкрити за допомогою плагінів.
Особливості OpenXR
У OpenXR ви можете налаштувати режим змішування за умовчанням, який ви хочете використовувати. Godot вибере цей режим змішування під час запуску, якщо він доступний. Якщо Godot недоступний, за умовчанням буде використано перший підтримуваний режим змішування, наданий середовищем виконання XR.
Для наскрізних пристроїв OpenXR вимагає налаштувати додаткові параметри. Ці налаштування залежать від платформи та надаються через плагін постачальників OpenXR.
Наприклад, це налаштування, необхідні для Meta Quest:
Параметр Passthrough визначає, чи підтримується або навіть потрібне проходження.
Обмежувальний режим дозволяє вам визначити, чи потрібен опікун, якщо його повністю вимкнути, потрібно, щоб проходження було ввімкнено завжди.
Збираємо це разом
Зібравши вищезазначене, ми можемо використовувати наступний код як основу:
@onready var viewport : Viewport = get_viewport()
@onready var environment : Environment = $WorldEnvironment.environment
func switch_to_ar() -> bool:
var xr_interface: XRInterface = XRServer.primary_interface
if xr_interface:
var modes = xr_interface.get_supported_environment_blend_modes()
if XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND in modes:
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
viewport.transparent_bg = true
elif XRInterface.XR_ENV_BLEND_MODE_ADDITIVE in modes:
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ADDITIVE
viewport.transparent_bg = false
else:
return false
environment.background_mode = Environment.BG_COLOR
environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
environment.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
return true
func switch_to_vr() -> bool:
var xr_interface: XRInterface = XRServer.primary_interface
if xr_interface:
var modes = xr_interface.get_supported_environment_blend_modes()
if XRInterface.XR_ENV_BLEND_MODE_OPAQUE in modes:
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
else:
return false
viewport.transparent_bg = false
environment.background_mode = Environment.BG_SKY
environment.ambient_light_source = Environment.AMBIENT_SOURCE_BG
return true
Тінь до непрозорості
Від тіні до непрозорості — це режим візуалізації для просторових шейдерів Godot, який був представлений у Godot 3 спеціально для AR. Це спеціальний режим візуалізації, коли чим більше поверхня перебуває в тіні, тим непрозорішою вона стає. Коли поверхня повністю освітлена, вона стає повністю прозорою і таким чином відображає реальний світ.
Однак поверхня ефективно відтворюється під час непрозорого стану. Це має два наслідки:
Оскільки записується як у буфер глибини, так і в буфер кольору, ми закриваємо будь-яку геометрію за нашою поверхнею, навіть якщо вона повністю прозора.
Оскільки ми робимо поверхню непрозорою, якщо вона перебуває в тіні, ми можемо дозволити віртуальним об’єктам відкидати тіні на об’єкти реального світу [2].
Зображення, що показує зміну тіні та непрозорості, що використовується для відображення робочого столу користувача.
Це дозволило наступні випадки використання:
Ви можете візуалізувати коробчату сітку навколо реального столу, це гарантує, що стіл залишається видимим, навіть якщо під ним розміщено віртуальний об’єкт. Віртуальний об'єкт буде правильно закритий. Розміщення віртуального об’єкта поверх столу реального світу призведе до відкидання тіні на стіл.
Ви можете використовувати шейдер у цьому режимі візуалізації, коли візуалізуєте сітку рук за допомогою функції відстеження рук, і переконайтеся, що ваші руки належним чином закривають віртуальні об’єкти.
Наступний код шейдера є хорошою основою для цієї функції:
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, shadow_to_opacity;
void fragment() {
ALBEDO = vec3(0.0, 0.0, 0.0);
}