Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >惊!Three.js 动画从“零基础菜鸟”到“技术大神”的蜕变之旅

惊!Three.js 动画从“零基础菜鸟”到“技术大神”的蜕变之旅

原创
作者头像
Front_Yue
发布于 2025-03-18 11:35:37
发布于 2025-03-18 11:35:37
10812
代码可运行
举报
文章被收录于专栏:码艺坊码艺坊
运行总次数:2
代码可运行

前言

在 Three.js 中,动画是实现动态视觉效果的核心功能之一。无论是简单的物体移动,还是复杂的角色动画,Three.js 都提供了强大的工具和灵活的接口来满足各种需求。本文将从基础动画、骨骼动画和第三方动画库三个方面,详细介绍如何在 Three.js 中实现动画效果。

一、基础动画:使用 requestAnimationFrame 更新对象属性

在 Three.js 中,最基础的动画实现方式是通过 requestAnimationFrame 方法来更新场景中对象的属性,如位置、旋转和缩放等。requestAnimationFrame 是浏览器提供的一个高性能动画循环方法,它能够确保动画在不同设备上以最佳的帧率运行。

1. 实现步骤

以下是使用 requestAnimationFrame 实现基础动画的基本步骤:

  1. 初始化场景、相机和渲染器:这是 Three.js 的标准初始化流程,创建一个场景、一个相机和一个渲染器,并将渲染器的 DOM 元素添加到页面中。
  2. 创建动画对象:在场景中添加一个或多个对象,这些对象的属性将在动画中被更新。
  3. 编写动画循环:使用 requestAnimationFrame 方法创建一个动画循环函数,在该函数中更新对象的属性,并调用渲染器的 render 方法重新渲染场景。

2. 示例代码

以下是一个简单的示例,展示如何让一个立方体沿着 Y 轴旋转:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 初始化场景、相机和渲染器
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);

// 创建一个立方体
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

// 设置相机位置
camera.position.z = 5;

// 动画循环
let angle = 0;
function animate() {
    requestAnimationFrame(animate);

    // 更新立方体的旋转角度
    angle += 0.01;
    cube.rotation.y = angle;

    // 重新渲染场景
    renderer.render(scene, camera);
}

// 启动动画
animate();

3. 关键点解析

  • 性能优化requestAnimationFrame 会自动根据浏览器的刷新率调整动画的帧率,确保动画的流畅性。
  • 动态更新:通过在动画循环中修改对象的属性(如 rotationposition 等),可以实现各种动态效果。

二、骨骼动画:使用 SkinnedMesh 和骨骼系统实现复杂角色动画

对于复杂的角色动画,如人物行走、奔跑等,基础的属性更新方式显得力不从心。这时,骨骼动画(Skinning Animation)就派上了用场。骨骼动画通过定义一个骨骼层级结构(Bone Hierarchy),并将模型的顶点与骨骼绑定,实现骨骼的运动带动模型的变形。

1. 关键概念

  • 骨骼(Bone):骨骼是动画的基础单元,它们通过父子关系组成一个层级结构。
  • 蒙皮(Skinning):将模型的顶点与骨骼绑定,使骨骼的运动能够影响模型的形状。
  • 动画剪辑(AnimationClip):定义了一组骨骼动画的关键帧数据,用于控制骨骼的运动。

2. 实现步骤

  1. 加载带骨骼的模型:通常使用 GLTFLoaderFBXLoader 加载包含骨骼动画的模型文件(如 .glb.fbx)。
  2. 设置骨骼动画:通过 AnimationMixerAnimationAction 控制骨骼动画的播放。
  3. 更新动画状态:在动画循环中更新 AnimationMixer 的时间,以驱动骨骼动画的播放。

3. 示例代码

以下是一个加载并播放骨骼动画的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 初始化场景、相机和渲染器(省略,与基础动画相同)

// 使用 GLTFLoader 加载带骨骼的模型
const loader = new THREE.GLTFLoader();
loader.load('path/to/model.glb', (gltf) => {
    const model = gltf.scene;
    scene.add(model);

    // 获取动画剪辑
    const animations = gltf.animations;
    const mixer = new THREE.AnimationMixer(model);

    // 播放第一个动画剪辑
    const action = mixer.clipAction(animations[0]);
    action.play();
}, undefined, (error) => {
    console.error(error);
});

// 动画循环
function animate() {
    requestAnimationFrame(animate);

    // 更新骨骼动画
    if (mixer) {
        mixer.update(0.016); // 16ms 为一帧的时间间隔
    }

    // 重新渲染场景
    renderer.render(scene, camera);
}

// 启动动画
animate();

4. 关键点解析

  • 模型文件:骨骼动画需要使用支持骨骼动画的模型文件(如 .glb.fbx)。这些文件中包含了骨骼结构和动画数据。
  • 动画混合器(AnimationMixer):负责驱动骨骼动画的播放,通过调用 update 方法更新动画状态。
  • 动画剪辑(AnimationClip):定义了骨骼动画的关键帧数据,可以通过 clipAction 方法获取并播放。

