W pakiecie Jetpack XR SDK środowiska przestrzenne to wciągające otoczenie, które możesz dodać do aplikacji, aby dostosować tło wirtualnej sceny. Środowiska przestrzenne są widoczne tylko wtedy, gdy aplikacja jest w Trybie pełnego pokoju.
Omówienie środowisk przestrzennych
SpatialEnvironment
służy do zarządzania preferencjami dotyczącymi środowiska przestrzennego aplikacji. Jest to kompozycja samodzielnego obrazu nieba i geometrii określonej w glTF. Za jednym razem można ustawić tylko jeden obraz nieba i jeden plik geometrii glTF.
Skybox to obraz, który użytkownik widzi wokół siebie w scenie wirtualnej, tworząc iluzję dalekiego tła, np. nieba, gór lub panoramy miasta. Użytkownik nie może wchodzić w interakcję z skyboxem ani zbliżać się do niego. Pakiet Jetpack XR SDK obsługuje sferyczne niebo w standardzie OpenEXR. Oprócz tworzenia tła 3D dla aplikacji, skybox EXR zapewnia też oświetlenie oparte na obrazie (IBL) dla modeli 3D wczytywanych przez aplikację. Więcej informacji znajdziesz w przewodniku po pracy z modelami 3D.
Środowiska przestrzenne mogą też zawierać treści geometryczne 3D w standardzie glTF. W ten sposób załadowana geometria otoczenia zostanie automatycznie dopasowana do podłogi w świecie rzeczywistym. Geometria otoczenia to świetny sposób na nadanie realizmu otoczeniu dzięki elementom na pierwszym i drugim planie, które za pomocą efektu paralaksy łączą się z niebem.
W wskazówkach dotyczących projektowania środowisk przestrzennych znajdziesz informacje o różnych typach zasobów, których możesz używać do tworzenia środowisk przestrzennych, oraz o tym, jak tworzyć bezpieczne i przyjemne środowiska przestrzenne.
Środowisko przestrzenne aplikacji możesz skonfigurować na 1 z 3 sposobów:
- Kombinacja obrazu nieba i geometrii glTF.
- Przeźroczysta powierzchnia, na której wyświetlane jest otoczenie z kamer skierowanych na zewnątrz urządzenia. Przy pełnej przezroczystości ta przezroczysta powierzchnia całkowicie zasłania niebo i geometrię.
- Konfiguracja mieszana, w której przezroczysta powierzchnia nie jest całkowicie przezroczysta ani całkowicie nieprzejrzysta. W tym przypadku przezroczysta powierzchnia staje się półprzezroczysta i miesza się z przezroczystością otaczającego ją nieba i geometrii.
Funkcje przestrzenne dla środowisk przestrzennych
SpatialCapabilities
: reprezentuje możliwości przestrzenne bieżącej sesji. Niektóre funkcje przestrzenne są przydatne w przypadku środowisk przestrzennych.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
: wskazuje, czy aktywność może obecnie włączyć lub wyłączyć przepuszczanie.SPATIAL_CAPABILITY_APP_ENVIRONMENT
: określa, czy aktywność może w danym momencie ustawić własne środowisko przestrzenne.
Importowanie i wczytywanie zasobów środowiska przestrzennego
Zasoby glTF i EXR do środowisk przestrzennych są ładowane asynchronicznie w klasie Session
. Te pliki muszą być przechowywane w folderze zasobów.
Tworzenie zasobu glTF
Zasób glTF można utworzyć jako GltfModel
, gdzie glTF jest wczytywany z pliku lokalnego. GltfModel
może być używany w ramach środowiska aplikacji przestrzennej.
val environmentGeometryFuture = GltfModel.create(session, "DayGeometry.glb") val environmentGeometry = environmentGeometryFuture.await()
Tworzenie zasobu obrazu EXR
Zasób obrazu EXR można utworzyć jako ExrImage
, gdzie plik EXR jest wczytywany z pliku lokalnego. ExrImage
może być używany jako część środowiska aplikacji przestrzennej do rysowania nieba.
val skybox = ExrImage.create(session, "BlueSkybox.exr")
Ustawianie opcji SpatialEnvironmentPreference w aplikacji
setSpatialEnvironmentPreference
służy do ustawienia preferowanego środowiska przestrzennego dla aplikacji. Ta metoda ustawia tylko preferencje i nie powoduje natychmiastowej zmiany, chyba że isSpatialEnvironmentPreferenceActive
jest już ustawiona na wartość true. Gdy urządzenie osiągnie stan, w którym można zmienić tło XR i uzyskać dostęp do funkcji SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT
, automatycznie wyświetli się preferowane środowisko przestrzenne aplikacji.
Ustawienie preferencji na null spowoduje wyłączenie preferowanego środowiska przestrzennego dla aplikacji, co oznacza, że zamiast niego wyświetli się domyślne środowisko systemowe.
Jeśli podany obiekt SpatialEnvironmentPreference
nie jest pusty, ale wszystkie jego właściwości są puste, środowisko przestrzenne będzie składać się z czarnego nieba i nie będzie zawierać geometrii.
Aby otrzymywać powiadomienia o zmianach stanu SpatialEnvironment, użyj elementu addOnSpatialEnvironmentChangedListener
.
Podstawowe użycie
Ten fragment kodu tworzy geometrię środowiska i zasoby nieba i następnie ustawia ustawienie środowiska przestrzennego. To ustawienie zostanie zapamiętane i zastosowane, gdy aplikacja będzie mieć możliwość skonfigurowania własnego środowiska.
val spatialEnvironmentPreference = SpatialEnvironment.SpatialEnvironmentPreference(skybox, environmentGeometry) val preferenceResult = session.spatialEnvironment.setSpatialEnvironmentPreference(spatialEnvironmentPreference) if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangeApplied()) { // The environment was successfully updated and is now visible, and any listeners // specified using addOnSpatialEnvironmentChangedListener will be notified. } else if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangePending()) { // The environment is in the process of being updated. Once visible, any listeners // specified using addOnSpatialEnvironmentChangedListener will be notified. }
Zaawansowane użycie
W zaawansowanych przypadkach, gdy potrzebujesz większej kontroli nad środowiskiem, możesz uwzględnić kontrole SpatialCapabilities
i wdrożyć addOnSpatialEnvironmentChangedListener
, aby określić, kiedy chcesz ustawić preferencje dotyczące środowiska przestrzennego.
Ustawianie wartości preferencji PassthroughOpacityPreference dla środowiska przestrzennego w aplikacji
Jednym z komponentów wirtualnego tła w aplikacji jest przezroczysta powierzchnia. W tym przypadku tło to obraz z kamery skierowanej na zewnątrz.
setPassthroughOpacityPreference
służy do ustawienia preferowanej przezroczystości dla aplikacji. Ta metoda ustawia tylko preferencje i nie powoduje natychmiastowej zmiany, chyba że funkcja SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
jest dostępna. Gdy urządzenie znajdzie się w stanie, w którym można zmienić przezroczystość przezroczystości, a funkcja SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
jest dostępna, preferowana przezroczystość aplikacji zostanie zastosowana automatycznie.
Wartości preferencji przezroczystości obrazu mieszczą się w zakresie od 0.0f
(przezroczystość 0, gdy przezroczysta powierzchnia jest niewidoczna) do 1.0f
(przezroczystość 1, gdy przezroczysta powierzchnia ukrywa środowisko przestrzenne). Parametr setPassthroughOpacityPreference
to zmienna typu float, która może być pusta. Ustawienie wartości null wskazuje, że aplikacja nie ma preferencji dotyczącej przezroczystości, i zwróci kontrolę nad przezroczystością systemowi.
Podstawowe użycie
Ten fragment kodu ustawia preferencję przejrzystości. To ustawienie zostanie zapamiętane i zastosowane, gdy aplikacja będzie mogła ustawić przezroczystość.
val preferenceResult = session.spatialEnvironment.setPassthroughOpacityPreference(1.0f) if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangeApplied()) { // The passthrough opacity request succeeded and should be visible now, and any listeners // specified using addOnPassthroughOpacityChangedListener will be notified } else if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangePending()) { // The passthrough opacity preference was successfully set, but not // immediately visible. The passthrough opacity change will be applied // when the activity has the // SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL capability. // Then, any listeners specified using addOnPassthroughOpacityChangedListener // will be notified }
Zaawansowane użycie
W bardziej zaawansowanych przypadkach, gdy potrzebujesz większej kontroli nad przezroczystością, możesz zastosować SpatialCapabilities
i dodać odbiornik, używając addOnPassthroughOpacityChangedListener
, aby określić, kiedy chcesz ustawić preferencje dotyczące przezroczystości.
Optymalizacja komponentów
Podczas tworzenia zasobów do ustawiania SpatialEnvironment
użytkowników musisz zadbać o to, aby miały one wysoką rozdzielczość przy rozsądnym rozmiarze pliku. Upewnij się, że plik glb używa map MIP i tekstur KTX2. Należy też zwrócić uwagę na liczbę wielokątów w plikach glb, ponieważ duża ich liczba może spowodować niepotrzebne zużycie energii. Większość rozmiaru pliku w przypadku większości instancji SpatialEnvironment
to obraz użyty do Skyboxa. Aby mieć pewność, że obrazy są zoptymalizowane, przeprowadź zasoby przez narzędzie do optymalizacji (np. ktx).
Określanie bieżącej przezroczystości przepuszczania
val currentPassthroughOpacity = session.spatialEnvironment.getCurrentPassthroughOpacity()