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 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 środowiska zostanie automatycznie dopasowana do podłogi w rzeczywistym świecie. Geometria otoczenia to świetny sposób na nadanie realizmu otoczeniu za pomocą elementów na pierwszym i drugim planie, które dzięki efektowi paralaksy płynnie przechodzą w niebo.

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 jeden z tych 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ą tła nieba i geometryi.

Funkcje przestrzenne dla środowisk przestrzennych

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.

// assume that session is a Session that has been previously created
val environmentGeometryFuture = session.createGltfResourceAsync("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. Element ExrImage może być używany w ramach aplikacji przestrzennej do tworzenia nieba.

// assume that session is a Session that has been previously created
val skyboxExrFuture = session.createExrImageResourceAsync("BlueSkybox.exr")

val skyboxExr = skyboxExrFuture.await()

Ustawianie preferencji środowiska przestrzennego 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 dla 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ść ustawienia własnego środowiska.

// Assume that session is a Session that has been previously created

// Create a GLTFResource
val environmentGeometry = session.createGltfResourceAsync("DayGeometry.glb").await()

// Create an ExrImage for the skybox
val skyboxExr = session.createExrImageResourceAsync("BlueSkybox.exr").await()

val spatialEnvironmentPreference = SpatialEnvironmentPreference(skyboxExr, 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 zastosowaniach, w których potrzebujesz większej kontroli nad środowiskiem, możesz uwzględnić SpatialCapabilities sprawdzanie i wdrożyć addOnSpatialEnvironmentChangedListener, aby określić, kiedy chcesz ustawić preferencje ś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 przejrzystoś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ść.

// Assume that session is a Session that has been previously created

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 włączyć SpatialCapabilities i wdrożyć 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 liczba wielokątów 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()

Zobacz również