三、第三方动画库:使用 GSAP 控制 Three.js 对象动画

虽然 Three.js 本身提供了强大的动画功能,但在某些场景下,使用第三方动画库(如 GSAP)可以更方便地实现复杂的动画效果。GSAP(GreenSock Animation Platform)是一个高性能的 JavaScript 动画库,它提供了丰富的动画功能和强大的性能优化。

1. 为什么使用 GSAP?

  • 简单易用:GSAP 提供了简洁的 API,可以轻松实现复杂的动画效果。
  • 性能优化:GSAP 在内部进行了大量的性能优化,确保动画的流畅性。
  • 丰富的功能:支持时间轴、缓动函数、动画序列等功能,可以实现复杂的动画组合。

2. 实现步骤

  1. 引入 GSAP:通过 CDN 或 npm 安装 GSAP,并在项目中引入。
  2. 创建动画:使用 GSAP 的 gsap.togsap.from 方法创建动画,指定目标对象和动画属性。
  3. 控制动画:通过 GSAP 的时间轴功能(Timeline),可以控制动画的播放、暂停、倒播等。

3. 示例代码

以下是一个使用 GSAP 实现 Three.js 对象动画的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 引入 GSAP
import gsap from 'gsap';

// 初始化场景、相机和渲染器(省略,与基础动画相同)

// 创建一个立方体
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

// 使用 GSAP 创建动画
gsap.to(cube.position, {
    x: 5,
    y: 5,
    z: 5,
    duration: 2, // 动画持续时间
    ease: 'power1.inOut', // 缓动函数
    repeat: -1, // 无限重复
    yoyo: true // 往返运动
});

// 动画循环
function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}

// 启动动画
animate();

4. 关键点解析

  • 目标对象:GSAP 的动画目标可以是任何对象,包括 Three.js 的 Object3D 类型。
  • 动画属性:可以指定对象的任何属性作为动画目标,如 positionrotationscale 等。
  • 缓动函数:GSAP 提供了丰富的缓动函数,可以通过 ease 参数指定动画的运动曲线。

总结

