Dodawanie modeli 3D do aplikacji

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 za pomocą technik renderingu 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 aplikacja określił(a) niebo SpatialEnvironment, modele 3D będą oświetlane za pomocą informacji o oświetleniu pochodzących z nieba. Materiały odbijające światło i odbicia selektywne będą odbijać niebo. Jeśli opcja Przepuszczanie jest włączona, oświetlenie, odbicia i odbłyski będą oparte na prostym, jasnym pomieszczeniu z jednym światłem kierunkowym.

Krótki przegląd obsługiwanych materiałów znajdziesz w specyfikacji glTF PBR na stronie Khronos.

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

Umieszczenie modelu 3D w ActivitySpace

Po utworzeniu pliku glTF należy go dodać do katalogu zasobów w Android Studio. Zalecamy utworzenie katalogu models, aby lepiej uporządkować typy zasobów.

Przykład dodawania zasobów do katalogu /models

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

val gltfModel = GltfModel.create(session, "models/saturn_rings.glb").await()

W tym momencie model jest wczytywany do pamięci, ale nie jest jeszcze renderowany. Jeśli masz dużo modeli 3D do załadowania lub Twój model jest duży, warto je załadować 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 funkcję GltfModelEntity.create, aby utworzyć element i umieścić go w ActivitySpace. Zalecamy sprawdzenie, czy aplikacja jest w stanie, w którym można korzystać z funkcji przestrzennych.

if (session.scene.spatialCapabilities
    .hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)
) {
    val gltfEntity = GltfModelEntity.create(session, gltfModel)
}

Teraz, gdy uruchomisz aplikację, powinien się wyświetlić wczytany model 3D.

Przykład załadowanego modelu 3D

Umieszczenie modelu 3D w składzie

Nadal musisz wczytywać plik glTF do pamięci za pomocą funkcji GltfModel.create(), ale jeśli tworzysz interfejs użytkownika za pomocą Jetpack Compose for XR, możesz umieszczać modele 3D w Volume. Zapoznaj się z artykułem Używanie objętości do umieszczania obiektów 3D na stronie.

Animowanie modeli 3D

Zgodnie ze specyfikacją glTF modele 3D mogą zawierać osadzone animacje. Pakiet SDK Jetpack XR obsługuje animacje szkieletowe (z rigiem), sztywnych obiektów oraz animacje morph target (kształty przejściowe). Obsługiwane są też animacje materiałów utworzone za pomocą rozszerzenia KHR_animation_pointer glTF.

Aby odtworzyć animację, wywołaj funkcję startAnimation() i wskaż nazwę animacji. Opcjonalnie możesz określić, czy animacja ma się odtwarzać w pętli.

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

Po wywołaniu startAnimation po raz drugi bieżąca animacja zostanie zatrzymana i rozpocznie się nowa.

Bieżący stan animacji możesz sprawdzić za pomocą elementu getAnimationState().

Jeśli nazwa animacji podana podczas wywołania funkcji startAnimation() nie istnieje, wywołanie zakończy się bez żadnego komunikatu, 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 na załadowanie modelu 3D z podstawowymi funkcjami interakcji, możesz użyć narzędzia Scene Viewer tak jak na urządzeniu mobilnym. Główna różnica między aplikacją Scene Viewer na Androida XR a na urządzenia mobilne polega na tym, że Scene Viewer obsługuje tylko parametr URI pliku wskazujący na plik glTF. Wszystkie inne parametry są ignorowane.

Scene Viewer to osobna aplikacja, która jest wywoływana za pomocą intencji i działa w trybie pełnego widoku. W efekcie, gdy go wywołasz, Twoja aplikacja nie będzie już widoczna, a program Scene Viewer będzie miał fokus. Wszystkie zmienione środowiska zostaną przywrócone do ustawień systemowych użytkownika.

Oto przykład użycia Intent do wyświetlenia pliku glTF w przeglądarce Scene Viewer na urządzeniu z Androidem 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 interakcji w Scene Viewer znajdziesz w dokumentacji dotyczącej projektowania modeli 3D.

rozszerzenia glTF,

Pakiet Jetpack XR SDK obsługuje kilka rozszerzeń glTF, które zwiększają możliwości modeli 3D. Te funkcje są dostępne w GltfEntityi w narzędziu do przeglądania scen.