Обзор включения анимации в вашем приложении

Настройка сборки

Настройка сборки для включения анимации в вашем приложении включает изменение файла build.gradle и импорт анимации в ваш проект.

  1. Обновите build.gradle вашего приложения, чтобы он поддерживал визуализацию импортированной модели анимации, добавив зависимость анимации Sceneform:

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. Импортируйте и предварительно просмотрите файлы *.fbx *.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();