3D 모델을 사용할 때 Jetpack XR SDK는 glTF 2.0 개방형 표준을 지원합니다. Android XR이 Jetpack XR SDK로 빌드된 앱을 렌더링하면 3D 모델이 glTF 2.0 표준에 지정된 물리 기반 렌더링(PBR) 기법(지원되는 extensions
와 함께)으로 렌더링됩니다. Autodesk Maya, Maxon ZBrush, Blender, Spline과 같은 대부분의 디지털 콘텐츠 제작 (dcc) 도구는 3D 모델을 glTF 형식 (.gltf
또는 .glb
파일)으로 내보낼 수 있습니다.
사용자 또는 앱에서 SpatialEnvironment
스카이박스를 지정한 경우 3D 모델은 환경 스카이박스에서 제공하는 조명 정보로 조명됩니다. 반사성 물질과 스펙큘러 하이라이트도 환경 스카이박스를 반사합니다. 패스스루가 사용 설정된 경우 조명, 반사광, 스펙큘러 하이라이트는 단일 지향성 조명이 있는 밝고 단순한 방을 기반으로 합니다.
지원되는 재료에 관한 간단한 개요는 Khronos 사이트의 glTF PBR 속성을 참고하세요.
Jetpack XR SDK로 빌드된 앱이 3D 모델을 로드하는 방법에는 두 가지 기본 방법이 있습니다.
- 다음 섹션에 설명된 대로
ActivitySpace
에 로드합니다. ActivitySpace에 3D 모델 배치 - 인텐트를 통해 내장된 Scene Viewer 사용
ActivitySpace에 3D 모델 배치
glTF 파일이 있으면 다음 단계는 Android 스튜디오의 애셋 디렉터리에 glTF 파일을 추가하는 것입니다. 저작물 유형을 더 효과적으로 정리하려면 models
디렉터리를 만드는 것이 좋습니다.
glTF 모델을 로드하려면 createGltfResourceAsync
를 호출합니다.
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
이 시점에서 모델은 메모리에 로드되지만 아직 렌더링되지는 않습니다. 로드할 3D 모델이 많거나 모델이 큰 경우 미리 비동기식으로 로드하는 것이 좋습니다. 이렇게 하면 사용자가 모델이 메모리에 로드될 때까지 기다릴 필요가 없습니다.
glTF를 ActivitySpace
에 추가해야 합니다. createGltfEntity
를 호출하여 항목을 만들고 ActivitySpace
에 배치합니다. 앱이 공간 기능을 사용할 수 있는 상태인지 확인하는 것이 좋습니다.
// 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)
}
이제 앱을 실행하면 로드된 3D 모델이 표시됩니다.
Compose 볼륨에 3D 모델 배치
여전히 createGltfResourceAsync
를 사용하여 glTF를 메모리에 로드해야 하지만 XR용 Jetpack Compose로 UI를 만드는 경우 3D 모델을 Volume
에 배치할 수 있습니다. 볼륨을 사용하여 레이아웃에 3D 객체 배치를 참고하세요.
3D 모델 애니메이션
glTF 사양의 일부로 3D 모델에 애니메이션이 삽입될 수 있습니다.
Jetpack XR SDK에서는 스켈레톤 (리깅된), 고정된, 모프 타겟 (혼합 도형) 애니메이션이 모두 지원됩니다. KHR_animation_pointer
glTF 확장자로 만든 Material 애니메이션도 지원됩니다.
애니메이션을 재생하려면 startAnimation
를 호출하고 애니메이션의 이름을 지정합니다. 원하는 경우 애니메이션을 무한으로 반복할지 지정할 수 있습니다.
//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")
startAnimation
를 두 번째로 호출하면 현재 애니메이션이 중지되고 새 애니메이션이 시작됩니다.
getAnimationState()
를 통해 애니메이션의 현재 상태를 쿼리할 수 있습니다.
startAnimation()
를 호출할 때 지정된 애니메이션 이름이 없으면 호출이 자동으로 실패하고 실행 중인 애니메이션이 중지되며 getAnimationState()
이 STOPPED
을 반환합니다.
Scene Viewer를 사용하여 3D 모델 로드
기본 상호작용 기능이 있는 3D 모델을 로드하는 가장 간단한 방법을 찾고 있다면 모바일에서와 마찬가지로 Scene Viewer를 사용하면 됩니다. Android XR의 Scene Viewer와 모바일의 Scene Viewer 간에 중요한 차이점은 Scene Viewer가 glTF 파일을 가리키는 파일 URI 매개변수만 지원하고 다른 모든 매개변수는 무시된다는 점입니다.
Scene Viewer는 인텐트를 통해 호출되고 전체 공간 모드에서 실행되는 별도의 앱입니다. 따라서 Scene Viewer를 호출하면 앱이 더 이상 표시되지 않고 Scene Viewer에 포커스가 설정됩니다. 변경한 환경은 사용자의 시스템 환경설정으로 재설정됩니다.
다음은 Intent
를 사용하여 Android XR의 Scene Viewer에서 glTF 파일을 보는 예입니다.
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)
Scene Viewer의 상호작용 옵션에 관한 자세한 내용은 3D 모델 디자인 문서를 참고하세요.
glTF 확장자
Jetpack XR SDK는 3D 모델의 기능을 확장하는 여러 gfTF 확장 프로그램을 지원합니다. 이 기능은 GltfEntity
및 Scene Viewer에서 모두 사용할 수 있습니다.
KHR_animation_pointer
KHR_draco_mesh_compression
KHR_lights_punctual
KHR_materials_clearcoat
KHR_materials_sheen
KHR_materials_unlit
KHR_materials_variants
KHR_mesh_quantization
KHR_texture_basisu
KHR_texture_transform
EXT_texture_webp