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 extensions). Większość narzędzi do tworzenia cyfrowego zawartości, takich jak Autodesk Maya, Maxon ZBrush, BlenderSpline, 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 zawartych w niebie środowiska. Odbijające światło materiały i odbicia 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

Gdy masz już plik glTF, dodaj go do katalogu Assets 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ę createGltfResourceAsync.

// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()

W tym momencie model jest wczytywany do pamięci, ale nie jest jeszcze renderowany. Jeśli masz wiele 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ę createGltfEntity, aby utworzyć element i umieścić go w ActivitySpace. Zalecamy sprawdzenie, czy aplikacja jest w stanie, w którym umożliwia korzystanie z funkcji przestrzennych.

// check for spatial capabilities
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)){
  // create the gltf entity using the gltf file from the previous snippet
   val gltfEntity = xrSession.createGltfEntity(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ć pliki glTF do pamięci za pomocą funkcji createGltfResourceAsync, ale jeśli tworzysz interfejs za pomocą Jetpack Compose na potrzeby XR, możesz umieszczać modele 3D w Volume. Zapoznaj się z artykułem Umieszczanie obiektów 3D w układzie za pomocą objętości.

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 (z kształtami mieszania). Obsługiwane są też animacje materiałów utworzone za pomocą rozszerzenia KHR_animation_pointer glTF.

Aby odtworzyć animację, wywołaj funkcję startAnimation i podaj nazwę animacji. Opcjonalnie możesz określić, czy animacja ma być odtwarzana w nieskończoność.

//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")

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

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

Jeśli podczas wywoływania funkcji startAnimation() nie istnieje nazwa animacji, wywołanie kończy się niepowodzeniem, wszystkie uruchomione animacje są zatrzymywane, a funkcja getAnimationState() zwraca 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ć przeglądarki Scene Viewer tak jak na urządzeniu mobilnym. Główna różnica między aplikacją Scene Viewer na Androidzie a wersją na XR i urządzenia mobilne polega na tym, że aplikacja Scene Viewer obsługuje tylko parametr URI pliku, który wskazuje plik glTF. Wszystkie inne parametry są ignorowane.

Aplikacja 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 środowiska, które mogły zostać zmienione, zostaną przywrócone do ustawień systemu użytkownika.

Oto przykład użycia Intent do wyświetlenia pliku glTF w Scene Viewer na Androidzie XR:

val THREED_MODEL_URL = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/FlightHelmet/glTF/FlightHelmet.gltf"
val MIME_TYPE = "model/gltf-binary"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
  Uri.parse("https://arvr.google.com/scene-viewer/1.2")
     .buildUpon()
     .appendQueryParameter("file", THREED_MODEL_URL)
     .build()
sceneViewerIntent.setDataAndType(intentUri, MIME_TYPE)
startActivity(sceneViewerIntent)

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 zarówno w GltfEntity, jak i w narzędziu do przeglądania scen.