当前位置: 首页 > news >正文

【Three.js基础】坐标轴辅助器、requestAnimationFrame处理动画、Clock时钟、resize页面尺寸(二)

🐱 个人主页:不叫猫先生
🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏:vue3从入门到精通、TypeScript从入门到实践
📢 资料领取:前端进阶资料以及文中源码可以找我免费领取
🔥 前端学习交流:博主建立了一个前端交流群,汇集了各路大神,一起交流学习,期待你的加入!(文末有我wx或者私信)

目录

  • 搭建three.js环境
    • 1.添加坐标轴辅助器
      • (1)添加坐标轴辅助器,设置坐标轴长度
      • (2)坐标轴添加场景
    • 2.resize页面尺寸
      • (1)设置监听
      • (2)更新摄像头
      • (3)更新渲染器
      • (4)更新像素比
    • 3.普通方式处理动画
    • 4.requestAnimationFrame处理几何体动画
    • 5.clock跟踪事件处理动画
      • (1)获取时钟运行总时长
      • (2)获取两帧之间的时间差

搭建three.js环境

本文内容承接基础(一)。

1.添加坐标轴辅助器

AxesHelper:用于简单模拟3个坐标轴的对象,红色代表 X 轴.,绿色代表 Y 轴.,蓝色代表 Z 轴。
用法:AxesHelper( size : Number ),参数如下

  • size :表示代表轴的线段长度. 默认为 1,可选。

(1)添加坐标轴辅助器,设置坐标轴长度

//添加坐标轴辅助器(参数是坐标轴的长度),设置坐标轴长度为5
const axesHelper = new THREE.AxesHelper(5) 

(2)坐标轴添加场景

sence.add(axesHelper)

2.resize页面尺寸

当页面尺寸大小变化,内容要自适应,使用resize来监听。监听时需要更新摄像头、摄像机的投影矩阵、渲染器、渲染器的像素比。

(1)设置监听

window.addEventListener('resize',()=>{//代码执行
})

(2)更新摄像头

camera.aspect = window.innerWidth / window.innerHeight;

(3)更新渲染器

renderder.resize(window.innerWidth, window.innerHeight)

(4)更新像素比

renderer.setPixelRatio(window.devicePixelRatio)

整体代码如下:

//监听画面变化,更新渲染画面
window.addEventListener('resize', () => {console.log('画面变化了')//更新摄像头camera.aspect = window.innerWidth / window.innerHeight;//更新摄像机的投影矩阵,三维通过矩阵算法映射到屏幕的二维画面camera.updateProjectionMatrix()//更新渲染器renderer.setSize(window.innerWidth, window.innerHeight)//更新渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio)
})

3.普通方式处理动画

下面的代码每帧都会执行(正常情况下是60次/秒),主要是看电脑的屏幕刷新率。基本上来说,当应用程序运行时,如果你想要移动或者改变任何场景中的东西,都必须要经过这个动画循环。

  • 设置几何体的x轴位置,每次加0.01
  • 几何体在x轴位置超过5,归原位值(0)
  • 循环往复以上操作
function render(){cube.position.x +=0.01;if(cube.position.x>5)cube.position.x = 0;renderer.render(scene,camera)//渲染下一帧的就会调用requestAnimationFrame(render)
}

几何体实际在运动时不是直接设置的固定值,可以通过下面的4中内容实现

4.requestAnimationFrame处理几何体动画

requestAnimationFrame函数,参数是一个函数,效果是在浏览器下一次刷新帧时调用这个函数。默认会传一个time,单位是ms。
浏览器一般60帧/s,大概16/ms。

  • time/1000变成秒
  • 为了让几何体往返运动,A到B,B直接到A,所以时间对坐标轴长度(5)求余
  • 设置几何体的位置
  • 如果几何体位置到5时,设置其位置为0
function render(time){//默认会传一个`time`,单位是ms// 根据时间和速度计算移动距离// 1.计算时间let t = time / 1000 % 5;// 2. 移动距离cube.position.x = 1 * t;//速度按1,t是求余后的时间if(cube.position.x > 5) cube.position.x = 0;//使用渲染器,通过相机将场景渲染进来renderer.render(scene,camera)//渲染下一帧的就会调用requestAnimationFrame(render)
}

5.clock跟踪事件处理动画

