設定版本
如要將版本設為在應用程式中啟用動畫,必須修改 build.gradle 檔案,並將動畫匯入專案。
新增 Sceneform 動畫依附元件,藉此更新應用程式's
build.gradle來支援匯入的動畫模型:dependencies { … // Support for animated model renderables. implementation "com.google.ar.sceneform:animation:1.15.0" }匯入並預覽
*.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();