Dodawanie obsługi Androida XR do istniejącego projektu XR w Godot

Odpowiednie urządzenia XR
Te wskazówki pomogą Ci tworzyć rozwiązania na te typy urządzeń XR.
Gogle XR
Przewodowe okulary XR

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:

  1. 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.
  2. Pobierz wtyczkę Godot OpenXR Vendors Plugin w wersji 5.1 lub nowszej ze Sklepu z komponentami, biblioteki komponentów lub repozytorium w GitHubie.

  3. Skonfiguruj ustawienia projektu na urządzeniu z Androidem XR:

    1. Dodaj gotowe ustawienia eksportu dla Androida XR.
    2. Włącz opcję Użyj kompilacji Gradle.

    Włącz

    1. W sekcji Funkcje XR wybierz OpenXR w polu Tryb XR, a następnie wybierz Włącz wtyczkę AndroidXR.

    Skonfiguruj opcje w

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.

  1. Otwórz ustawienia projektu i przejdź do sekcji Ogólne > XR > OpenXR.
  2. W sekcji Rozszerzenia wybierz Śledzenie dłoni i Profil interakcji z dłońmi.

    Skonfiguruj opcje w

  3. W sekcji Rozszerzenia znajdź podsekcję Meta i wybierz Siatka śledzenia dłoni oraz Celowanie śledzeniem dłoni.

    Skonfiguruj opcje w

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:

  1. Dodaj do węzła XROrigin3D 3 dodatkowe węzły XRController3D.

    1. Nadaj mu nazwę „HandTrackingLeft” i ustaw właściwość trackera na /user/hand_tracker/left.
    2. Nadaj mu nazwę „HandTrackingRight” i ustaw właściwość trackera na /user/hand_tracker/right.
    3. Nazwij ostatni element „HandTrackingAimLeft” i ustaw właściwość trackera na /user/fbhandaim/left.

    Jeśli oryginalne węzły projektu XRController3D miały nazwy „XRController3D_left” i „XRController3D_right”, scena będzie wyglądać mniej więcej tak:

    Jak może wyglądać scena po dodaniu węzłów kontrolera.

  2. Połącz sygnał tracking_changed na HandTrackingLeftHandTrackingRight z poszczególnymi funkcjami, które aktualizują widoczność odpowiednich trackerów kontrolera (XRController3D_leftXRController3D_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 tracking
    
  3. Włą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.

  4. Dodaj kilka węzłów OpenXRFbHandTrackingMesh jako węzły podrzędne do węzłów kontrolera śledzenia rąk.

  5. Dodaj węzły XRHandModifier3D jako elementy podrzędne tych węzłów OpenXRFbHandTrackingMesh, upewniając się, że ustawiona jest prawidłowa właściwość Hand Tracker, aby zastosować do modeli dane śledzenia rąk w czasie rzeczywistym.

    Jak może wyglądać scena po dodaniu węzłów podrzędnych do węzłów kontrolera.

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ąmapowaniu działań OpenXR:

  1. Otwórz menu OpenXR Action Map u dołu edytora.
  2. Usuń profil Simple Controller, aby uniknąć problemów z kompatybilnością z kontrolerami Galaxy XR.
  3. Kliknij Add Profile (Dodaj profil), wybierz Hand Interaction (Interakcja z dłonią) i kliknij OK.
  4. 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.

  1. 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).

    Jak może wyglądać scena po dodaniu węzłów podrzędnych do węzłów kontrolera.

  2. Połącz sygnały button_pressedbutton_releasedHandTrackingAimLeft 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ść float jest większa lub mniejsza od określonych progów w sygnałach XRController3D input_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 HandTrackingLeftHandTrackingRight).

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

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 XRVirtualThumbstick jest 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ść Vector2 i 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_mode w przypadku XRInterface OpenXR na XR_ENV_BLEND_MODE_ALPHA_BLEND.
  • Ustaw wartość background_mode węzła WorldEnvironment na BG_COLOR.
  • Ustaw background_color węzła WorldEnvironment na dowolny kolor, który jest całkowicie przezroczysty.
  • Ustaw właściwość Viewport transparent_bg na true.

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 WorldEnvironmentDirectionalLight3D, 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.

  1. Otwórz ustawienia projektu i przejdź do sekcji Ogólne > XR > OpenXR.
  2. W sekcji Androidxr wybierz Light Estimation (Szacowanie oświetlenia).

    Skonfiguruj opcje w

  3. Dodaj do drzewa scen węzeł OpenXRAndroidLightEstimation i połącz go z węzłami WorldEnvironmentDirectionalLight3D sceny.

    Opcje dotyczące

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.