clock对象用于跟踪时间,具体属性如下:

  • autoStart : Boolean
    如果设置为 true,则在第一次调用getDelta()时开启时钟。默认值是 true

  • startTime : Float
    存储时钟最后一次调用 start方法的时间。默认值是 0

  • oldTime : Float
    存储时钟最后一次调用 startgetElapsedTime()getDelta()方法的时间。默认值是 0

  • elapsedTime : Float
    保存时钟运行的总时长。默认值是 0

  • running : Boolean
    判断时钟是否在运行。默认值是 false

具体方法如下:

  • start () : undefined
    启动时钟。同时将 startTimeoldTime 设置为当前时间。 设置 elapsedTime 为 0,并且设置 runningtrue

  • stop () : undefined
    停止时钟。同时将 oldTime 设置为当前时间

  • getElapsedTime () : Float
    获取自时钟启动后的秒数,同时将oldTime 设置为当前时间。
    如果autoStart 设置为 true 且时钟并未运行,则该方法同时启动时钟

  • getDelta () : Float
    获取自oldTime 设置后到当前的秒数。 同时将 oldTime设置为当前时间。
    如果autoStart 设置为 true 且时钟并未运行,则该方法同时启动时钟

// 设置时钟
const clock = new THREE.Clock()

(1)获取时钟运行总时长

let totalTime = clock.getElapsedTime();

(2)获取两帧之间的时间差

 let deltaTime = clock.getDelta();//两帧的时间差,这一帧到下一帧的时间差

此时deltaTime为0 ,把clock.getElapsedTime()注释掉,则可以得到真正的间隔时间,大概是8ms,那么1000/8 大概是125帧/ms。因为oldtime 指的是存储时钟最后一次调用startgetElapsedTime或者getDelta方法的时,而getDelta获取自oldTime 设置后到当前的秒数, 同时将 oldTime设置为当前时间,所以中间时间差为0。
所以用clock跟踪事件处理动画最终代码如下:

function render(time){// requestAnimationFrame 会默认传入进来time ,单位ms// 浏览器刷新率是60帧/s,16帧/ms//获取时钟运行的总时长// let totalTime = clock.getElapsedTime();// 获取间隔时间,即oldtime到当前时间的秒数,同时将oldtime设置为当前时间//oldtime :存储时钟最后一次调用start ,getElapsedTime或者getDelta方法  的时间// let  deltaTime = clock.getDelta();//两帧的时间差,这一帧到下一帧的时间差// console.log('间隔时间',deltaTime)//0 此时为0  ,把clock.getElapsedTime()注释掉,则可以得到真正的间隔时间,大概是8ms,那么1000/8 大概是125帧/slet totalTime = clock.getElapsedTime();let t = totalTime % 5;cube.position.x = t * 1;renderer.render(scene,camera)//渲染下一帧的就会调用requestAnimationFrame(render)
}

相关文章:

【Three.js基础】坐标轴辅助器、requestAnimationFrame处理动画、Clock时钟、resize页面尺寸(二)

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门…...

C++之完美转发、移动语义(forward、move函数)

完美转发1. 在函数模板中,可以将自己的参数“完美”地转发给其它函数。所谓完美,即不仅能准确地转发参数的值,还能保证被转发参数的左、右值属性不变。2. C11标准引入了右值引用和移动语义,所以,能否实现完美转发&…...

LeetCode刷题系列 -- 48. 旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix [[1,2,3],[4,5,6],[7,8,9]]输出&#…...

在多线程环境下使用哈希表

一.HashTable和HashMapHashTable是JDK1.0时创建的,其在创建时考虑到了多线程情况下存在的线程安全问题,但是其解决线程安全问题的思路也相对简单:在其众多实现方法上加上synchronized关键字(效率较低),保证…...

【排序算法】堆排序(Heap Sort)

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序介绍学习堆排序之前,有必要了解堆!若…...

分类预测 | Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机森林多特征分类预测

分类预测 |Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机森林多特征分类预测 目录分类预测 |Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机森林多特征分类预测分类效果基本介绍模型描述程序设计参考资料分类效果 基本介绍 Matlab实现SSA-RF和RF麻雀算法优化随机森林和随机…...

Allegro如何添加ICT操作指导

Allegro如何添加ICT操作指导 当PCB板需要做飞针测试的时候,通常需要在PCB设计的时候给需要测试的网络添加上ICT。 如图: Allegro支持给网络添加ICT,具体操作如下 首先在库中创建一个阻焊开窗的过孔,比如via10-ict一般阻焊开窗的尺寸比盘单边大2mil 在PCB中选择Manufacture…...

