Jeśli masz już projekt XR w Godot, możesz dodać obsługę Androida XR bez rozpoczynania nowego, oddzielnego projektu. Niektóre kroki są wymagane w przypadku wszystkich projektów, a inne są opcjonalne w zależności od funkcji XR używanych w projekcie. W poszczególnych krokach podajemy linki do różnych projektów open source Godot XR, które obsługują Androida XR, a także do odpowiednich żądań scalenia, które pokazują zmiany wymagane do włączenia określonych funkcji.
Wymagane czynności w przypadku wszystkich projektów
Wykonaj czynności opisane w tych tematach, niezależnie od tego, jakie funkcje XR obsługuje Twój projekt. Następnie zapoznaj się z funkcjami wymienionymi na liście opcjonalnych kroków, aby sprawdzić, czy Twój projekt wymaga dodatkowych działań.
Aktualizowanie Godota i wtyczki Godot OpenXR Vendors
Aby zaktualizować projekt do najnowszych wymaganych wersji i skonfigurować ustawienia projektu dla Androida XR:
- Zaktualizuj Godota do wersji 4.6.2 lub nowszej. Jeśli potrzebujesz dodatkowej pomocy dotyczącej projektu, zapoznaj się z dokumentacją na temat migracji do nowej wersji.
Pobierz wtyczkę Godot OpenXR Vendors Plugin w wersji 5.1 lub nowszej ze Sklepu z komponentami, biblioteki komponentów lub repozytorium w GitHubie.
Skonfiguruj ustawienia projektu na urządzeniu z Androidem XR:
- Dodaj gotowe ustawienia eksportu dla Androida XR.
- Włącz opcję Użyj kompilacji Gradle.
- W sekcji Funkcje XR wybierz OpenXR w polu Tryb XR, a następnie wybierz Włącz wtyczkę AndroidXR.
Dodawanie obsługi śledzenia rąk
Kontrolery mogą być dostępne, ale główną metodą wprowadzania danych na goglach i okularach XR z Androidem XR jest śledzenie rąk. Jeśli to możliwe, dodaj do projektu Godot obsługę śledzenia dłoni.
Dodawanie obsługi śledzenia rąk: konfigurowanie ustawień projektu
Najpierw wykonaj te czynności, aby skonfigurować ustawienia projektu i włączyć śledzenie dłoni oraz powiązane z nim rozszerzenia OpenXR.
- Otwórz ustawienia projektu i przejdź do sekcji Ogólne > XR > OpenXR.
W sekcji Rozszerzenia wybierz Śledzenie dłoni i Profil interakcji z dłońmi.
W sekcji Rozszerzenia znajdź podsekcję Meta i wybierz Siatka śledzenia dłoni oraz Celowanie śledzeniem dłoni.
Dodawanie obsługi śledzenia rąk: dodawanie i konfigurowanie węzłów kontrolera
Zamiast dynamicznie modyfikować istniejące węzły XRController3D na potrzeby śledzenia dłoni, dodaj węzły kontrolera do śledzenia i wyświetlania modeli dłoni oraz obsługi danych wejściowych z rozszerzenia Hand Tracking Aim:
Dodaj do węzła
XROrigin3D3 dodatkowe węzłyXRController3D.- Nadaj mu nazwę „HandTrackingLeft” i ustaw właściwość trackera na
/user/hand_tracker/left. - Nadaj mu nazwę „HandTrackingRight” i ustaw właściwość trackera na
/user/hand_tracker/right. - Nazwij ostatni element „HandTrackingAimLeft” i ustaw właściwość trackera na
/user/fbhandaim/left.
Jeśli oryginalne węzły projektu
XRController3Dmiały nazwy „XRController3D_left” i „XRController3D_right”, scena będzie wyglądać mniej więcej tak:
- Nadaj mu nazwę „HandTrackingLeft” i ustaw właściwość trackera na
Połącz sygnał
tracking_changedna HandTrackingLeft i HandTrackingRight z poszczególnymi funkcjami, które aktualizują widoczność odpowiednich trackerów kontrolera (XRController3D_left i XRController3D_right w poprzednim przykładzie).Na przykład funkcja połączona z sygnałem w HandTrackingLeft może wyglądać tak:
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingWłącz właściwość Show When Tracked w węzłach kontrolera śledzenia rąk.
Teraz Twój projekt może wizualnie przełączać się między modelami kontrolerów i modelami śledzenia rąk w zależności od tego, czy użytkownik korzysta ze śledzenia rąk czy z kontrolerów.
Dodaj kilka węzłów
OpenXRFbHandTrackingMeshjako węzły podrzędne do węzłów kontrolera śledzenia rąk.Dodaj węzły
XRHandModifier3Djako elementy podrzędne tych węzłówOpenXRFbHandTrackingMesh, upewniając się, że ustawiona jest prawidłowa właściwość Hand Tracker, aby zastosować do modeli dane śledzenia rąk w czasie rzeczywistym.
Dodawanie obsługi śledzenia rąk: konfigurowanie profilu interakcji z dłońmi na mapie działań OpenXR
Następnie skonfiguruj profil Interakcja dłonią w mapowaniu działań OpenXR:
- Otwórz menu OpenXR Action Map u dołu edytora.
- Usuń profil Simple Controller, aby uniknąć problemów z kompatybilnością z kontrolerami Galaxy XR.
- Kliknij Add Profile (Dodaj profil), wybierz Hand Interaction (Interakcja z dłonią) i kliknij OK.
Zmapuj ten profil na co najmniej 1 zestaw działań w dowolny sposób.
W zależności od wymagań aplikacji możesz też dostosować sposób, w jaki aplikacja obsługuje dane wejściowe użytkownika za pomocą śledzenia rąk.
Dodawanie obsługi śledzenia rąk: konfigurowanie gestu menu na urządzeniu z Androidem XR
Możesz też wdrożyć gest menu na Androidzie XR. Wyświetla ikonę, gdy lewa ręka gracza znajduje się w prawidłowej pozycji do wykonania gestu menu, a także wyświetla lub ukrywa menu, gdy użytkownik wykona gest. Do tego celu użyjesz węzła HandTrackingAimLeft, który został dodany wcześniej.
Dodaj billboardowy czworokąt do lewego węzła śledzenia rąk, który będzie wyświetlać wybraną przez Ciebie ikonę (zobacz węzeł MenuIcon na poniższym obrazie z węzłów kontrolera dodanych wcześniej).
Połącz sygnały
button_pressedibutton_releasedw HandTrackingAimLeft z funkcjami takimi jak ta:@onready var menu_icon: MeshInstance3D = $XROrigin3D/HandTrackingLeft/MenuIcon func _on_hand_tracking_aim_left_button_pressed(p_name): if p_name == "menu_pressed": toggle_menu() elif p_name == "menu_gesture": if OS.has_feature("androidxr"): menu_icon.visible = true func _on_hand_tracking_aim_left_button_released(p_name): if p_name == "menu_gesture": menu_icon.visible = false
Opcjonalne czynności w przypadku niektórych funkcji
Po wykonaniu wymaganych czynności w projekcie możesz zdecydować, czy w przypadku niektórych funkcji musisz wykonać dodatkowe działania, w zależności od wymagań i możliwości aplikacji. Więcej informacji o każdej z tych opcjonalnych funkcji znajdziesz w odpowiednich sekcjach.
Rejestrowanie ściśnięć jako naciśnięć przycisków
W Androidzie XR szczypanie jest używane do wielu podstawowych działań systemowych, takich jak wybieranie elementów, przewijanie, przesuwanie lub zmienianie rozmiaru okien oraz przesuwanie elementów interfejsu lub obiektów w przestrzeni 2D i 3D. Aby zachować spójność z tymi wzorcami i zapewnić użytkownikom wygodę, aplikacja powinna rejestrować ściśnięcia palców podobnie jak naciśnięcia przycisków na kontrolerze podczas korzystania ze śledzenia rąk.
Aby skonfigurować aplikację w ten sposób, użyj wartości zmiennoprzecinkowych podanych w utworzonym przez Ciebie profilu interakcji dłoni, aby utworzyć wirtualne działanie:
const PRESSED_THRESHOLD := 0.8
const RELEASED_THRESHOLD := 0.6
@onready var left_controller: XRController3D = $XROrigin/XRController3D_left
func _on_xr_controller_3d_left_input_float_changed(p_name: String, value: float):
if p_name == "pinch":
var xr_tracker = XRServer.get_tracker(left_controller.tracker)
if _left_hand_pinching:
if value < RELEASED_THRESHOLD:
_left_hand_pinching = false
xr_tracker.set_input("pinch_pressed", false)
else:
if value > PRESSED_THRESHOLD:
_left_hand_pinching = true
xr_tracker.set_input("pinch_pressed", true)
Najważniejsze informacje o kodzie
- Sprawdza, czy wartość
floatjest większa lub mniejsza od określonych progów w sygnałachXRController3Dinput_float_changed. - Tworzy wirtualne działanie o nazwie
pinch_pressed.
Korzystanie z funkcji narzędzi XR w połączeniu ze śledzeniem rąk
Wiele projektów Godot XR korzysta z Godot XR Tools, w tym niektóre projekty open source, do których linki znajdziesz na tej stronie. Aby niektóre funkcje XR Tools, takie jak FunctionPointer w przypadku interakcji z menu, działały prawidłowo, musisz dodać dodatkowy kod, który będzie zamieniać działanie, którego szuka funkcja, gdy użytkownik przełączy się na śledzenie rąk.
Na przykład podczas korzystania z FunctionPointer do interakcji z menu zaktualizuj właściwość active_button_action do działania śledzenia rąk na podstawie sygnału tracking_changed węzłów XRController3D śledzenia rąk (w poprzednich krokach konfiguracji śledzenia rąk te węzły to HandTrackingLeft i HandTrackingRight).
const TRIGGER_POINTER_ACTION = "trigger_click"
const PINCH_POINTER_ACTION = "pinch_pressed"
@onready var func_point_left: XRToolsFunctionPointer = %FunctionPointerLeft
func _on_hand_tracking_left_tracking_changed(tracking: bool) -> void:
if tracking:
func_point_left.active_button_action = PINCH_POINTER_ACTION
else:
func_point_left.active_button_action = TRIGGER_POINTER_ACTION
Najważniejsze informacje o kodzie
- Ten kod korzysta z
pinch_pressedwirtualnego działania, które możesz utworzyć, aby rejestrować ściśnięcia jako naciśnięcia przycisku.
Używanie śledzenia rąk w połączeniu ze sztucznym przemieszczaniem się
Jeśli Twój projekt wykorzystuje sztuczne przemieszczanie się, śledzenie rąk jest nadal możliwe. Możesz na przykład stworzyć system ruchu, który pozwala graczom rysować ścieżki, po których będą się poruszać, lub umożliwić im przyspieszanie poprzez poruszanie rękami w górę i w dół, a także wykonywanie dodatkowych gestów do skakania, wspinania się i szybowania.
The Museum of All Things wykorzystuje sztuczne przemieszczanie się za pomocą drążków na kontrolerach. Lokomocja oparta na śledzeniu rąk została zaimplementowana przez dodanie „wirtualnych drążków analogowych”, które gracz aktywuje, ściskając palce w powietrzu i przesuwając rękę w kierunku, w którym chce przesunąć drążek.
Oto kilka najważniejszych wniosków z żądania pull, które wprowadziło tę obsługę:
- Scena
XRVirtualThumbstickjest tworzona po wykryciu uszczypnięcia. - Podczas przytrzymywania gestu szczypnięcia względna odległość i kierunek od pierwotnego miejsca szczypnięcia są przekształcane w wartość
Vector2i mapowane wirtualnie na normalne dane wejściowe drążka. - Gracz otrzymuje też wizualną informację zwrotną w postaci 2 siatek czworokątnych, które ilustrują położenie drążka.
Możesz zastosować podobne podejście, aby przy minimalnych zmianach dostosować istniejący kod sterowania ruchem za pomocą drążka. Jednak Twój projekt może nadal wymagać niestandardowego rozwiązania w zakresie lokomocji do śledzenia rąk.
Dodawanie obsługi przekazywania
Możesz dodać do aplikacji obsługę przekazywania obrazu, aby użytkownicy mogli widzieć otoczenie w rzeczywistym świecie.
Aby to zrobić w przypadku swojej aplikacji, wprowadź te zmiany w kodzie:
- Ustaw wartość
environment_blend_modew przypadkuXRInterfaceOpenXR naXR_ENV_BLEND_MODE_ALPHA_BLEND. - Ustaw wartość
background_modewęzłaWorldEnvironmentnaBG_COLOR. - Ustaw
background_colorwęzłaWorldEnvironmentna dowolny kolor, który jest całkowicie przezroczysty. - Ustaw właściwość
Viewport transparent_bgnatrue.
Korzystanie z rozszerzenia do szacowania oświetlenia
Włączając tryb passthrough, rozważ użycie rozszerzenia Android XR Light Estimation OpenXR. To rozszerzenie dostosowuje właściwości elementów WorldEnvironment i DirectionalLight3D, aby lepiej naśladować oświetlenie w rzeczywistym otoczeniu użytkownika. Dzięki temu wirtualne obiekty lepiej wtapiają się w rzeczywiste warunki oświetleniowe. Możesz włączyć to rozszerzenie w ustawieniach projektu.
- Otwórz ustawienia projektu i przejdź do sekcji Ogólne > XR > OpenXR.
W sekcji Androidxr wybierz Light Estimation (Szacowanie oświetlenia).
Dodaj do drzewa scen węzeł
OpenXRAndroidLightEstimationi połącz go z węzłamiWorldEnvironmentiDirectionalLight3Dsceny.
Przykład: włączanie i wyłączanie trybu widoku otoczenia oraz szacowania oświetlenia
Ten kod włącza lub wyłącza przekazywanie i szacowanie oświetlenia:
@onready var world_environment = $WorldEnvironment
@onready var directional_light = $DirectionalLight3D
@onready var directional_light_orig_transform: Transform3D = directional_light.transform
func set_passthrough_enabled(p_enabled: bool) -> void:
var xr_interface = XRServer.find_interface("OpenXR")
if xr_interface == null:
return
var supported_blend_modes = xr_interface.get_supported_environment_blend_modes()
if not supported_blend_modes.has(XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND):
return
# Passthrough
if p_enabled:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_STAGE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
world_environment.environment.background_mode = Environment.BG_COLOR
world_environment.environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
get_viewport().transparent_bg = true
else:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_ROOMSCALE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
world_environment.environment.background_mode = Environment.BG_SKY
get_viewport().transparent_bg = false
# Light Estimation
if OS.has_feature("androidxr"):
var light_estimation = Engine.get_singleton("OpenXRAndroidLightEstimationExtension")
if p_enabled and light_estimation.is_light_estimation_supported():
light_estimation.start_light_estimation()
elif light_estimation.is_light_estimation_started():
light_estimation.stop_light_estimation()
directional_light.transform = directional_light_orig_transform
Najważniejsze informacje o kodzie
- Po wyłączeniu szacowania oświetlenia należy ręcznie przywrócić pierwotny kierunek
DirectionalLight3D. - Pełny przykład projektu wykorzystującego przekazywanie i szacowanie oświetlenia znajdziesz w Expedition to Blobotopia w GitLabie.