Omówienie włączania animacji w aplikacji

Konfigurowanie kompilacji

Konfigurowanie kompilacji pod kątem włączania animacji w aplikacji wymaga zmodyfikowania pliku build.gradle i zaimportowania animacji do projektu.

  1. Zaktualizuj aplikację app's build.gradle, aby obsługiwać renderowany model animacji, dodając zależność animacji sceny:

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. Zaimportuj pliki podglądu *.fbx i wyświetl ich podgląd, aby uzyskać plik *.sfb zawierający zaimportowany model.

Używanie animacji w czasie działania

Używaj operacji w czasie działania, aby:

Tworzenie animacji renderowanych

W czasie działania za pomocą narzędzia ModelRenderable.Builder załaduj komponent *.sfb i dołącz go do węzła w scenie, tak jak w przypadku dowolnego elementu 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);

Uzyskaj dostęp do danych animacji

// Get the animation data called "andy_dance" from the `andyRenderable`.
AnimationData danceData = andyRenderable.getAnimationData("andy_dance");

Dostęp do animacji opartych na różnych metadanych

     // Get the animation name.
     danceData.getName();

Aby pobrać instancję danych animacji, użyj metod ModelRenderable.getAnimationData():

     // Access animations by index.
     numAnimations = andyRenderable.getAnimationDataCount();
     danceData = andyRenderable.getAnimationData(0);

Sterowanie odtwarzaniem

Aby kontrolować odtwarzanie, utwórz ModelAnimator.

ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);

Aby odtworzyć animację, naciśnij start(). Po jej zakończeniu zatrzyma się automatycznie.

andyAnimator.start();

Aby zapętlić animację, użyj setRepeatCount()

andyAnimator.setRepeatCount(<number of repeats>)

(Opcjonalnie) Dodawanie operacji animacji właściwości

ModelAnimator rozszerza klasę Animator Androida, która umożliwia bardziej rozbudowane interakcje, takie jak pętla, odpowiadanie na zdarzenia i interpolery nielinearne.

Używanie modelu SkeletonNode do identyfikowania i załączenia modeli do kości

Podczas pracy z renderowanym elementem zawierającym kości użyj klasy SkeletonNode, aby uzyskać dostęp do poszczególnych kości w szkieletie, przyłączając je do kości. Dzięki temu można „przyłączać” obiekty do kości lub kontrolować ich pozycję.

Podczas odtwarzania animacji pozycja, skala i orientacja dołączonego węzła są aktualizowane przez SkeletonNode. Ustawienie położenia, skali lub obrotu dołączonego węzła spowoduje zastąpienie kości do następnej aktualizacji kości przez animację.

W przykładowym filmie Animacja odbywa się to przez zamontowanie na kości głowy głowy modelu Node przyozdobionego modelem kapelusza. Animowany kapelusz pozostaje na głowie.

Dostęp do informacji o kościach

Aby uzyskać dostęp do informacji o kościach w ModelRenderable, użyj metod getBoneCount(), getBoneName() lub 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();

Praca z: SkeletonNode

Klasa SkeletonNode ujawnia szkielet modelu, aby można było dołączać węzły do konkretnych kości.

Aby użyć właściwości SkeletonNode, utwórz nowe wystąpienie i ustaw możliwość renderowania na zawierającej model ze szkieletem.

 andyWithSkeleton = new SkeletonNode();
 andyWithSkeleton.setRenderable(andyRenderable);
 andyWithSkeleton.setParent(scene);

Aby połączyć z daną kością renderowanie, najpierw utwórz nowy węzeł i dołącz go do kości. Dodaj węzeł zawierający obiekty renderowane jako element podrzędny pierwszego węzła. Aby mieć pewność, że skala i obrót kości nie zostaną wykorzystane do ustawienia względnego przekształcenia węzłów, pamiętaj o zresetowaniu skali i pozycji drugiego węzła.

 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();