软件架构设计(二)——领域架构、基于架构的软件开发方法

目录 一、架构描述语言 ADL 二、特定领域软件架构 DSSA 三、DSSA的三层次架构模型 . 四、基于架构的软件开发方法 (1)基于架构的软件设计(ABSD) (2)开发过程 一、架构描述语言 ADL ADL是一种形式化语言,它在底层语义模型的支持下,为软件系统概念体…...

数组常用方法(2)---数组遍历方法

1. forEach(cb) 回调函数中有三个参数,第一个是当前遍历项(必须),第二个是索引,第三个是遍历的数组本身。forEach() 对于空数组不会执行回调函数。forEach()不会使用回调函数的返回值,返回值为undefined。…...

卸载Node.js

0 写在前面 无论您是因为什么原因要卸载Node.js都必须要卸载干净。 请阅读: 1 卸载步骤 1.1通过控制面板卸载node.js winR—>control.exe—>卸载程序—>卸载Node.js 等待—>卸载成功 1.2 删除安装时的nodejs文件夹 通过记忆或者Everthing搜索找…...

发表计算机SCI论文,会经历哪些过程? - 易智编译EaseEditing

一、选期刊。 一定要先选期刊。每本期刊都有自己的特色和方向,如果你的稿子已经成型,再去考虑期刊选择的问题,恐怕后期不是退稿就是要大面积修改稿子。 选期刊的标准没有一定的,主要是各单位都有自己的要求,当然小编…...

python中lambda的用法

1. lambada简单介绍 lambda 在Python编程中使用的频率非常高,我们通常提及的lambda表达式其实是python中的一类特殊的定义函数的形式,使用它可以定义一个匿名函数。即当你需要一个函数,但又不想费神去命名一个函数,这时候&#xf…...

网络安全协议(3)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.当前流行操作系统的安全等级 1.Windows的安全等级 什么是EAL…...

102.第十九章 MySQL数据库 -- MySQL的备份和恢复(十二)

5.备份和恢复 5.1 备份恢复概述 5.1.1 为什么要备份 灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景 参考链接: https://www.toutiao.com/a6939518201961251359/ 5.1.2 备份类型 完全备份,部分备份 完全备份:整个数据集 部分备份:只备份数…...

【C++】C++入门 类与对象(一)

类与对象(一)一、类的引入二、类的定义1、类的两种定义方式:2、成员变量命名规则的建议:三、类的访问限定符及封装1、访问限定符2、封装四、类的实例化1、类的实例化概念2、类对象的大小的计算五、this指针this指针的特性一、类的…...

笔记_js运算符

目录二进制相关运算符移位运算符<<>>&#xff5c;(位或运算)参考文档二进制相关运算符 移位运算符 移位运算就是对二进制进行有规律的移位。 tips:进制转换文档链接 << “<<”运算符执行左移位运算。在移位运算过程中&#xff0c;符号位始终保持不变…...

java面试题(十九) Mybatis

4.1 谈谈MyBatis和JPA的区别 参考答案 ORM映射不同&#xff1a; MyBatis是半自动的ORM框架&#xff0c;提供数据库与结果集的映射&#xff1b; JPA&#xff08;默认采用Hibernate实现&#xff09;是全自动的ORM框架&#xff0c;提供对象与数据库的映射。 可移植性不同&…...

Linux系统位运算函数以及相应CPU ISA实现收录

以32位数据的二进制表示为例&#xff0c;习惯的写法是LSB在左&#xff0c;MSB在右&#xff0c;注意BIT序和大小端的字节序没有关系。Linux和BIT操作有关的接口在定义在头文件bitops.h中&#xff0c;bitops.h定义有两层&#xff0c;通用层和架构层&#xff0c;对应两个bitops.h&…...

logback配置文件---logback.xml

目录常识操作logback-spring.xml 示例参考于 https://blog.csdn.net/white_ice/article/details/85065219 https://blog.csdn.net/weixin_42592282/article/details/122109703 https://www.dianjilingqu.com/629077.html 常识 https://www.dianjilingqu.com/629077.html nod…...

Web前端-设计网站公共header

设计网站公共headerheader元素是一个具有引导和导航作用的结构元素&#xff0c;很多企业网站中都有一个非常重要的header元素&#xff0c;一般位于网页的开头&#xff0c;用来显示企业名称、企业logo图片、整个网站的导航条&#xff0c;以及Flash形式的广告条等。在本网站中&am…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...