Dodawanie środowisk przestrzennych do aplikacji

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

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()

Zobacz również