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.
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" }
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:
(Facoltativo) Aggiungere ulteriori animazioni della proprietà
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();