THREE.js学习笔记3——Animations

news/2025/1/12 23:21:06/文章来源:https://www.cnblogs.com/xxxiCJQ/p/18666251

这一小节主要学习动画。
在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.01cube.rotation.z += 0.05renderer.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.01const elapesdTime = clock.getElapsedTime();cube.rotation.y = elapesdTime// cube.rotation.z += 0.01renderer.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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868403.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Raspberry PI】Raspberry PiSP摄像头前端(rpl-cfe)

1.PiSP相机前端 PiSP 摄像头前端 (CFE) 是一个将 CSI-2 接收器与 一个简单的 ISP,称为前端 (FE)。 CFE 有四个 DMA 引擎,可以从四个单独的流写入帧 从 CSI-2 接收到内存。也可以路由其中一个流 直接给 FE 做最少的图片处理,写两个版本 (例如,未缩放和缩小版本)将接收…

一文看懂“高大上”的边缘计算!!

一、边缘计算(Edge Computing) 边缘计算是一种分布式计算架构,其核心思想是将计算、存储和数据处理任务从云端推到靠近数据源的设备或网络边缘。通过这种方式,数据可以在本地(离数据源更近的地方)进行处理,从而减少延迟、减轻带宽负担、提高处理效率,并降低对远程数据中…

使用 CompletableFuture 实现异步编程

使用 CompletableFuture 实现异步编程 在现代 Java 开发中,异步编程是一项重要使用 CompletableFuture 实现异步编程 在现代 Java 开发中,异步编程是一项重要技能。而 CompletableFuture 是从 Java 8 开始提供的一个功能强大的工具,用于简化异步任务的编写和组合。本文将详细…

PCIe总线-存储器域和PCIe总线域访问流程分析(二)

1.概述 PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于PCIe总线域。存储器域访问PCIe总线域或者PCIe总线域访问存储器域,需要经过一系列的转…

在Windows上调试iOS Safari中的H5页面

本次开发的web页面需要适配移动端,第一个版本在发布到线上,发现ios设备一直打不开网页,无论是自带的safari浏览器还是其他浏览器,页面经常出现“***页面重复出现错误”,但是在本地以及使用PC浏览器模拟都没有复现该问题。为了进行线上的调试查询了一下如何在windows上调试…

大模型AI应用场景及产品汇总(持续更新)

一、文生图 1. Napkin AINapkin AI 可以基于输入的文本生成各种图示,例如流程图、逻辑关系图等等。https://app.napkin.ai/

大模型AI应用场景汇总(持续更新)

一、文生图 1. Napkin AINapkin AI 可以基于输入的文本生成各种图示,例如流程图、逻辑关系图等等。https://app.napkin.ai/

G1原理—5.G1垃圾回收过程之Mixed GC

大纲 1.Mixed GC混合回收是什么 2.YGC可作为Mixed GC的初始标记阶段 3.Mixed GC并发标记算法详解(一) 4.Mixed GC并发标记算法详解(二) 5.Mixed GC并发标记算法详解(三) 6.并发标记的三色标记法 7.三色标记法如何解决错标漏标问题 8.SATB如何解决错标漏标问题 9.重新梳理Mixed …

AlexNet文献阅读与代码实现

目录AlexNet文献阅读与代码实现文献内容介绍代码实现内容总结 AlexNet文献阅读与代码实现前言:笔者目前研一,刚开始入门深度学习,所以想记录一下自己学习的过程,接下来的时间里,我会定期阅读深度学习领域的经典文献,并尝试用代码实现它们,也欢迎大家积极评论。注:博客本…

c语言的基本类型及输入输出占位符

基本类型 c语言的基本类型:int 【long、short、unsigned、signed(c90)】、char、float、double、_Bool【布尔值】、_complex、_Imaginary【复数和虚数】 输入输出 printf标志字符标志 含义- 转换的结果在字段内左对齐+ 有符号的转换结果总是以+或者-开始空格 如果有符号转换的…

LeetCode:65.有效数字

LeetCode:65.有效数字解题步骤构建一个表示状态的图。遍历字符串,并沿着图走,如果到了某个节点无路可走就返false。遍历结束,如走到3/5/6,就返回true,否则返回false。 extend 2 8 10 16进制 /*** 检查一个字符串是否可以表示为一个有效的数字* @param {string} s - 待检查的…

vs2019项目报错:文件中的类都不能进行设计,解决办法_无法设计基类system.void

文件中的类都不能进行设计,因此未能为该文件显示设计器。设计器检查出文件中有以下类: Form1 --- 无法设计基类“System.Void”。 出现上述错误,解决办法如下: 关闭所有设计窗口(例如form1.cs(设计)),菜单栏生成,清理解决方案,关闭vs2022,重新启动vs2022打开你的项目…