了解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(),启动时钟,同时将 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(),一般通过浏览器的API window.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></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~ 😃
转发请注明参考文章地址,非常感谢!!!

Original: https://www.cnblogs.com/fx67ll/p/15632055.html
Author: fx67ll
Title: 了解Threejs中的Clock对象以及简单应用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599489/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据类型拓展

    public class Demo03 { public static void main(String[] args) { //整数拓展 :进制 二进制0b 十进制 八进制0 十…

    数据库 2023年6月11日
    060
  • 索引的树结构

    二分查找 二叉树 二叉平衡树 B-TREE :二叉平衡树的基础上,使加载一次节点,可以加载更多路径数据,同时把查询范围缩减到更小 缺点:业务数据的大小可能远远超过了索引数据的大小,…

    数据库 2023年5月24日
    061
  • 【MySQL】试题 — 31道巩固 SQL 语句的练习题

    1.取得每个部门最高薪水的人员名称先拿出各部门的最高工资,再与(最高工资对应的人员名录表)对接为临时表。 [En] First take out the maximum salar…

    数据库 2023年5月24日
    087
  • Linux平台Redis安装总结

    本文测试验证的操作系统为CentOS Linux release 7.8.2003 (Core),Redis版本为redis-6.0.8。 敬请注意,如有不同,请以实际情况为准。 …

    数据库 2023年6月11日
    051
  • 关于.netcore6图片处理(生成缩略图、验证码、加水印)发布到docker(liunx)踩到的坑

    最近在开发一个项目,需要对图片进行处理,比如生成缩略图、生成图片验证码、图片添加水印等功能,项目使用.netcore6.0开发,开发系统使用的云桌面(win10系统),由于是云桌面…

    数据库 2023年6月9日
    088
  • 程序员“迷惑代码”大赏

    谈到程序员,对于外行人来说一贯的印象就是格子衫大裤衩外加人字拖,蓬头(秃头)垢面黑眼圈,还有就是”人傻钱多死得快”🤣,这是外界对程序员固有的思想,但是作为新…

    数据库 2023年6月11日
    079
  • Redis集群(三)集群模式

    一、 集群的作用 集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。 集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点…

    数据库 2023年6月11日
    077
  • LeetCode 344. 反转字符串

    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 //输入一个字符串,输出它的倒序字符串 input: Hello output: olleH …

    数据库 2023年6月11日
    080
  • python-去除txt文件空格、特殊字符

    #!/usr/bin/python -*- coding: UTF-8 -*- """ @author: Roc-xb ""&qu…

    数据库 2023年6月14日
    075
  • MySQL max() min() 函数取值错误

    今天日志出现异常,一步一步debug发现SQL语句返回值出错,进一步发现是max()函数返回出错。点击跳转解决办法,赶时间的朋友可以去获得答案。当然我还是希望大伙看看原由。 sel…

    数据库 2023年5月24日
    076
  • 基于 ShardingSphere 的得物数据库中间件平台“彩虹桥”演进之路

    本文系转载于公众号得物技术 前言 随着得物 App 用户开始快速增长,业务线日趋丰富,也对底层数据库带来了较大的压力。各个业务线对于数据分片、读写分离、影子库路由等等的需求成为了刚…

    数据库 2023年6月16日
    098
  • Java并发编程之CAS

    在Java并发编程的世界里,synchronized 和 Lock 是控制多线程并发环境下对共享资源同步访问的两大手段。其中 Lock 是 JDK 层面的锁机制,是轻量级锁,底层使…

    数据库 2023年6月11日
    066
  • Linux 下安装 node.js

    这里介绍两种安装方式: 编译安装和使用编译后的安装包安装。 安装目录: /usr/local 一、使用编译安装包安装 1、进入安装目录: 2、下载安装包: 3、解压: 4、进入解压…

    数据库 2023年6月14日
    080
  • leetcode 437. Path Sum III 路径总和 III(中等)

    一、题目大意 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也…

    数据库 2023年6月16日
    086
  • 容器化 | 在 Rancher 中部署 MySQL 集群

    我们已经介绍了如何在 Kubernetes 和 KubeSphere 上部署 RadonDB MySQL 集群。本文将演示如何在 Rancher[1] 上部署 RadonDB My…

    数据库 2023年5月24日
    0110
  • 符合标准的正常工作的对联广告(漂浮广告JS代码)

    符合标准的正常工作的对联广告JS代码(漂浮广告)。DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN…

    数据库 2023年6月11日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球