- 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 框架中的 AnimationUtils 使用详解
class AnimationUtilsAnimationUtils
是 Three.js 动画系统中提供的一组实用工具类,帮助开发者在处理动画剪辑(AnimationClip
)和关键帧动画时进行一些常见操作。它包含一些便捷的工具方法,用于简化动画的创建、修改、优化等操作。在本篇博客中,我们将详细介绍 AnimationUtils
的各个方法,结合示例代码,展示如何在实际项目中高效地使用这些工具函数。
1. 什么是 AnimationUtils?
AnimationUtils
是 Three.js 提供的一组静态方法,主要用于操作 AnimationClip
和关键帧动画数据。它可以帮助开发者克隆动画、创建新的动画片段、从现有动画中提取部分动画等。AnimationUtils
通常和 AnimationMixer
、AnimationClip
、AnimationAction
这些动画核心模块配合使用。
1.1 主要应用场景
- 动画片段的重复使用:在一个复杂的场景中,往往需要为不同对象应用相似的动画,通过
AnimationUtils
可以更方便地复制或修改现有的动画片段。 - 动画数据的优化和重用:帮助开发者提取或合并动画数据,以便高效地使用已有资源。
2. AnimationUtils 提供的方法
AnimationUtils
主要提供以下几种常用方法:
cloneClip(clip)
:克隆一个AnimationClip
。subclip(clip, name, startFrame, endFrame, fps)
:从现有的AnimationClip
中提取子剪辑。arraySlice(array, from, to)
:用于裁剪数组内容。convertArray(array, type)
:将数组转换为指定的类型。isTypedArray(object)
:检查给定对象是否为TypedArray
类型。
接下来我们逐一进行详细介绍,并结合具体示例来说明这些方法的实际使用。
3. cloneClip:克隆动画剪辑
cloneClip
用于克隆现有的 AnimationClip
,这在需要为多个对象应用相同的动画时非常有用。
3.1 使用场景
假设你在场景中有多个对象,它们的动画是相同的,但是你希望为每个对象创建独立的动画实例,以便进行个性化调整(例如调整动画速度、时间等)。
3.2 示例
首先,我们创建一个简单的旋转动画剪辑,并通过 AnimationMixer
播放它。
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 rotationKF = new THREE.VectorKeyframeTrack('.rotation[y]', [0, 1, 2], [0, Math.PI, 2 * Math.PI]);
// 创建动画剪辑
const clip = new THREE.AnimationClip('rotateY', 2, [rotationKF]);
// 创建 AnimationMixer
const mixer = new THREE.AnimationMixer(cube);
const action = mixer.clipAction(clip);
action.play();
接着,我们使用 AnimationUtils.cloneClip
克隆这个动画剪辑,并应用到另一个对象上。
const cube2 = new THREE.Mesh(geometry, material);
cube2.position.x = 2;
scene.add(cube2);
// 克隆动画剪辑
const clonedClip = THREE.AnimationUtils.cloneClip(clip);
// 为第二个立方体创建动画
const mixer2 = new THREE.AnimationMixer(cube2);
const action2 = mixer2.clipAction(clonedClip);
action2.play();
3.3 结果
现在两个立方体都会按照相同的动画逻辑沿 Y 轴旋转。通过 cloneClip
,我们能够为不同的对象创建各自独立的动画实例。
4. subclip:从现有动画中提取子剪辑
subclip
是一个非常实用的方法,它可以从现有的 AnimationClip
中提取一部分作为一个新的子动画剪辑。对于长时间的动画或复杂的动画场景,subclip
提供了一种高效的方法来只提取所需的片段。
4.1 使用场景
在一个长时间的动画中,可能只有某些部分是我们需要反复使用的,通过 subclip
可以只提取这些部分,避免重复创建类似的动画。
4.2 示例
我们先创建一个较长的旋转动画,然后使用 subclip
提取其中的一部分。
const rotationKF2 = new THREE.VectorKeyframeTrack('.rotation[y]', [0, 2, 4], [0, Math.PI, 2 * Math.PI]);
const longClip = new THREE.AnimationClip('longRotateY', 4, [rotationKF2]);
// 提取从第 1 秒到第 3 秒的子剪辑
const shortClip = THREE.AnimationUtils.subclip(longClip, 'shortRotateY', 1, 3, 30);
// 使用提取的子剪辑
const action3 = mixer.clipAction(shortClip);
action3.play();
4.3 结果
现在,我们只提取了动画的中间部分,立方体将只在动画的第 1 秒到第 3 秒之间旋转。通过 subclip
,我们可以灵活地从一个长动画中提取所需的片段。
5. arraySlice:裁剪数组
arraySlice
是一个简单的工具方法,用于从数组中提取一部分内容。尽管 JavaScript 原生提供了 slice
方法,但 arraySlice
可以处理 TypedArray
类型的数据。
5.1 示例
const originalArray = new Float32Array([0, 1, 2, 3, 4, 5]);
const slicedArray = THREE.AnimationUtils.arraySlice(originalArray, 1, 4);
console.log(slicedArray); // 输出 [1, 2, 3]
6. convertArray:转换数组类型
convertArray
可以将一个数组从一种类型转换为另一种类型。它通常用于处理动画中的 TypedArray
,比如从 Float32Array
转换为 Uint16Array
。
6.1 示例
const floatArray = new Float32Array([1.5, 2.5, 3.5]);
const intArray = THREE.AnimationUtils.convertArray(floatArray, Uint16Array);
console.log(intArray); // 输出 Uint16Array [1, 2, 3]
6.2 使用场景
当需要将动画数据从一种格式转换为另一种时(比如精度要求不同),convertArray
非常有用。
7. isTypedArray:检查是否为 TypedArray
isTypedArray
用于检查给定的对象是否是 TypedArray
。这在处理动画数据时,确保数组的类型正确非常重要。
7.1 示例
const floatArray = new Float32Array([1, 2, 3]);
const regularArray = [1, 2, 3];
console.log(THREE.AnimationUtils.isTypedArray(floatArray)); // 输出 true
console.log(THREE.AnimationUtils.isTypedArray(regularArray)); // 输出 false
8. 综合示例:使用 AnimationUtils 处理复杂动画
为了更好地展示 AnimationUtils
的功能,我们来实现一个复杂的动画场景:多个立方体共享相同的旋转动画,但是每个立方体的动画片段是从一个完整动画中提取出来的。
8.1 创建场景
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z = 5;
8.2 创建长动画剪辑
const rotationKF3 = new THREE.VectorKeyframeTrack('.rotation[y]', [0, 2, 4, 6], [0, Math.PI / 2, Math.PI, 2 * Math.PI]);
const longClip2 = new THREE.AnimationClip('longRotateY', 6, [rotationKF3]);
8.3 为每个立方体提取不同的子剪辑
const cubes = [];
const mixers = [];
for (let i = 0; i < 3; i++) {
const cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({ color: 0x00ff00 }));
cube.position.x = i * 2 - 2;
scene.add(cube);
cubes.push(cube);
const subClip = THREE.AnimationUtils.subclip(longClip2, `rotatePart${i}`, i * 2, (i + 1) * 2, 30);
const mixer = new THREE
.AnimationMixer(cube);
const action = mixer.clipAction(subClip);
action.play();
mixers.push(mixer);
}
8.4 动画循环
const clock = new THREE.Clock();
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
mixers.forEach(mixer => mixer.update(delta));
renderer.render(scene, camera);
}
animate();
9. 总结
AnimationUtils
是 Three.js 动画系统中的一个强大工具类,提供了多种实用的方法,帮助开发者更高效地创建、管理和控制动画。通过结合使用 AnimationMixer
、AnimationClip
和 AnimationAction
,以及 AnimationUtils
的辅助方法,开发者可以实现复杂而高效的动画效果,从而提升3D应用的用户体验。
本文详细介绍了 AnimationUtils
的主要方法及其用法,并通过多个实例展示了如何将其与其他动画组件结合使用。掌握这些技巧,将使你能够在 Three.js 项目中创建出更加生动和高效的动画效果。
希望本文对你理解和使用 AnimationUtils
有所帮助!如果有任何问题或建议,欢迎在评论区留言讨论。