Como configurar o build
A configuração do build para ativar a animação no app envolve a modificação do
arquivo build.gradle
e a importação de animações para seu projeto.
Atualize o
build.gradle
do app's para oferecer compatibilidade com um modelo de animação importado importado, adicionando a dependência da animação Sceneform:dependencies { … // Support for animated model renderables. implementation "com.google.ar.sceneform:animation:1.15.0" }
Importe e visualize seus arquivos de animação
*.fbx
para acessar um arquivo*.sfb
que contém o modelo importado.
Como usar animações no momento da execução
Use as operações de ambiente de execução para:
(Opcional) Adicionar outras animações de propriedade
Como criar uma animação que pode ser renderizada
No momento da execução, use ModelRenderable.Builder
para carregar o *.sfb
e anexe-o a um nó na cena, como você faria
com qualquer 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);
Tenha acesso aos dados da animação
// Get the animation data called "andy_dance" from the `andyRenderable`.
AnimationData danceData = andyRenderable.getAnimationData("andy_dance");
Como acessar animações com base em metadados diferentes
// Get the animation name.
danceData.getName();
Para recuperar uma instância de dados de animação, use os métodos
ModelRenderable.getAnimationData()
:
// Access animations by index.
numAnimations = andyRenderable.getAnimationDataCount();
danceData = andyRenderable.getAnimationData(0);
Controlar a reprodução
Crie um ModelAnimator
para controlar a reprodução.
ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);
Use start()
para reproduzir a animação. Ele será interrompido automaticamente no final.
andyAnimator.start();
Para repetir a animação, use setRepeatCount()
andyAnimator.setRepeatCount(<number of repeats>)
(Opcional) Adicionar operações de animação de propriedade
O ModelAnimator
estende a classe Animator
do Android, o que permite interações mais avançadas,
como looping, resposta a eventos e interpoladores não lineares.
Como usar SkeletonNode
para identificar e anexar modelos a ossos
Ao trabalhar com uma renderização contendo ossos, use a classe
SkeletonNode
para ter acesso a ossos individuais no esqueleto
anexando nós aos ossos. Isso permite “anexar” objetos a ossos ou controlar
a posição deles.
Enquanto a animação está em exibição, a posição, a escala e a orientação do
nó anexado são atualizadas pelo SkeletonNode
a cada frame. Definir a posição,
a escala ou a rotação do nó anexado modificará o osso até a próxima
vez que o osso for atualizado pela animação.
No exemplo de Animação, isso é feito
anexando um Node
que contém um modelo de um chapéu ao osso da "cabeça" de Andy.
Quando Andy é animado, o chapéu permanece na cabeça dele.
Como acessar informações sobre ossos
Para acessar informações sobre ossos em um ModelRenderable
,
use os métodos getBoneCount()
, getBoneName()
ou 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();
Como trabalhar com SkeletonNode
A classe SkeletonNode
expõe o esqueleto de um modelo para anexar nós a
ossos específicos.
Para usar SkeletonNode
, crie uma nova instanciação dele e defina o renderizável
para o renderable que contenha um modelo com um esqueleto.
andyWithSkeleton = new SkeletonNode();
andyWithSkeleton.setRenderable(andyRenderable);
andyWithSkeleton.setParent(scene);
Para anexar um elemento de renderização a um osso específico, primeiro crie um novo nó e anexe-o ao osso. Adicione o nó que contém o elemento de renderização como um filho do primeiro nó. Para garantir que a escala e a rotação do osso não sejam usadas para definir a transformação relativa dos nós, certifique-se de redefinir a escala e a posição do segundo nó.
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();