Настройка сборки
Настройка сборки для включения анимации в вашем приложении включает изменение файла build.gradle
и импорт анимации в ваш проект.
Обновите
build.gradle
вашего приложения, чтобы он поддерживал визуализацию импортированной модели анимации, добавив зависимость анимации Sceneform:dependencies { … // Support for animated model renderables. implementation "com.google.ar.sceneform:animation:1.15.0" }
Импортируйте и предварительно просмотрите файлы
*.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();