Dodawanie modeli 3D do aplikacji

Odpowiednie urządzenia XR
Te wskazówki pomogą Ci tworzyć treści na te urządzenia XR.
Gogle XR
Przewodowe okulary XR

Podczas pracy z modelami 3D pakiet Jetpack XR SDK obsługuje otwarty standard glTF 2.0. Gdy Android XR renderuje aplikacje utworzone za pomocą pakietu Jetpack XR SDK, modele 3D są renderowane przy użyciu technik renderowania opartego na fizyce(PBR) określonych w standardzie glTF 2.0 (wraz z obsługiwanymi rozszerzeniami). Większość narzędzi do tworzenia treści cyfrowych (DCC), takich jak Autodesk Maya, Maxon ZBrush, Blender i Spline, może eksportować modele 3D do formatu glTF (pliki .gltf lub .glb).

Jeśli użytkownik lub Twoja aplikacja określi SpatialEnvironment skybox, modele 3D będą oświetlane na podstawie informacji o oświetleniu dostarczonych przez skybox środowiska. Materiały odblaskowe i odbicia lustrzane będą również odzwierciedlać niebo w środowisku. Jeśli tryb podglądu został włączony, oświetlenie, odbicia i odblaski będą oparte na prostym, jasnym pomieszczeniu z jednym światłem kierunkowym.

Krótkie omówienie obsługiwanych materiałów znajdziesz w sekcji glTF PBR Properties na stronie Khronos.

Aplikacje utworzone za pomocą pakietu Jetpack XR SDK mogą wczytywać modele 3D na 2 główne sposoby.

Umieszczanie modelu 3D w przestrzeni aktywności

Gdy masz już plik glTF, następnym krokiem jest dodanie go do katalogu zasobów w Android Studio. Zalecamy utworzenie modelskatalogu, aby lepiej uporządkować typy komponentów.

Przykład dodawania komponentów do katalogu /models

Aby wczytać model glTF, wywołaj funkcję GltfModel.create().

val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))

Na tym etapie model jest wczytywany do pamięci, ale nie jest jeszcze renderowany. Jeśli masz do wczytania wiele modeli 3D lub model jest duży, warto wczytać je asynchronicznie z wyprzedzeniem. Dzięki temu użytkownicy nie muszą czekać na załadowanie modeli do pamięci.

Musimy dodać plik glTF do ActivitySpace. Wywołaj GltfModelEntity.create, aby utworzyć element i umieścić go w ActivitySpace. Zalecamy sprawdzenie, czy aplikacja jest w stanie, który umożliwia korzystanie z funkcji przestrzennych.

if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) {
    val gltfEntity = GltfModelEntity.create(session, gltfModel)
}

Po uruchomieniu aplikacji powinien być widoczny wczytany model 3D.

Przykład wczytanego modelu 3D

Umieszczanie modelu 3D w komponencie Compose SceneCoreEntity

Nadal musisz wczytać plik glTF do pamięci za pomocą funkcji GltfModel.create(), ale jeśli tworzysz interfejs za pomocą Jetpack Compose for XR, możesz umieścić modele 3D w funkcji SceneCoreEntity. Zapoznaj się z sekcją Używanie elementu SceneCoreEntity do umieszczania obiektu 3D w układzie.

Animowanie modeli 3D

Zgodnie ze specyfikacją glTF modele 3D mogą mieć osadzone animacje. Animacje szkieletowe (z riggingiem), sztywne i z celami morfingu (kształtami mieszania) są obsługiwane w pakiecie Jetpack XR SDK. Obsługiwane są też animacje materiałów utworzone za pomocą KHR_animation_pointerrozszerzenia glTF.

Aby odtworzyć animację, wywołaj funkcję startAnimation() i podaj nazwę animacji. Możesz opcjonalnie określić, czy animacja ma być odtwarzana w nieskończonej pętli.

gltfEntity.startAnimation(loop = true, animationName = "Walk")

Jeśli wywołasz interfejs startAnimation po raz drugi, bieżąca animacja zostanie zatrzymana i rozpocznie się nowa.

Możesz sprawdzić bieżący stan animacji za pomocą metody getAnimationState().

Jeśli nazwa animacji podana podczas wywoływania funkcji startAnimation() nie istnieje, wywołanie zakończy się niepowodzeniem bez powiadomienia, wszystkie uruchomione animacje zostaną zatrzymane, a funkcja getAnimationState() zwróci wartość STOPPED.

Wczytywanie modelu 3D za pomocą przeglądarki scen

Jeśli szukasz najprostszego sposobu wczytania modelu 3D z podstawowymi funkcjami interakcji, możesz użyć przeglądarki scen tak jak na urządzeniu mobilnym. Kluczową różnicą między Scene Viewer na Androidzie XR a Scene Viewer na urządzeniach mobilnych jest to, że Scene Viewer obsługuje tylko parametr URI pliku wskazujący plik glTF, a wszystkie inne parametry są ignorowane.

Przeglądarka scen to osobna aplikacja, która jest wywoływana za pomocą intencji i działa w trybie pełnej przestrzeni. W rezultacie po wywołaniu tej funkcji aplikacja nie będzie już widoczna, a aplikacja Scene Viewer będzie aktywna. Wszystkie środowiska, które zostały przez Ciebie zmienione, zostaną przywrócone do ustawień systemowych użytkownika.

Oto przykład użycia Intent do wyświetlenia pliku glTF w przeglądarce scen na Androidzie XR:

val url =
    "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Avocado/glTF/Avocado.gltf"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
    Uri.parse("https://arvr.google.com/scene-viewer/1.2")
        .buildUpon()
        .appendQueryParameter("file", url)
        .build()
sceneViewerIntent.setData(intentUri)
try {
    startActivity(sceneViewerIntent)
} catch (e: ActivityNotFoundException) {
    // There is no activity that could handle the intent.
}

Więcej informacji o opcjach interaktywności w przeglądarce scen znajdziesz w naszej dokumentacji dotyczącej projektowania modeli 3D.

Rozszerzenia glTF

Pakiet Jetpack XR SDK obsługuje kilka rozszerzeń gfTF, które zwiększają możliwości modeli 3D. Te funkcje są dostępne zarówno w GltfModelEntity, jak i w przeglądarce scen.