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 ustawieniami środowiska przestrzennego aplikacji. Jest to kompozycja samodzielnego obrazu nieba i geometrii określonej w pliku 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 otoczeniu realizmu dzięki elementom na pierwszym i drugim planie, które dzięki efektowi 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 środowisko 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
: wskazuje, czy aktywność może w danym momencie ustawić własne środowisko przestrzenne.
Importowanie i wczytywanie zasobów środowiska przestrzennego
Zasoby glTF i EXR dla środowisk przestrzennych są ładowane asynchronicznie za pomocą klasy Session
.
Tworzenie zasobu glTF
Zasób glTF można utworzyć jako GltfModel
, gdzie glTF jest ładowany 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. Za pomocą ExrImage
możesz utworzyć plik ZIP z mapą IBL na potrzeby skyboxów. Więcej informacji znajdziesz w przewodniku na temat optymalizacji komponentów środowiska.
val lightingForSkybox = ExrImage.create(session, "BlueSkyboxLighting.zip")
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, a funkcja SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT
jest dostępna, preferowane środowisko przestrzenne aplikacji zostanie wyświetlone automatycznie.
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 mogła ustawić własne środowisko.
val spatialEnvironmentPreference = SpatialEnvironment.SpatialEnvironmentPreference(lightingForSkybox, environmentGeometry) val preferenceResult = session.scene.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ć ustawienie ś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 w 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 osiągnie stan, w którym można zmienić przezroczystość, i będzie dostępna funkcja SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
, 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.scene.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ć mechanizmy kontroli SpatialCapabilities
i dodać odbiornik, aby określić, kiedy chcesz ustawić preferencje dotyczące przezroczystości.addOnPassthroughOpacityChangedListener
Optymalizacja komponentów
Podczas tworzenia komponentów do ustawień użytkowników SpatialEnvironment
pamiętaj, aby komponenty miały wysoką rozdzielczość przy zachowaniu rozsądnego rozmiaru pliku. Więcej informacji znajdziesz w naszych wskazówkach dotyczących optymalizacji komponentów środowiska.
Określanie bieżącej przezroczystości przepuszczania
val currentPassthroughOpacity = session.scene.spatialEnvironment.getCurrentPassthroughOpacity()