什么是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(),启动时钟,同时将startTimeoldTime设置为当前时间,设置elapsedTime为 0,并且设置runningtrue
  • 方法.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)即可

参考文档 ———— Three.js Clock

我是 fx67ll.com,如果您发现本文有什么错误,欢迎在评论区讨论指正,感谢您的阅读!

如果您喜欢这篇文章,欢迎访问我的 本文github仓库地址,为我点一颗Star,Thanks~

转发请注明参考文章地址,非常感谢!!!

了解Threejs中的Clock对象以及简单应用的更多相关文章

  1. 详解Threejs中的光源对象

    光源的分类 AmbientLight(环境光),PointLight(点光源),SpotLight(聚光源) 和 DirectionalLight(平行光)是基础光源 HemisphereLight( ...

  2. js中的Map对象的简单示例

    es6提供一个对象Map, 其功能类似于java中的Map, 下面是java中的Map和js中的Map的简单对比: js中的Map.set()相当于java中的Map.put(), js中的Map.s ...

  3. C语言中利用clock设计一个简单的定时器

    time.h是C/C++中的日期和时间头文件,用于需要时间方面的函数,定义了四个变量类型.两个宏和各种操作日期和时间的函数. 其中计时函数是clock(),而与其相关的数据类型是clock_t.clo ...

  4. JS 中对象的简单创建和继承

    对象的简单创建 1.通过对象直接量创建 比如 var obj = {}; 2.通过new 创建 比如 var obj = new Object(); // 相当于var obj = {}; var a ...

  5. 简单使用JSON,JavaScript中创建 JSON 对象(一)

    JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...

  6. jsp中,对window对象的简单总结

    window的对象有: alert(message) 弹出一个警示对话框confirm(message) 弹出一个确认对话框prompt(message,defaultmessage) 弹出一个提示对 ...

  7. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  8. 转 threejs中3D视野的缩放实现

    Threejs基础部分学习知道透视相机new THREE.PerspectiveCamera(fov, aspect , near,far)中. fov视野角(拍摄距离)越大,场景中的物体越小.fov ...

  9. 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor

    批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...

随机推荐

  1. FastAPI 学习之路(十七)上传文件

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  2. UE4蓝图AI角色制作(四)之Gameplay调试器

    8. 寻路网格体和Gameplay调试器 为了及时识别出AI系统中的导航问题,UE4提供了一个工具用来解决这类问题,它叫Gameplay调试器.打开项目设置,在左侧找到"引擎",然 ...

  3. 《JavaScript DOM编程艺术》:+= 相加之后再赋值

    第2章  第20页 += var year = 2010; var message = "The year is"; message += year; message += yea ...

  4. python jinja2初见

    吸取了长城杯的教训,学习python-web迫在眉睫. 正常难度的python_template_injection,由于现在没学面向对象,理解原理比较困难,所以先使用简单版复现:并附上正常版的常用p ...

  5. 第五章第四周习题: Transformers Architecture with TensorFlow

    目录 Transformer Network Packages 1 - Positional Encoding 1.1 - Sine and Cosine Angles Exercise 1 - ge ...

  6. OO第三单元

    OO第三单元 JML语言理论基础,应用工具链 JML语言基础 JML简介 定义: JML 是一种形式化的. 面向 JAVA 的行为接口规格语言 作用: 开展规格化设计.这样交给代码实现人员的将不是可能 ...

  7. STM32中AD采样的三种方法分析

    在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式.三种方法按照处理复杂方法DMA模式处理模式效率最高 ...

  8. 从零开始的DIY智能家居 - 基于 ESP32 的土壤湿度传感器

    前言 自从上次做了那个 甲醛传感器 和 水浊度传感器 之后开始尝到智能家居的甜头了,这两东西有没有用我不知道,但是没事的时候掏出手机瞄两眼,看着就让人很安心( ̄︶ ̄). 于是懒惰的我开始琢磨把给植物浇 ...

  9. Windows7下面手把手教你安装Django - Hongten

    我所使用的操作系统是Windows7,内存是2G 在搜索了一些资料发现,对于Django的安装,详细的真的很少,都说的很简化,然而,这篇blog可以手把手教你成功安装Django 对于Django的详 ...

  10. CSS px的理解

    px是像素.然而一个屏幕像素的多少是由屏幕的分辨率决定的. 取个极端的栗子:如果分辨率是1w*1w,你设置一个100px宽的输入框,你只占屏幕的1/100,但是如果屏幕的分辨率是100*100,那么你 ...