앱에서 애니메이션 사용 설정 개요

빌드 구성

앱에서 애니메이션을 사용 설정하도록 빌드를 구성하려면 build.gradle 파일을 수정하고 프로젝트로 애니메이션을 가져와야 합니다.

  1. 장면 애니메이션 애니메이션 종속 항목을 추가하여 가져온 애니메이션 모델을 렌더링하도록 build.gradle을 업데이트합니다.

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. *.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();