Konfigurowanie kompilacji
Konfigurowanie kompilacji pod kątem włączania animacji w aplikacji wymaga zmodyfikowania pliku build.gradle
i zaimportowania animacji do projektu.
Zaktualizuj aplikację app's
build.gradle
, aby obsługiwać renderowany model animacji, dodając zależność animacji sceny:dependencies { … // Support for animated model renderables. implementation "com.google.ar.sceneform:animation:1.15.0" }
Zaimportuj pliki podglądu
*.fbx
i wyświetl ich podgląd, aby uzyskać plik*.sfb
zawierający zaimportowany model.
Używanie animacji w czasie działania
Używaj operacji w czasie działania, aby:
(Opcjonalnie) Dodawanie dodatkowych animacji właściwości
Tworzenie animacji renderowanych
W czasie działania za pomocą narzędzia ModelRenderable.Builder
załaduj komponent *.sfb
i dołącz go do węzła w scenie, tak jak w przypadku dowolnego elementu 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);
Uzyskaj dostęp do danych animacji
// Get the animation data called "andy_dance" from the `andyRenderable`.
AnimationData danceData = andyRenderable.getAnimationData("andy_dance");
Dostęp do animacji opartych na różnych metadanych
// Get the animation name.
danceData.getName();
Aby pobrać instancję danych animacji, użyj metod ModelRenderable.getAnimationData()
:
// Access animations by index.
numAnimations = andyRenderable.getAnimationDataCount();
danceData = andyRenderable.getAnimationData(0);
Sterowanie odtwarzaniem
Aby kontrolować odtwarzanie, utwórz ModelAnimator
.
ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);
Aby odtworzyć animację, naciśnij start()
. Po jej zakończeniu zatrzyma się automatycznie.
andyAnimator.start();
Aby zapętlić animację, użyj setRepeatCount()
andyAnimator.setRepeatCount(<number of repeats>)
(Opcjonalnie) Dodawanie operacji animacji właściwości
ModelAnimator
rozszerza klasę Animator
Androida, która umożliwia bardziej rozbudowane interakcje, takie jak pętla, odpowiadanie na zdarzenia i interpolery nielinearne.
Używanie modelu SkeletonNode
do identyfikowania i załączenia modeli do kości
Podczas pracy z renderowanym elementem zawierającym kości użyj klasy SkeletonNode
, aby uzyskać dostęp do poszczególnych kości w szkieletie, przyłączając je do kości. Dzięki temu można „przyłączać” obiekty do kości lub kontrolować ich pozycję.
Podczas odtwarzania animacji pozycja, skala i orientacja dołączonego węzła są aktualizowane przez SkeletonNode
. Ustawienie położenia, skali lub obrotu dołączonego węzła spowoduje zastąpienie kości do następnej aktualizacji kości przez animację.
W przykładowym filmie Animacja odbywa się to przez zamontowanie na kości głowy głowy modelu Node
przyozdobionego modelem kapelusza. Animowany kapelusz pozostaje na głowie.
Dostęp do informacji o kościach
Aby uzyskać dostęp do informacji o kościach w ModelRenderable
, użyj metod getBoneCount()
, getBoneName()
lub 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();
Praca z: SkeletonNode
Klasa SkeletonNode
ujawnia szkielet modelu, aby można było dołączać węzły do konkretnych kości.
Aby użyć właściwości SkeletonNode
, utwórz nowe wystąpienie i ustaw możliwość renderowania na zawierającej model ze szkieletem.
andyWithSkeleton = new SkeletonNode();
andyWithSkeleton.setRenderable(andyRenderable);
andyWithSkeleton.setParent(scene);
Aby połączyć z daną kością renderowanie, najpierw utwórz nowy węzeł i dołącz go do kości. Dodaj węzeł zawierający obiekty renderowane jako element podrzędny pierwszego węzła. Aby mieć pewność, że skala i obrót kości nie zostaną wykorzystane do ustawienia względnego przekształcenia węzłów, pamiętaj o zresetowaniu skali i pozycji drugiego węzła.
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();