Dodawanie modeli 3D do aplikacji

Odpowiednie 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 Jetpack XR SDK obsługuje otwarty standard glTF 2.0. Gdy Android XR renderuje aplikacje utworzone za pomocą 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 aplikacja określił(a) pole SpatialEnvironment skybox, modele 3D będą oświetlane informacjami o oświetleniu dostarczonymi przez pole skybox środowiska. 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 glTF PBR Properties w witrynie Khronos. 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ą 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 komponentu 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")
    )
)

Gdy stan jest zdefiniowany, użyj komponentu SpatialGltfModel, aby go wyrenderować w podprzestrzeni.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Umieszczanie modelu 3D za pomocą komponentu Compose SceneCoreEntity

Aby umieścić model 3D za pomocą SceneCoreEntity, musisz najpierw wczytać plik glTF do pamięci za pomocą GltfModel.create(). Następnie możesz umieścić model 3D w komponencie 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ą komponentu SceneCoreEntity.

Umieszczanie modelu 3D za pomocą Jetpack Scenecore

Aby wczytać model glTF, wywołaj 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 ActivitySpace. Wywołaj GltfModelEntity.create, aby utworzyć encję i umieścić ją 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

Wczytywanie modelu 3D za pomocą Scene Viewer

Jeśli szukasz najprostszego sposobu wczytania modelu 3D z podstawowymi funkcjami interakcji, możesz użyć 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 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

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 GltfModelEntity, jak i w Scene Viewer.