1e41f4b71Sopenharmony_ci# ArkGraphics 3D场景动画控制以及管理
2e41f4b71Sopenharmony_ci动画是3D场景中重要的资源类型,用于控制场景中各种元素的运动。比如想要场景中的人物进行走路这个动作,每帧计算人物每一个关节的旋转角并进行设置是难以实现的。所以在完成类似的要求时,3D场景资源的制作者会将动画制作好,在模型文件中保存动画的关键帧数据以及关键帧间的插值器类型。ArkGraphics 3D提供播放并控制场景动画的能力,支持开发者灵活地控制动画的状态,达到预期的渲染效果。
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ci## 动画资源的创建
5e41f4b71Sopenharmony_ci动画资源是模型资源制作者在制作模型的过程中制作并保存到模型文件中的。ArkGraphics 3D提供从glTF模型资源中提取并播放动画的能力,进而使得开发者可以进行动画状态的控制。
6e41f4b71Sopenharmony_ci```ts
7e41f4b71Sopenharmony_ciimport { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
8e41f4b71Sopenharmony_ci  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
9e41f4b71Sopenharmony_ci
10e41f4b71Sopenharmony_cifunction createAnimation() : void {
11e41f4b71Sopenharmony_ci  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
12e41f4b71Sopenharmony_ci  scene.then(async (result: Scene) => {
13e41f4b71Sopenharmony_ci    if (result) {
14e41f4b71Sopenharmony_ci      // 获取动画资源
15e41f4b71Sopenharmony_ci      let anim: Animation = result.animations[0];
16e41f4b71Sopenharmony_ci    }
17e41f4b71Sopenharmony_ci  });
18e41f4b71Sopenharmony_ci}
19e41f4b71Sopenharmony_ci```
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci## 动画状态的控制
22e41f4b71Sopenharmony_ciArkGraphics 3D提供的动画状态控制操作主要包含如下几种:
23e41f4b71Sopenharmony_ci- 开始(start): 基于当前进度开始播放一个动画
24e41f4b71Sopenharmony_ci- 停止(stop): 停止播放一个动画,并将动画的进度设置到未开始状态
25e41f4b71Sopenharmony_ci- 结束(finish): 直接跳转到动画的最后,并将动画的进度设置到已结束状态
26e41f4b71Sopenharmony_ci- 暂定(pause): 将动画暂定,动画的播放进度保持在当前状态
27e41f4b71Sopenharmony_ci- 重启(restart): 从动画的起点开始播放动画
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci示例代码如下:
30e41f4b71Sopenharmony_ci```ts
31e41f4b71Sopenharmony_ciimport { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
32e41f4b71Sopenharmony_ci  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_cifunction animationControl() : void {
35e41f4b71Sopenharmony_ci  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
36e41f4b71Sopenharmony_ci  scene.then(async (result: Scene) => {
37e41f4b71Sopenharmony_ci    if (result) {
38e41f4b71Sopenharmony_ci      let anim: Animation = result.animations[0];
39e41f4b71Sopenharmony_ci      // 动画状态控制
40e41f4b71Sopenharmony_ci      anim.start();
41e41f4b71Sopenharmony_ci      anim.pause();
42e41f4b71Sopenharmony_ci      anim.stop();
43e41f4b71Sopenharmony_ci      anim.restart();
44e41f4b71Sopenharmony_ci      anim.finish();
45e41f4b71Sopenharmony_ci    }
46e41f4b71Sopenharmony_ci  });
47e41f4b71Sopenharmony_ci}
48e41f4b71Sopenharmony_ci```
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci## 动画回调的使用
51e41f4b71Sopenharmony_ci
52e41f4b71Sopenharmony_ci动画回调指的是在动画执行到某些状态时执行的函数,用于帮助开发者以动画状态为基础做触发式的逻辑控制工作。ArkGraphics 3D提供给开发者如下回调:
53e41f4b71Sopenharmony_ci- onStarted(): 当动画开始播放时执行的回调函数,start操作以及restart操作也会触发这个回调
54e41f4b71Sopenharmony_ci- onFinished(): 动画播放结束时执行的的回调函数,动画播放完成或者finish操作会触发这个回调
55e41f4b71Sopenharmony_ci
56e41f4b71Sopenharmony_ci示例代码如下:
57e41f4b71Sopenharmony_ci```ts
58e41f4b71Sopenharmony_ciimport { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
59e41f4b71Sopenharmony_ci  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_cifunction callBacks() : void {
62e41f4b71Sopenharmony_ci  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
63e41f4b71Sopenharmony_ci  scene.then(async (result: Scene) => {
64e41f4b71Sopenharmony_ci    if (result) {
65e41f4b71Sopenharmony_ci      let anim: Animation = result.animations[0];
66e41f4b71Sopenharmony_ci      // 注册回调函数
67e41f4b71Sopenharmony_ci      anim.onFinished(()=>{
68e41f4b71Sopenharmony_ci        console.info("onFinished");
69e41f4b71Sopenharmony_ci      });
70e41f4b71Sopenharmony_ci      anim.onStarted(()=>{
71e41f4b71Sopenharmony_ci        console.info("onStarted");
72e41f4b71Sopenharmony_ci      });
73e41f4b71Sopenharmony_ci    }
74e41f4b71Sopenharmony_ci  });
75e41f4b71Sopenharmony_ci}
76e41f4b71Sopenharmony_ci```
77e41f4b71Sopenharmony_ci## 相关实例
78e41f4b71Sopenharmony_ci
79e41f4b71Sopenharmony_ci对于3D动画更详细的使用可以参考以下实例:
80e41f4b71Sopenharmony_ci- [3D引擎接口示例(ArkTS)(API12)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Graphics/Graphics3d)
81