了解Threejs中的Clock对象以及简单应用
什么是Clock对象
如果你对 JavaScript 有一定了解,那么 JavaScript 的时间对象 Date 你一定不陌生,Clock 本质上就是对 Date 进行封装,提供了一些方法和属性
当你通过 Threejs 编写一些和时间相关程序时候,不用在对 Date 进行封装,直接调用 Clock 对象的方法和属性即可
Clock对象的主要属性和方法
- 属性
.autoStart
,Boolean,默认值是true
,如果设置为true
,则在第一次update
时开启时钟 Clock - 属性
.startTime
,Float,存储时钟 Clock 最后一次调用.start()
,.getElapsedTime()
或.getDelta()
方法的时间 - 属性
.elapsedTime
,Float,保存时钟 Clock 运行的总时长 - 属性
.running
,Boolean,判断时钟 Clock 是否在运行 - 方法
.start()
,启动时钟,同时将startTime
和oldTime
设置为当前时间,设置elapsedTime
为 0,并且设置running
为true
- 方法
.stop()
,停止时钟,同时将oldTime
设置为当前时间 - 方法
.getElapsedTime()
,获取自时钟启动后的秒数,摒弃将oldTime
设置为当前时间,如果autoStart
设置为true
且时钟并未运行,则该方法同时启动时钟 - 方法
.getDelta()
,获取自oldTime
设置后到当前的秒数,同时将oldTime
设置为当前时间,如果autoStart
设置为true
且时钟并未运行,则该方法同时启动时钟
常用方法:getDelta()
- 获得前后两次执行该方法的时间间隔
- 假设你执行一次
.getDelta ()
方法,再执行一次.getDelta ()
方法,第二次执行.getDelta ()
方法时候,可以返回上次调用该方法到本次调用之间的时间间隔,返回间隔时间单位是秒
简单的应用场景:对 Threejs 渲染方式的理解
- Threejs渲染器的渲染方法
.render()
每执行一次就得到一帧图像,渲染效果也就是图像会显示在 Canvas 画布上 - 如果一个三维场景是不停变化的,肯定要周期性调用执行
.render()
方法,更新canvas画布显示内容,一帧帧图像随着时间变化,这样就展现出来一个动画效果 - 为了周期性执行渲染器渲染方法
.render()
,一般通过浏览器的APIwindow.requestAnimationFrame
实现,浏览器会控制渲染频率 - 一般性能理想的情况下,每秒s渲染60次左右,在实际的项目中,如果需要渲染的场景比较复杂,一般都会低于60,也就是渲染的两帧时间间隔大于16.67ms
- 代码示例:
// 创建一个时钟对象Clock
var clock = new THREE.Clock();
// 创建渲染函数
function render() {
//执行渲染方法,渲染出来一帧图像
renderer.render(scene, camera);
//周期性执行渲染函数
requestAnimationFrame(render);
//clock.getDelta()方法获得两帧的时间间隔,返回时间单位:秒
var T = clock.getDelta();
console.log('两帧渲染时间间隔',T*1000+'毫秒');
console.log('查看每秒渲染频率',1/T);
}
render();
关于requestAnimationFrame()
方法
window.requestAnimationFrame(callback)
告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画- 该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行
- 当你准备更新动画时你应该调用此方法,这将使浏览器在下一次重绘之前调用你传入给该方法的动画函数(即你的回调函数)
- 回调函数执行次数通常是每秒60次,但在大多数遵循W3C建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配
- 为了提高性能和电池寿命,因此在大多数浏览器里,当
requestAnimationFrame()
运行在后台标签页或者隐藏的<iframe>
里时,requestAnimationFrame()
会被暂停调用以提升性能和电池寿命 - 参数
callback
,下一次重绘之前更新动画帧所调用的函数(即上面所说的回调函数)
该回调函数会被传入DOMHighResTimeStamp
参数,该参数与performance.now()
的返回值相同,它表示requestAnimationFrame()
开始去执行回调函数的时刻 - 返回值
一个
long
整数,请求 ID,是回调列表中唯一的标识
是个非零值,没别的意义,你可以传这个值给window.cancelAnimationFrame()
以取消回调函数
使用setInterval()
和requestAnimationFrame()
方法绘制的优劣
- 当然使用
setInterval()
方法可以实现动画效果但是,setInterval()
方法有一定的缺点setInterval()
方法,不考虑浏览器中发生的事情,如果你正在浏览其他页面,这个函数仍然会每隔几毫秒就会被调用一次,
除此之外,setInterval()
方法并没有跟显示器的重画同步,着可能会导致较高的CPU使用,降低系统效率。 —《Three.js 开发指南》 - 使用
requestAnimationFrame()
函数即可解决上述问题,详情看上方requestAnimationFrame()
函数描述,这个函数的时间间隔是浏览器定义的,我们可以在指定的函数里面实现绘画操作
在vue中使用requestAnimationFrame()
方法
一定要传入函数名而不是带上立即执行符号,如requestAnimationFrame(this.animate)
即可
我是 fx67ll.com,如果您发现本文有什么错误,欢迎在评论区讨论指正,感谢您的阅读!
如果您喜欢这篇文章,欢迎访问我的 本文github仓库地址,为我点一颗Star,Thanks~
转发请注明参考文章地址,非常感谢!!!
了解Threejs中的Clock对象以及简单应用的更多相关文章
- 详解Threejs中的光源对象
光源的分类 AmbientLight(环境光),PointLight(点光源),SpotLight(聚光源) 和 DirectionalLight(平行光)是基础光源 HemisphereLight( ...
- js中的Map对象的简单示例
es6提供一个对象Map, 其功能类似于java中的Map, 下面是java中的Map和js中的Map的简单对比: js中的Map.set()相当于java中的Map.put(), js中的Map.s ...
- C语言中利用clock设计一个简单的定时器
time.h是C/C++中的日期和时间头文件,用于需要时间方面的函数,定义了四个变量类型.两个宏和各种操作日期和时间的函数. 其中计时函数是clock(),而与其相关的数据类型是clock_t.clo ...
- JS 中对象的简单创建和继承
对象的简单创建 1.通过对象直接量创建 比如 var obj = {}; 2.通过new 创建 比如 var obj = new Object(); // 相当于var obj = {}; var a ...
- 简单使用JSON,JavaScript中创建 JSON 对象(一)
JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...
- jsp中,对window对象的简单总结
window的对象有: alert(message) 弹出一个警示对话框confirm(message) 弹出一个确认对话框prompt(message,defaultmessage) 弹出一个提示对 ...
- C#开发中使用配置文件对象简化配置的本地保存
C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...
- 转 threejs中3D视野的缩放实现
Threejs基础部分学习知道透视相机new THREE.PerspectiveCamera(fov, aspect , near,far)中. fov视野角(拍摄距离)越大,场景中的物体越小.fov ...
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor
批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...
随机推荐
- Vulnhub实战-grotesque3靶机👻
Vulnhub实战-grotesque3靶机 靶机地址:http://www.vulnhub.com/entry/grotesque-301,723/ 1.靶机描述 2.主机探测,端口扫描 我们在vm ...
- Unity——EasyTouch摇杆插件使用
EasyTouch摇杆插件使用 Demo展示 双指缩放在电脑端无法掩饰,竖屏将就看看吧: 插件名叫EasyTouch,有需要给我留言,不想开仓库传了: 创建摇杆点这里: 初始化 On_Joystick ...
- 每日一题,是否存在(c语言)
每日一题:1.是否存在 是否存在描述猫咪非常喜欢饼干,尤其是字母饼干.现在,她得到一些字母饼干,她希望选择他们中的一些拼写某些单词. 你的任务是确定她是否可以拼出自己想要的单词. 输入输入包含若干测试 ...
- 论文解读丨表格识别模型TableMaster
摘要:在此解决方案中把表格识别分成了四个部分:表格结构序列识别.文字检测.文字识别.单元格和文字框对齐.其中表格结构序列识别用到的模型是基于Master修改的,文字检测模型用到的是PSENet,文字识 ...
- Linux资料 帮你理清思路
很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...
- JVM:Hotspot虚拟机中的对象
在HotSpot虚拟机中,对象在内存中存储的布局可以被分为3个区域:对象头(Header).实例数据(Instance data)和对齐填充(Padding).对象头包括两部分信息,第一部分存储自身的 ...
- 文件上传漏洞Bypass总结
文件上传漏洞Bypass总结 前端JS验证文件类型: 上传后缀jpg,抓包改为php后缀 ======================================================= ...
- popStar手机游戏机机对战程序
DFS算,五分钟如果答案没有更新,那个解一般来说就很优了. #include <cstdio> #include <iostream> #include <string. ...
- MySQL 表的操作语句(2)
一:MySQL支持的数据类型 1:CHAR和TEXT :分别表示定长的和可变长的串. CHAR:1-255个字符的定长串,它的长度必须在创建时指定. TEXT:最大长度为64K的文本 VARCHAR: ...
- 一文搞懂js中的typeof用法
基础 typeof 运算符是 javascript 的基础知识点,尽管它存在一定的局限性(见下文),但在前端js的实际编码过程中,仍然是使用比较多的类型判断方式. 因此,掌握该运算符的特点,对于写出好 ...