- three.js的安装及使用
- 使用 Three.js 创建一个场景(Creating a Scene)
- 使用 Three.js 进行 WebGL 兼容性检查
- 使用 Three.js 进行线条绘制(Drawing Lines)
- 使用 Three.js 创建文字(Creating Text)
- 使用 Three.js 载入 3D 模型(Loading 3D Models)
- 使用 Three.js 更新场景(How to Update Things)
- 使用 Three.js 废置对象(How to Dispose of Objects)
- 使用 Three.js 创建 VR 内容(How to Create VR Content)
- 使用 Three.js 实现后期处理(How to Use Post-Processing)
- 使用 Three.js 进行矩阵变换(Matrix Transformations)
- 使用 Three.js 动画系统(Animation System)
- 使用 Three.js 框架中的 AnimationAction
- 使用 Three.js 框架中的 AnimationClip
- Three.js 框架中的 AnimationMixer 使用详解
- Three.js 框架中的 AnimationObjectGroup 使用详解
- Three.js 框架中的 AnimationUtils 使用详解
- Three.js 框架中的 KeyframeTrack 使用详解
- Three.js 框架中的 PropertyBinding 使用详解
- Three.js 框架中的 PropertyMixer 使用详解
- Three.js 框架中 BooleanKeyframeTrack 的使用详解
- Three.js 框架中 ColorKeyframeTrack 的使用详解
- Three.js 框架中的 NumberKeyframeTrack 使用详解
- Three.js 框架中的 QuaternionKeyframeTrack 使用详解
- Three.js 框架中的 StringKeyframeTrack 使用详解
- Three.js 框架中的 VectorKeyframeTrack 使用详解
- Three.js 框架中的音频(Audio)使用详解
- Three.js 框架中的音频分析器(AudioAnalyser)使用详解
- Three.js 框架中 `AudioContext` 的使用详解
- Three.js 框架中的 `AudioListener` 使用详解
- Three.js 框架中的 `PositionalAudio` 使用详解
- Three.js 框架中的 `ArrayCamera` 使用详解
- Three.js 框架中的 Camera 使用详解
- Three.js 中 CubeCamera 的使用详解
- Three.js 框架:`OrthographicCamera` 与音频的使用详解
- Three.js 中 PerspectiveCamera 的使用详解
- Three.js 框架中的 StereoCamera 使用详解
- Three.js 框架中的动画常量(Animation Constants)详解
- Three.js 框架中的常量——自定义混合方程常量(Custom Blending Equation Constants)详解
- Three.js 框架中的常量——Material Constants 使用详解
- Three.js 框架中的常量——WebGLRenderer Constants 使用详解
- Three.js 框架中的常量——Texture Constants 使用详解
- Three.js 框架中的常量——Core Constants 使用详解
- Three.js 框架中 `BufferAttribute` 的使用详解
- Three.js 框架中 `BufferGeometry` 的使用详解
- Three.js 框架中 `Clock` 的使用详解
- Three.js 框架中的 `EventDispatcher` 使用详解
- Three.js 框架中的 `GLBufferAttribute` 使用详解
- Three.js 框架中的 `InstancedBufferAttribute` 使用详解
- Three.js 框架中的 `InstancedBufferGeometry` 使用详解
- Three.js 框架中的 `InstancedInterleavedBuffer` 使用详解
- Three.js 框架中的 `InterleavedBufferAttribute` 使用详解
- Three.js 框架中的 `Layers` 使用详解
- Three.js 的 Object3D
- Three.js 的 Raycaster
- Three.js 框架中的 `Uniform` 使用详解
- Three.js 框架中 BufferAttribute Types 的使用详解
- 从入门到精通 Three.js 的 DataUtils
- 从入门到精通 Three.js 的 Earcut
- 深入了解 Three.js 中的 ImageUtils
- 深入了解 Three.js 中的 PMREMGenerator
- 深入了解 Three.js 中的 ShapeUtils
- 深入了解 Three.js 中的 Curve
- 深入了解 Three.js 中的 CurvePath
- 插值(Interpolations)
- 路径(Path)
- 形状(Shape)
- 形状路径(ShapePath)
- Three.js 框架中的弧线(ArcCurve)使用详解
- 深入解析 Three.js 中的 CatmullRomCurve3 使用
- 深入解析 Three.js 中的二维三次贝塞尔曲线(CubicBezierCurve)使用
- 深入解析 Three.js 中的三维三次贝塞尔曲线(CubicBezierCurve3)使用
- 深入解析 Three.js 中的椭圆曲线(EllipseCurve)使用
- 深入解析 Three.js 中的二维线段曲线(LineCurve)
- 深入解析 Three.js 框架中三维线段曲线(LineCurve3)的使用
- 深入解析 Three.js 框架中二维二次贝塞尔曲线(QuadraticBezierCurve)的使用
- 深入理解与应用 Three.js 的三维二次贝塞尔曲线(QuadraticBezierCurve3)
- Three.js 框架中的样条曲线(SplineCurve)的使用
- Three.js 框架中的立方缓冲几何体(BoxGeometry)使用
- Three.js 中的CapsuleGeometry使用
- Three.js 中的 CircleGeometry 使用详解
- 深入了解 Three.js 框架中的 ConeGeometry 使用
- 深入了解 Three.js 框架中的 CylinderGeometry 使用
- 深入理解 Three.js 中的 DodecahedronGeometry 使用
使用 Three.js 框架中的 AnimationAction
class AnimationAction在 Three.js 动画系统中,AnimationAction
是用来控制动画的关键部分。它允许我们播放、暂停、停止动画,并对动画的速度、权重、循环行为进行控制。AnimationAction
与 AnimationMixer
和 AnimationClip
一起使用,能够轻松创建和管理复杂的动画效果。
本文将详细讲解 AnimationAction
的各种用法,包括它的属性、方法及其与其他 Three.js 组件的配合使用。并通过多个示例演示如何使用 AnimationAction
来实现不同的动画控制效果。
1. 什么是 AnimationAction
AnimationAction
是 Three.js 动画系统中的核心组件之一,表示的是动画混合器中的一个动画动作。通过 AnimationAction
对象,可以对 AnimationClip
(动画片段)进行播放、暂停、恢复、停止等操作,同时也可以控制动画的循环方式、速度、权重等。
1.1 关键组件
- AnimationMixer:用于控制多个
AnimationAction
的混合。 - AnimationClip:定义动画片段,它包含了动画的所有信息。
- AnimationAction:表示
AnimationClip
的一个实例,负责控制动画的播放行为。
2. 基本用法
为了演示 AnimationAction
的使用,首先我们需要创建一个场景,并添加一个可以应用动画的对象。
2.1 初始化场景
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z = 5;
2.2 添加 3D 对象
我们添加一个简单的立方体对象作为动画的目标:
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
3. 创建 AnimationMixer 和 AnimationClip
在控制动画之前,我们需要创建一个 AnimationMixer
,它是用来管理所有动画的对象。每个 AnimationClip
都表示一个动画,而 AnimationAction
则用于控制该动画的行为。
3.1 创建 AnimationMixer
const mixer = new THREE.AnimationMixer(cube);
3.2 创建 AnimationClip
我们将创建一个简单的动画片段,使立方体沿 Y 轴来回移动:
const positionKF = new THREE.VectorKeyframeTrack(
'.position', // 目标属性
[0, 1, 2], // 关键帧时间点
[0, 0, 0, // 起点位置
0, 2, 0, // 中间位置
0, 0, 0] // 终点位置
);
const clip = new THREE.AnimationClip('move', 2, [positionKF]);
4. 使用 AnimationAction 控制动画
通过 AnimationMixer
和 AnimationClip
创建一个 AnimationAction
,然后可以对动画进行控制。
4.1 创建 AnimationAction 并播放
const action = mixer.clipAction(clip);
action.play();
4.2 在渲染循环中更新动画
为了使动画正常播放,需要在渲染循环中更新 AnimationMixer
:
const clock = new THREE.Clock();
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
mixer.update(delta); // 更新动画
renderer.render(scene, camera);
}
animate();
到这里,我们已经创建了一个基本的动画。立方体会在 Y 轴上来回移动。
5. AnimationAction 的属性和方法
AnimationAction
提供了丰富的属性和方法,用于更精细地控制动画行为。以下将详细介绍常用的属性和方法,并通过示例展示如何使用。
5.1 play()
play()
方法用于开始或恢复动画的播放。
action.play();
5.2 paused
paused
属性控制动画是否暂停。如果将 paused
设置为 true
,动画会停止播放,设置为 false
则恢复播放。
action.paused = true; // 暂停动画
action.paused = false; // 恢复播放
5.3 stop()
stop()
方法停止动画播放,并将播放进度重置为初始状态。
action.stop();
5.4 reset()
reset()
方法将动画进度重置为初始状态,但不会停止动画。
action.reset();
5.5 playbackRate
playbackRate
属性控制动画的播放速度。默认值为 1
,可以通过设置不同的值来加快或减慢动画速度。
action.playbackRate = 2; // 两倍速度播放
action.playbackRate = 0.5; // 半速播放
5.6 time
time
属性表示动画的当前时间。通过设置 time
,可以跳到动画的指定时间点。
action.time = 1.5; // 跳到动画的 1.5 秒处
5.7 weight
weight
属性控制动画的权重,用于在多个动画混合时调整其影响程度。权重范围为 0
(无影响)到 1
(完全影响)。
action.weight = 0.5; // 混合权重为 50%
5.8 loop
loop
属性定义动画的循环方式,Three.js 提供了三种循环模式:
THREE.LoopOnce
:动画播放一次后停止。THREE.LoopRepeat
:动画无限循环。THREE.LoopPingPong
:动画往复循环。
action.loop = THREE.LoopPingPong; // 动画来回播放
6. 混合多个 AnimationAction
Three.js 支持同时播放多个动画,并通过调整权重实现动画的平滑过渡。下面的示例展示了如何混合两个动画。
6.1 创建第二个 AnimationClip
我们再创建一个动画,使立方体沿 X 轴移动:
const positionKF2 = new THREE.VectorKeyframeTrack(
'.position',
[0, 1, 2],
[0, 0, 0, // 起点位置
2, 0, 0, // 中间位置
0, 0, 0] // 终点位置
);
const clip2 = new THREE.AnimationClip('moveX', 2, [positionKF2]);
const action2 = mixer.clipAction(clip2);
6.2 混合动画
我们可以同时播放两个动画,并通过权重控制它们的影响:
action.play();
action2.play();
action.weight = 0.5; // 第一动画的权重
action2.weight = 0.5; // 第二动画的权重
这样,立方体会同时沿 X 轴和 Y 轴移动,产生一个斜向的动画效果。
7. 完整示例
下面是一个完整的示例,展示了如何在 Three.js 中使用 AnimationAction
控制动画:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Three.js AnimationAction 示例</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<style>
body { margin: 0; }
canvas { display: block; }
</style>
</head>
<body>
<script>
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z = 5;
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
const mixer = new THREE.AnimationMixer(cube);
const positionKF = new THREE.VectorKeyframeTrack(
'.position',
[0, 1, 2],
[0, 0, 0, 0, 2, 0, 0, 0, 0]
);
const clip = new THREE.AnimationClip('move', 2, [positionKF]);
const action = mixer.clipAction(clip);
action.play();
const positionKF2 = new THREE.VectorKeyframeTrack(
'.position',
[0, 1, 2],
[0, 0, 0, 2, 0, 0, 0, 0, 0]
);
const clip2 = new THREE.AnimationClip('moveX', 2, [positionKF2]);
const action2 = mixer.clipAction(clip2);
action2.play();
action.weight = 0.5;
action2.weight = 0.5;
const clock = new THREE.Clock();
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
mixer.update(delta);
renderer.render(scene, camera);
}
animate();
</script>
</body>
</html>
8. 处理窗口调整
同样,不要忘记在窗口调整大小时更新渲染器和摄像机:
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
9. 结论
通过 AnimationAction
,你可以灵活地控制 Three.js 中的动画效果,实现丰富的动画场景。本文详细介绍了 AnimationAction
的基本用法、常用属性和方法,并结合示例演示了如何实现不同的动画效果。希望对你在 Three.js 动画开发中有所帮助!如有问题或建议,欢迎留言讨论。