在 Three.js 中,动画的实现方式多种多样,从基础的 requestAnimationFrame 更新属性,到复杂的骨骼动画,再到第三方动画库的集成,开发者可以根据需求选择合适的工具。基础动画适用于简单的动态效果,骨骼动画适合复杂的角色动画,而 GSAP 则提供了更强大的动画控制能力。通过合理组合这些方法,可以实现丰富多样的视觉效果,为你的 Three.js 项目增添无限魅力。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Three.js 性能监视器 Stats
说到动画,第一个联想到的概念就是“帧”。这是用来衡量和描述动画是否流畅的一个单位。
德育处主任
2022/09/23
2.1K0
Three.js 性能监视器 Stats
探究Three.js中模型移动与旋转的交互逻辑
Three.js作为一个功能强大的JavaScript 3D库,极大地简化了在网页上创建和展示3D图形的过程。它在游戏开发、产品展示、虚拟现实等众多领域都被广泛应用。通过Three.js,开发者能够轻松创建出复杂的三维场景和交互性强的3D应用,为用户带来沉浸式的体验。
Front_Yue
2025/03/16
1210
探究Three.js中模型移动与旋转的交互逻辑
web网站使用three.js来绘制三维图形
最近项目中在地图中显示三维河床的功能,最终实现是用three.js来实现绘制的。这里记录一下整体的调用过程。
china马斯克
2024/08/05
3830
Three.js 实现 360 度全景浏览的最简单方式
一般我们拍照都是拍一个方向,而全景图是拍上下左右前后 6 个方向,360 度,这样能够立体的记录所在的场景。
神说要有光zxg
2021/12/04
4.7K0
Three.js 实现 360 度全景浏览的最简单方式
Three.js可视化企业实战WEBGL网-2024入门指南
Three.js 是一个功能强大的 JavaScript 库,用于在 Web 浏览器中创建和显示动画 3D 图形。它的丰富 API 和模块化设计使得开发者可以轻松构建复杂的 3D 场景和动画效果。本文将详细介绍 Three.js 中的一些重要组件和模块,包括场景、相机、几何体、材质、光源、渲染器和控制器等。
用户11130883
2024/05/31
1770
Three.JS编程中如何切换gltf模型动画?
在Threejs编程中,处理GLTF模型动画的切换主要涉及对模型中的动画剪辑(AnimationClip)进行管理和播放控制。下面的代码,展示如何在Three.js中切换GLTF模型的动画。
用户8703799
2024/09/04
2770
Threejs入门之二十五:Threejs加载gltf文件
这一节我们来通过Threejs加载一个glft格式的三维模型文件,首先我们先简单了解下gltf文件
九仞山
2023/04/30
7.6K3
Threejs入门之二十五:Threejs加载gltf文件
元宇宙基础案例 | 大帅老猿threejs特训
「元宇宙」这个概念在近来十分火热,但本质来上说,元宇宙这个词更多的是一个商业上的概念,在这个概念里面融入集成了很多现有的技术。具体可能包括:
用户2225445
2023/10/16
5360
元宇宙基础案例 | 大帅老猿threejs特训
使用Three.js构建基础3D场景 | 《Three.js零基础直通03》
这是我们开始使用Three.js的第一个小节,我们回顾一下用Web开发最经典的方式来使用它,一个<script>标签。
大帅老猿
2022/06/06
5.7K0
使用Three.js构建基础3D场景 | 《Three.js零基础直通03》
基于 three.js 的 3D 粒子动效实现
粒子特效是为模拟现实中的水、火、雾、气等效果由各种三维软件开发的制作模块,原理是将无数的单个粒子组合使其呈现出固定形态,借由控制器、脚本来控制其整体或单个的运动,模拟出现真实的效果。three.js是用JavaScript编写的WebGL的第三方库,three.js提供了丰富的API帮助我们去实现3D动效,本文主要介绍如何使用three.js实现粒子过渡效果,以及基本的鼠标交互操作。(注:本文使用的关于three.js的API都是基于版本r98的。)
个推
2019/04/08
7K0
基于 three.js 的 3D 粒子动效实现
Vue3 + Three.js 商城可视化实战
链接:https://juejin.cn/post/7137192060045492231
winty
2024/04/03
2500
Vue3 + Three.js 商城可视化实战
『Three.js』起飞!
我习惯使用 vs code 编写前端代码,如果是用原生三件套学习,我还会使用 Live Server 插件辅助开发。
德育处主任
2022/09/23
10.8K0
『Three.js』起飞!
Threejs项目实战之二:产品三维爆炸图效果展示
今天我们来实现如何使用ThreeJS实现产品的三维爆炸图分解与组合的效果,先看下最终项目完成后的效果展示动画
九仞山
2023/12/11
1.7K1
Threejs项目实战之二:产品三维爆炸图效果展示
Three.js 基础纹理贴图
尽管 Three.js 文档已经比较详细了,但对于刚接触 Three.js 的工友来说,最麻烦的还是不懂如何组合。Three.js 的功能实在太多了,初学者很容易被大量的新概念冲晕。
德育处主任
2023/02/26
5.7K0
Three.js 基础纹理贴图
使用Three.js渲染器创建炫酷3D场景
在当今数字化的时代,3D图形技术正以其独特的魅力在各个领域掀起波澜。从影视制作到游戏开发,从虚拟现实到网页交互,3D场景以其强烈的视觉冲击力和沉浸式的体验,成为了吸引用户、传达信息的重要手段。而Three.js,作为一款功能强大且广受欢迎的JavaScript 3D库,为我们提供了便捷、高效的途径来创建令人炫目的3D场景。本文将深入探讨使用Three.js渲染器创建炫酷3D场景的方方面面,带领读者领略这一领域的无限可能。
Front_Yue
2025/03/14
1300
使用Three.js渲染器创建炫酷3D场景
Three.js世界中的三要素:场景、相机、渲染器
Three.js是一个基于WebGL的JavaScript库,它允许开发者在网页上创建和显示复杂的3D图形和动画,而无需用户安装任何额外的插件或软件。Three.js在Web开发中的地位非常重要,它通过提供简单直观的API,极大地降低了3D图形开发的门槛,使得开发者可以更专注于实现创意。Three.js广泛应用于游戏开发、虚拟现实、数据可视化、艺术创作等多个领域。
Front_Yue
2025/03/01
1330
Three.js世界中的三要素:场景、相机、渲染器
Three.js 场景创建基础
在当今数字化的时代,Web 开发已经不再局限于传统的二维界面。随着技术的不断进步,越来越多的开发者开始探索将 3D 图形引入到网页中,为用户带来更加沉浸式和交互性的体验。而 Three.js 作为一款广受欢迎的 JavaScript 3D 库,为开发者提供了强大而便捷的工具,使得在网页上创建和展示复杂的 3D 场景变得不再困难。本文将深入探讨 Three.js 场景创建的基础知识,包括其简介、引入方式,以及场景构建的关键要素。
Front_Yue
2025/03/12
1000
Three.js 场景创建基础
Three.JS的第一个三弟(3D)案例
Three.js 是基于 WebGL 技术,用于浏览器中开发 3D 交互场景的 JS 引擎。
不惑
2024/04/23
2690
Three.JS的第一个三弟(3D)案例
『Three.js』几个简单的入门动画(新手篇)
如果对上面的代码还不太理解,可以先看看 《『Three.js』起飞!》 ,坐标轴方面可以看看 《『Three.js』辅助坐标轴》 。
德育处主任
2022/09/09
2.6K0
『Three.js』几个简单的入门动画(新手篇)
用 Three.js 画一个哆啦A梦的时光机
在 three.js 里以向右的方向为 x 轴,向上的方向为 y 轴,向前的方向为 z 轴:
神说要有光zxg
2023/08/28
4840
用 Three.js 画一个哆啦A梦的时光机
相关推荐
Three.js 性能监视器 Stats
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验