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
*.fbxi wyświetl ich podgląd, aby uzyskać plik*.sfbzawierają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();