빌드 구성
앱에서 애니메이션을 사용 설정하도록 빌드를 구성하려면 build.gradle
파일을 수정하고 프로젝트로 애니메이션을 가져와야 합니다.
장면 애니메이션 애니메이션 종속 항목을 추가하여 가져온 애니메이션 모델을 렌더링하도록 앱
build.gradle
을 업데이트합니다.dependencies { … // Support for animated model renderables. implementation "com.google.ar.sceneform:animation:1.15.0" }
*.fbx
애니메이션 파일을 가져오고 미리보기하여 가져온 모델이 포함된*.sfb
파일을 가져옵니다.
런타임에 애니메이션 사용
런타임 작업을 사용하여 다음을 수행합니다.
렌더링 가능한 애니메이션 만들기
런타임에 ModelRenderable.Builder
을 사용하여 *.sfb
를 로드하고 ModelRenderable
의 경우와 마찬가지로 장면의 노드에 연결합니다.
// Create the ModelRenderable.
ModelRenderable.builder()
.setSource(this, R.raw.andy)
.build()
.thenAccept(renderable -> andyRenderable = renderable)
.exceptionally(
throwable -> {
Log.e(TAG, "Unable to load Renderable.", throwable);
return null;
});
// Attach the ModelRenderable to the node in the scene.
Node andyNode = new Node();
andyNode.setParent(arFragment.getArSceneView().getScene());
andyNode.setRenderable(andyRenderable);
애니메이션 데이터에 액세스
// Get the animation data called "andy_dance" from the `andyRenderable`.
AnimationData danceData = andyRenderable.getAnimationData("andy_dance");
다양한 메타데이터를 기반으로 애니메이션 액세스
// Get the animation name.
danceData.getName();
애니메이션 데이터의 인스턴스를 검색하려면 ModelRenderable.getAnimationData()
메서드를 사용합니다.
// Access animations by index.
numAnimations = andyRenderable.getAnimationDataCount();
danceData = andyRenderable.getAnimationData(0);
재생 제어
재생을 제어할 ModelAnimator
을 만듭니다.
ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);
start()
를 사용하여 애니메이션을 재생합니다. 마지막에는 자동으로 중지됩니다.
andyAnimator.start();
애니메이션을 반복하려면 setRepeatCount()
를 사용합니다.
andyAnimator.setRepeatCount(<number of repeats>)
(선택사항) 속성 애니메이션 작업 추가
ModelAnimator
는 Android Animator
클래스를 확장하므로 루프, 이벤트에 응답 및 비선형 보간기와 같은 더 많은 상호작용이 가능합니다.
SkeletonNode
를 사용하여 모델을 식별하고 뼈에 연결
뼈가 포함된 렌더링 가능 애셋으로 작업할 때 SkeletonNode
클래스를 사용하면 뼈에 노드를 연결하여 골격의 개별 뼈에 액세스할 수 있습니다. 이렇게 하면 객체를 뼈에 '연결'하거나 해당 위치를 제어할 수 있습니다.
애니메이션이 재생되는 동안 연결된 노드의 위치, 크기 및 방향은 각 프레임에서 SkeletonNode
에 의해 업데이트됩니다. 연결된 노드의 위치, 크기 조정 또는 회전을 설정하면 다음에 애니메이션으로 뼈가 업데이트될 때까지 본이 재정의됩니다.
애니메이션 샘플에서는 앤디의 '머리'를 위해 모자 모델이 포함된 Node
를 뼈에 부착합니다. 애니메이션이 제작되면 모자가 머리 위에 머무릅니다.
뼈에 대한 정보 액세스
ModelRenderable
의 뼈 정보에 액세스하려면 getBoneCount()
, getBoneName()
, getBoneParent()
메서드를 사용합니다.
// Get the number of bones in the model’s skeleton.
andyRenderable.getBoneCount();
// Get the names of the bones in the model’s skeleton.
andyRenderable.getBoneName();
// Get the hierarchy of the bones in the model’s skeleton.
andyRenderable.getBoneParent();
SkeletonNode
을 사용하는 경우
SkeletonNode
클래스는 노드를 특정 뼈에 연결하기 위해 모델의 골격을 노출합니다.
SkeletonNode
를 사용하려면 새 인스턴스화를 만들고 스켈레톤이 포함된 모델이 포함된 렌더러 가능 항목을 렌더러로 설정합니다.
andyWithSkeleton = new SkeletonNode();
andyWithSkeleton.setRenderable(andyRenderable);
andyWithSkeleton.setParent(scene);
렌더러블을 특정 뼈에 연결하려면 먼저 새 노드를 만들어 뼈에 연결합니다. 렌더러블이 포함된 노드를 첫 번째 노드의 하위 요소로 추가합니다. 노드의 상대 변환을 설정하는 데 뼈의 크기 및 회전이 사용되지 않도록 하려면 두 번째 노드의 배율과 위치를 재설정해야 합니다.
hatNode = new Node();
Node boneNode = new Node();
boneNode.setParent(andy);
andy.setBoneAttachment(HAT_BONE_NAME, boneNode);
hatNode.setRenderable(hatRenderable);
hatNode.setParent(boneNode);
hatNode.setWorldScale(Vector3.one());
hatNode.setWorldRotation(Quaternion.identity());
Vector3 pos = hatNode.getWorldPosition();