3D 모델을 사용할 때 Jetpack XR SDK는 glTF 2.0 개방형 표준을 지원합니다. Android XR이 Jetpack XR SDK로 빌드된 앱을 렌더링할 때 3D 모델은 지원되는 확장 프로그램과 함께 glTF 2.0 표준에 지정된 물리 기반 렌더링(PBR) 기술로 렌더링됩니다. Autodesk Maya, Maxon ZBrush, Blender, Spline과 같은 대부분의 디지털 콘텐츠 제작 (dcc) 도구는 3D 모델을 glTF 형식 (.gltf 또는 .glb 파일)으로 내보낼 수 있습니다.
사용자 또는 앱에서 SpatialEnvironment 스카이박스를 지정한 경우 3D 모델은 환경 스카이박스에서 제공하는 조명 정보로 조명이 켜집니다. 반사 소재와 스펙큘러 하이라이트도 환경 스카이박스를 반영합니다. 패스스루가 사용 설정된 경우 조명, 반사, 반짝이는 하이라이트는 단일 방향 조명이 있는 간단하고 밝은 방을 기반으로 합니다.
지원되는 재질을 간략하게 살펴보려면 Khronos 사이트의 glTF PBR 속성을 참고하세요.
Jetpack XR SDK로 빌드된 앱이 3D 모델을 로드하는 방법은 두 가지가 있습니다.
ActivitySpace에 3D 모델 배치에 설명된 대로ActivitySpace에 로드합니다.- 인텐트를 통해 내장 Scene Viewer 사용
ActivitySpace에 3D 모델 배치
glTF 파일이 있으면 다음 단계는 Android 스튜디오의 애셋 디렉터리에 파일을 추가하는 것입니다. models 디렉터리를 만들어 애셋 유형을 더 잘 정리하는 것이 좋습니다.

glTF 모델을 로드하려면 GltfModel.create()를 호출합니다.
val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))
이 시점에서 모델은 메모리에 로드되지만 아직 렌더링되지는 않습니다. 로드할 3D 모델이 많거나 모델이 큰 경우 미리 비동기식으로 로드하는 것이 좋습니다. 이렇게 하면 사용자가 모델이 메모리에 로드될 때까지 기다리지 않아도 됩니다.
ActivitySpace에 glTF를 추가해야 합니다. GltfModelEntity.create을 호출하여 항목을 만들고 ActivitySpace에 배치합니다. 앱이 공간 기능을 허용하는 상태인지 확인하는 것이 좋습니다.
if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) { val gltfEntity = GltfModelEntity.create(session, gltfModel) }
이제 앱을 실행하면 로드된 3D 모델이 표시됩니다.

Compose SceneCoreEntity에 3D 모델 배치
GltfModel.create()를 사용하여 glTF를 메모리에 로드해야 하지만 XR용 Jetpack Compose로 UI를 만드는 경우 3D 모델을 SceneCoreEntity에 배치할 수 있습니다.
SceneCoreEntity를 사용하여 레이아웃에 3D 객체 배치를 참고하세요.
3D 모델 애니메이션
glTF 사양에 따라 3D 모델에 애니메이션을 삽입할 수 있습니다.
스켈레탈 (리그), 리지드, 모프 타겟 (블렌드 셰이프) 애니메이션은 모두 Jetpack XR SDK에서 지원됩니다. KHR_animation_pointer glTF 확장 프로그램으로 만든 Material 애니메이션도 지원됩니다.
애니메이션을 재생하려면 startAnimation()를 호출하고 애니메이션 이름을 지정합니다. 애니메이션을 무한대로 반복할지 여부를 선택적으로 지정할 수 있습니다.
gltfEntity.startAnimation(loop = true, animationName = "Walk")
startAnimation를 두 번째로 호출하면 현재 애니메이션이 중지되고 새 애니메이션이 시작됩니다.
getAnimationState()를 통해 애니메이션의 현재 상태를 쿼리할 수 있습니다.
startAnimation()를 호출할 때 지정된 애니메이션 이름이 없으면 호출이 자동으로 실패하고 실행 중인 애니메이션이 중지되며 getAnimationState()이 STOPPED를 반환합니다.
Scene Viewer를 사용하여 3D 모델 로드
기본 상호작용 기능으로 3D 모델을 로드하는 가장 간단한 방법을 찾고 있다면 모바일에서와 같이 Scene Viewer를 사용하는 것이 좋습니다. Android XR과 모바일의 Scene Viewer 간 주요 차이점은 Scene Viewer가 glTF 파일을 가리키는 파일 URI 매개변수만 지원하고 다른 모든 매개변수는 무시된다는 점입니다.
Scene Viewer는 인텐트를 사용하여 호출되고 전체 공간 모드에서 실행되는 별도의 앱입니다. 따라서 이를 호출하면 앱이 더 이상 표시되지 않고 Scene Viewer에 포커스가 있습니다. 변경한 환경은 사용자의 시스템 환경설정으로 재설정됩니다.
다음은 Android XR의 Scene Viewer에서 glTF 파일을 보기 위해 Intent를 사용하는 예입니다.
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. }
Scene Viewer의 상호작용 옵션에 대한 자세한 내용은 3D 모델 디자인 문서를 참고하세요.
glTF 확장 프로그램
Jetpack XR SDK는 3D 모델의 기능을 확장하는 여러 gfTF 확장 프로그램을 지원합니다. 이러한 기능은 GltfModelEntity와 Scene Viewer를 통해 사용할 수 있습니다.
KHR_animation_pointerKHR_draco_mesh_compressionKHR_lights_punctualKHR_materials_clearcoatKHR_materials_sheenKHR_materials_unlitKHR_materials_variantsKHR_mesh_quantizationKHR_texture_basisuKHR_texture_transformEXT_texture_webp