Panoramica sull'attivazione dell'animazione nella tua app

Configurazione della build

La configurazione della build per abilitare l'animazione nella tua app prevede la modifica del file build.gradle e l'importazione delle animazioni nel tuo progetto.

  1. Aggiorna la build.gradle delle tue app per supportare il rendering di un modello di animazione importato aggiungendo la dipendenza dell'animazione di Sceneform:

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. Importa e visualizza in anteprima i file di animazione *.fbx per ottenere un file *.sfb contenente il modello importato.

Utilizzo delle animazioni in fase di esecuzione

Puoi utilizzare le operazioni di runtime per:

Creazione di un'animazione visualizzabile

In fase di runtime, utilizza ModelRenderable.Builder per caricare *.sfb e collegarlo a un nodo nella scena, come faresti con qualsiasi 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);

Accedere ai dati di animazione

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

Accesso alle animazioni basate su metadati diversi

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

Per recuperare un'istanza di dati di animazione, utilizza i metodi ModelRenderable.getAnimationData():

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

Controllare la riproduzione

Crea una ModelAnimator per controllare la riproduzione.

ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);

Usa start() per riprodurre l'animazione. Verrà interrotto automaticamente alla fine.

andyAnimator.start();

Per impostare il loop dell'animazione, utilizza setRepeatCount()

andyAnimator.setRepeatCount(<number of repeats>)

(Facoltativo) Aggiungere operazioni di animazione della proprietà

ModelAnimator estende la classe Android Animator, che consente interazioni più avanzate come il loop, rispondere agli eventi e interpolatori non lineari.

Utilizzo di SkeletonNode per l'identificazione e il collegamento dei modelli alle ossa

Quando lavori con un rendering contenente ossa, usa la classe SkeletonNode per ottenere l'accesso alle singole ossa nello scheletro collegando i nodi alle ossa. Questo ti consente di "allegare" oggetti alle ossa o di controllarne la posizione.

Durante la riproduzione dell'animazione, la posizione, la scala e l'orientamento del nodo collegato vengono aggiornati dal valore SkeletonNode in ogni frame. L'impostazione della posizione, della scala o della rotazione del nodo collegato sostituirà l'osso fino al successivo aggiornamento dell'osso dall'animazione.

Nel campione dell'animazione, puoi allegare una Node contenente il modello di un cappello all'osso per la "testa" di Andy. Quando Andy è animato, il cappello rimane sulla sua testa.

Accesso alle informazioni sulle ossa

Per accedere alle informazioni sulle ossa in una ModelRenderable, utilizza i metodi getBoneCount(), getBoneName() o 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();

Lavorare con SkeletonNode

La classe SkeletonNode espone lo scheletro di un modello per collegare i nodi a ossa specifiche.

Per utilizzare SkeletonNode, crea una nuova creazione dell'istanza e imposta il rendering al rendering che contiene un modello con uno scheletro.

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

Per collegare un rendering a un osso specifico, crea prima un nuovo nodo e collegalo all'osso. Aggiungi il nodo contenente il rendering come elemento secondario del primo nodo. Per garantire che la scalabilità e la rotazione dell'osso non vengano utilizzate per impostare la trasformazione relativa dei nodi, assicurati di reimpostare la scala e la posizione del secondo nodo.

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