Dodawanie modeli 3D do aplikacji

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

Podczas pracy z modelami 3D pakiet SDK Jetpack XR 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, 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 SpatialEnvironment skybox, modele 3D będą oświetlone zgodnie z informacjami o oświetleniu dostarczonymi przez skybox środowiska. Materiały odblaskowe i odblaski będą również odzwierciedlać niebo. Jeśli tryb widoku otoczenia jest włączony, oświetlenie, odbicia i odblaski będą oparte na jasnym pomieszczeniu z jednym światłem kierunkowym.

Krótkie podsumowanie obsługiwanych materiałów znajdziesz w sekcji Właściwości glTF PBR na stronie 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 z komponentami

Gdy masz już plik glTF, następnym krokiem jest dodanie go 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

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 SpatialGltfModel. SpatialGltfModel to komponent podprzestrzeni kompozycyjnej, który umożliwia dodawanie modeli 3D w formacie glTF do układu przestrzennego. 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 funkcji kompozycyjnej SpatialGltfModel, aby wyrenderować go w podprzestrzeni:

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Najważniejsze informacje o kodzie

  • Wczytywanie asynchroniczne: model jest wczytywany asynchronicznie. Podczas początkowego tworzenia kompozycji jej rozmiar wewnętrzny może wynosić zero. Układ jest mierzony ponownie, gdy model jest gotowy.
  • Kontrolowanie stanu: użyj SpatialGltfModelState.status, aby sprawdzić stan wczytywania lub kontrolować animacje.
  • Rozmiar i skalowanie: domyślnie rozmiar układu odpowiada ramce ograniczającej komponentu. Możesz to zmienić za pomocą SubspaceModifier.size, aby równomiernie przeskalować model i dopasować go do określonych granic.

Umieszczanie modelu 3D za pomocą SceneCoreEntity w Compose

Aby umieścić model 3D za pomocą SceneCoreEntity, musisz najpierw wczytać glTF do pamięci za pomocą GltfModel.create(). Następnie możesz umieścić model 3D w SceneCoreEntity, aby połączyć komponenty SceneCore z układami Compose for XR. Zapoznaj się z artykułem Używanie SceneCoreEntity do umieszczania obiektu 3D w układzie.

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 wczytywany do pamięci, ale nie jest jeszcze renderowany. Jeśli masz wiele modeli 3D do wczytania lub Twój 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.

Dodaj plik glTF do ActivitySpace. Wywołaj GltfModelEntity.create, aby utworzyć encję i umieścić ją w ActivitySpace. Zgodnie ze sprawdzonymi metodami należy sprawdzić, 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 pojawić się 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 użyć przeglądarki Scene Viewer tak samo jak na urządzeniu mobilnym. Główną różnicą między Scene Viewerem na Androidzie XR a Scene Viewerem na urządzeniach mobilnych jest to, że Scene Viewer obsługuje tylko parametr identyfikatora URI pliku wskazujący na 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 rezultacie po wywołaniu tej funkcji aplikacja nie będzie już widoczna, a Scene Viewer będzie aktywny. Wszystkie środowiska, które zostały przez Ciebie zmienione, zostaną przywrócone 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 przeglądarce Scene Viewer znajdziesz w naszej dokumentacji dotyczącej projektowania modeli 3D.

Rozszerzenia glTF

Pakiet SDK Jetpack XR obsługuje kilka rozszerzeń glTF, które rozszerzają możliwości modeli 3D. Te funkcje są dostępne zarówno w GltfModelEntity, jak i w Scene Viewer.