首页 > 其他分享 >THREE.js学习笔记3——Animations

THREE.js学习笔记3——Animations

时间:2025-01-12 23:21:52浏览次数:1  
标签:动画 cube 一帧 render deltaTime THREE js Animations position

这一小节主要学习动画。
在JavaScript中的动画,其实就是渲染一帧,停顿一会儿,再渲染一帧。所以我们需要在每一帧都更新物体和重新渲染。
调用window.requestAnimationFrame();函数来实现。
The purpose of requestAnimationFrame is to call the function provided on the next frame.
We are going to call the same function on each new frame.
就是requestAnimationFrame函数的目的是提供下一帧的画面,而不是做了一个动画,只是看起来像动画一样。
会在每一帧上调用这个函数,连起来就像动画了。

function render() {
    if (cube.position.x > 10) {
        cube.position.x = 0;
    }
    cube.position.x += 0.01
    cube.rotation.z += 0.05
    renderer.render(scene, camera);
    //渲染下一帧的时候就会调用render函数
    //这两个都是一样的
    requestAnimationFrame(render);
    window.requestAnimationFrame(render);
}

render()

在不同的电脑上,会有不同的帧率,这就会导致相同的代码,在有的电脑上,动画就会快一点,有的则会慢一点。
We need to know how much time it's been since the last tick.
Use Date.now() to get the current timestamp.
所以我们要知道和最新的帧画面和现在间隔了多久,使用Date.now()来获取准确的时间戳。
Subtract the previous time to get the deltaTime.
Use the deltaTime in the animation.
减去上一个时间戳就可以得到时间差,将时间差用在动画中,这样的动画就不会有差异。

let time = Date.now();

function render() {
    const currentTime = Date.now();
    const deltaTime = currentTime - time;
    time = currentTime;
    cube.rotation.y += 0.01 * deltaTime;
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

render()

不同的电脑会得到不同的deltaTime,帧率高的deltaTime就会小,每一帧移动的就小,帧率低的deltaTime就会大,每一帧移动的就大。将deltaTime和累加的值相乘,这样就达到了动画的平衡。
同时可以使用THREE.js中内置的Clock来解决问题。
实例化Clock并使用其getElapsedTime()方法

// Clock
const clock = new THREE.Clock();
function render() {
    // if (cube.position.x > 10) {
    //     cube.position.x = 0;
    // }
    // cube.position.x += 0.01
    // cube.rotation.x += 0.01

    const elapesdTime = clock.getElapsedTime();

    cube.rotation.y = elapesdTime
    // cube.rotation.z += 0.01
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

getElapsedTime()获得的是时钟的总运行时间,单位为秒
同时,还可以在render()函数中这样写

//一秒钟转一圈的话
cube.rotation.y = elapesdTime * Math.PI * 2;
//也可以使用上sin,cos函数,实现往返周期性运动,下面是围绕着z轴的圆周运动
cube.position.y = Math.sin(elapesdTime);
cube.position.x = Math.cos(elapesdTime);

使用library,来获取更多的控制

If you want to have more control,create tweens,create timelines,etc.you can use a library like GSAP

//安装,引入GSAP
 npm install --save gsap@3.5.1
 import gsap from 'gsap';
//使用gsap创建一个tween
//第一个参数是模型的位置,第二个参数是一个对象,里面包含duration(周期),delay(延迟),x(位移)
//这句话的意思就是延迟一秒之后将cube沿着x轴在两秒内移动2单位
gsap.to(cube.position, { duration: 2, delay: 1, x: 2 });

标签:动画,cube,一帧,render,deltaTime,THREE,js,Animations,position
From: https://www.cnblogs.com/xxxiCJQ/p/18666251

相关文章

  • Vue.js组件开发-如何使用moment.js
    在Vue.js组件开发中,需要处理日期和时间,moment.js是一个非常有用的库。moment.js提供了丰富的API来解析、验证、操作和显示日期和时间。步骤:1.安装moment.js首先,需要通过npm或yarn安装moment.js。在项目根目录下运行以下命令:npminstallmoment--save#或者yarnaddm......
  • JS宏实例:合并多个工作簿中的数据
    一、分析数据结构首先将要合并的工作簿放在同一个文件夹下面,方便操作。如下图所示:打开每个工作簿,查看数据结构。这里UP只做一个简单的示例,所以每个表的数据结构是完全相同的。如下图所示:明确数据结构之后,我们就可以梳理逻辑,考虑如何去实现这一功能。二、逻辑梳理1、打......
  • 抖音评论生成器在线工具,好评生成器软件,用js+html即可实现
    开发技术HTML:用于搭建页面结构。CSS:用于美化页面样式。JavaScript:实现核心逻辑,包括文案生成、随机选择、复制功能等。 部分框架代码:<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=d......
  • 《jspm二手车估值与销售网络平台》毕业设计项目
    大家好,我是俊星学长,一名在Java圈辛勤劳作的码农。今日,要和大家分享的是一款《jspm二手车估值与销售网络平台》毕业设计项目。项目源码以及部署相关事宜,请联系俊星学长,文末会附上联系信息哦。......
  • 《jspm二手车估值与销售网络平台》毕业设计项目
    大家好我是小村学长,混迹在java圈的辛苦码农。今天要和大家聊的是一款《jspm二手车估值与销售网络平台》毕业设计项目。项目源码以及部署相关请联系小村学长,文末附上联系信息。......
  • vue3 + arcgis.js4.x---FeatureLayer(实现文本+图标)
    之前做arcgis.js开发的时候一直使用的是TextSymbol+SimpleMarkerSymbol实现的也就是一条数据打两个点(一个坐标点一个文本点)这种操作实在非常鸡肋;学会了FeatureLayer之后发现实现该功能非常简单constLayerView=newFeatureLayer({source:[newGraphic({......
  • 前端必知必会-Node.js 发送电子邮件
    文章目录Node.js发送电子邮件Nodemailer模块发送电子邮件多个接收者发送HTML总结Node.js发送电子邮件Nodemailer模块Nodemailer模块让您可以轻松地从计算机发送电子邮件。可以使用npm下载和安装Nodemailer模块:C:\Users\YourName>npminstallnodemai......
  • 前端必知必会-Node.js连接MySQL
    文章目录Node.jsMySQLMySQL数据库安装MySQL驱动程序创建连接查询数据库总结Node.jsMySQLNode.js可用于数据库应用程序。最流行的数据库之一是MySQL。MySQL数据库为了能够试验代码示例,您应该在计算机上安装MySQL。您可以在https://www.mysql.com/down......
  • 基于nodejs的宠物生活社区网站
    基于Node.js的宠物生活社区网站是一个为宠物爱好者打造的综合性线上平台,它借助Node.js的技术优势,提供了丰富的功能和便捷的用户体验。一、技术背景与优势技术基础:基于Node.js构建,Node.js是一个开源的、跨平台的JavaScript运行时环境,它允许开发者在服务器端运行JavaScript......
  • 简要描述下JS有哪些内置的对象
    在前端开发中,JavaScript提供了多个内置对象,这些对象使得开发者能够更轻松地执行常见的任务。以下是一些主要的JavaScript内置对象:Math:提供数学函数和常数,如Math.random()(生成随机数)和Math.PI(π的值)。Date:用于处理日期和时间。可以创建日期对象,获取当前日期和时间,或者......