第七章 Three.js 动画与交互

2025-12-13 0 141

在三维图形中,动画交互是使场景更具动态性和用户参与度的关键因素。Three.js 提供了丰富的 API 和工具来实现各种动画效果和交互功能。在这一章中,我们将深入学习如何使用 Three.js 实现动画和交互。

7.1 基本动画原理
动画的基本原理是在每一帧中更新物体的属性(如位置、旋转、缩放等),然后重新渲染场景。在 Three.js 中,我们通常使用 requestAnimationFrame 来创建一个循环,不断更新场景并渲染。

示例代码:
// 创建一个场景
const scene = new THREE.Scene();
// 创建一个相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// 创建一个渲染器并添加到HTML文档中
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);
// 动画循环函数
function animate() {
requestAnimationFrame(animate); // 请求下一帧动画
cube.rotation.x += 0.01; // 更新立方体的旋转角度
cube.rotation.y += 0.01;
renderer.render(scene, camera); // 渲染场景
}
animate();

7.2 使用 requestAnimationFrame 实现动画
requestAnimationFrame 是一个高效的浏览器原生方法,用于告诉浏览器你希望执行一个动画,并在重绘之前调用指定的函数来更新动画。

示例代码:
function animate() {
requestAnimationFrame(animate); // 请求下一帧动画
cube.rotation.x += 0.01; // 更新立方体的旋转角度
cube.rotation.y += 0.01;
renderer.render(scene, camera); // 渲染场景
}
animate(); // 启动动画循环

7.3 基础交互事件
Three.js 支持多种交互事件,如鼠标点击、移动等。我们可以使用 Raycaster 来检测用户交互并做出响应。

示例代码:
// 创建一个 Raycaster 和一个鼠标向量
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
// 添加鼠标移动事件监听器
document.addEventListener(\’mousemove\’, onMouseMove, false);
function onMouseMove(event) {
// 将鼠标位置归一化到 -1 到 1 之间
mouse.x = (event.clientX / window.innerWidth) * 2 – 1;
mouse.y = – (event.clientY / window.innerHeight) * 2 + 1;
}
function animate() {
requestAnimationFrame(animate);
raycaster.setFromCamera(mouse, camera); // 使用鼠标位置和相机更新 Raycaster
const intersects = raycaster.intersectObjects(scene.children); // 计算射线与场景对象的交集
for (let i = 0; i < intersects.length; i++) {
intersects[i].object.material.color.set(0xff0000); // 如果相交,改变物体颜色
}
renderer.render(scene, camera);
}
animate();

7.4 轨道控制器 (OrbitControls)
轨道控制器允许用户通过拖拽鼠标来旋转、缩放和平移相机视角。Three.js 提供了一个非常方便的轨道控制器 OrbitControls。

示例代码:
// 引入 OrbitControls 脚本
import { OrbitControls } from \’three/examples/jsm/controls/OrbitControls.js\’;
// 创建 OrbitControls 并绑定到相机和渲染器的 DOM 元素
const controls = new OrbitControls(camera, renderer.domElement);
// 在动画循环中更新控制器
function animate() {
requestAnimationFrame(animate);
controls.update(); // 更新控制器状态
renderer.render(scene, camera);
}
animate();

7.5 使用 GSAP 实现高级动画
GSAP(GreenSock Animation Platform)是一个功能强大的 JavaScript 动画库,可以用于创建复杂的动画效果。我们可以结合 GSAP 和 Three.js 来实现高级动画。

示例代码:
// 引入 GSAP 库
import { gsap } from \’gsap\’;
// 使用 GSAP 创建一个简单的动画
gsap.to(cube.rotation, { duration: 2, x: Math.PI * 2, repeat: -1, yoyo: true });
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();

7.6 鼠标拖拽交互
通过监听鼠标事件,我们可以实现物体的拖拽功能。下面是一个简单的例子,展示如何通过鼠标拖拽来移动物体。

示例代码:
let isDragging = false;
let previousMousePosition = {
x: 0,
y: 0
};
document.addEventListener(\’mousedown\’, function(e) {
isDragging = true;
});
document.addEventListener(\’mousemove\’, function(e) {
if (isDragging) {
let deltaMove = {
x: e.offsetX – previousMousePosition.x,
y: e.offsetY – previousMousePosition.y
};

cube.rotation.y += deltaMove.x * 0.01;
cube.rotation.x += deltaMove.y * 0.01;
}
previousMousePosition = {
x: e.offsetX,
y: e.offsetY
};
});
document.addEventListener(\’mouseup\’, function(e) {
isDragging = false;
});

通过这几节的学习,读者应该能够在 Three.js 中实现基本的动画效果,并且能够通过鼠标和轨道控制器进行简单的交互。掌握动画和交互,可以让你的三维场景更加生动和互动。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/imdeity/article/details/139636861

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 第七章 Three.js 动画与交互 https://www.zuozi.net/36638.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务