設定版本
如要將版本設為在應用程式中啟用動畫,必須修改 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();