Dodawanie modeli 3D do aplikacji

Obsługiwane urządzenia XR
Ten przewodnik pomoże Ci tworzyć aplikacje na te typy urządzeń 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 za pomocą technik renderowania fizycznego(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 (.gltf lub .glb plików).

Jeśli użytkownik lub Twoja aplikacja określił(a) pole SpatialEnvironment skybox, modele 3D będą oświetlane informacjami o oświetleniu dostarczonymi przez pole środowiska skybox. Materiały odblaskowe i odbicia lustrzane będą również odzwierciedlać pole skybox środowiska. Jeśli włączono tryb passthrough, oświetlenie, odbicia i odbicia lustrzane będą oparte na jasnym pomieszczeniu z jednym światłem kierunkowym.

Krótki przegląd obsługiwanych materiałów znajdziesz na stronie Khronos w sekcji glTF PBR Properties. Aby dowiedzieć się, jak dostosować modele 3D za pomocą tych i innych właściwości, przeczytaj artykuł Dostosowywanie modeli 3D w aplikacji

Dodawanie pliku glTF do folderu zasobów

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

Przykład dodawania komponentów do katalogu /models

Dodawanie obiektu 3D za pomocą elementu SpatialGltfModel

Android XR obsługuje format glTF dla modeli 3D, które są zwykle zapisywane jako pliki .glb. Aby dodać te obiekty do układu, użyj elementu kompozycyjnego SpatialGltfModel. Ten interfejs API upraszcza proces wczytywania zasobów i zarządzania ich stanem.

Aby wyświetlić model, najpierw zdefiniuj jego źródło i stan za pomocą rememberSpatialGltfModelState. Modele możesz wczytywać z folderu assets aplikacji, URI lub raw data.

val modelState = rememberSpatialGltfModelState(
    source = SpatialGltfModelSource.fromPath(
        Paths.get("models/model_name.glb")
    )
)

Po zdefiniowaniu stanu użyj elementu kompozycyjnego SpatialGltfModel, aby go wyrenderować w podprzestrzeni.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Umieszczanie modelu 3D za pomocą elementu Compose SceneCoreEntity

Aby umieścić model 3D za pomocą elementu SceneCoreEntity, musisz najpierw wczytać plik glTF do pamięci za pomocą elementu GltfModel.create(). Następnie możesz umieścić model 3D w elemencie SceneCoreEntity, aby połączyć komponenty SceneCore z układami Compose for XR. Więcej informacji znajdziesz w artykule Umieszczanie obiektu 3D w układzie za pomocą elementu SceneCoreEntity.

Umieszczanie modelu 3D za pomocą pakietu Jetpack Scenecore

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

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

W tym momencie model jest wczytany 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ć, aż modele zostaną wczytane do pamięci.

Dodaj plik glTF do elementu ActivitySpace. Wywołaj GltfModelEntity.create, aby utworzyć encję i umieścić ją w elemencie 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

Wczytywanie modelu 3D za pomocą Scene Viewer

Jeśli szukasz najprostszego sposobu na wczytanie modelu 3D z podstawowymi możliwościami interakcji, możesz optować za użyciem Scene Viewer tak jak na urządzeniu mobilnym. Kluczową różnicą między Scene Viewer na Androidzie XR a na urządzeniu mobilnym jest to, że Scene Viewer obsługuje tylko parametr file URI wskazujący plik glTF, a wszystkie inne parametry są ignorowane.

Scene Viewer to osobna aplikacja, która jest wywoływana za pomocą intencji i działa w trybie pełnej przestrzeni. W związku z tym, gdy ją wywołasz, Twoja aplikacja nie będzie już widoczna, a Scene Viewer będzie aktywny. Wszystkie środowiska, które mogły zostać zmienione zostaną zresetowane do preferencji systemowych użytkownika.

Oto przykład użycia elementu Intent do wyświetlenia pliku glTF w Scene Viewer 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 Scene Viewer znajdziesz w naszej 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 możliwości są dostępne zarówno w elem GltfModelEntity, jak i w Scene Viewer.