在應用程式中啟用動畫總覽

設定版本

如要將版本設為在應用程式中啟用動畫,必須修改 build.gradle 檔案,並將動畫匯入專案。

  1. 新增 Sceneform 動畫依附元件,藉此更新應用程式's build.gradle 來支援匯入的動畫模型:

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. 匯入並預覽 *.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 找出模型並附加至骨骼

處理含有 bones 的可算繪時,請將 SkeletonNode 類別附加至骨骼,以存取架構中的個別骨骼。這可讓您將物件「附加」至骨骼或控制其位置。

播放動畫時,附加節點的位置、縮放比例和方向都會由每個影格的 SkeletonNode 更新。設定附加節點的位置、比例或旋轉項目之後,系統會覆寫骨骼,直到下次更新動畫為止。

「動畫」範例中,附加一個 Node,其中包含一對帽子模型的 Node,以便在 Android 的「頭」上頭戴帽子。當 Any 出現動畫效果時,帽子會留在頭部上。

存取骨頭相關資訊

如要存取 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();