three学习(三)——动态渲染

341 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第13天,点击查看活动详情

前言

当我们认识了three.js,知道了坐标轴及转换方法,就可以'next'啦,我们是通过render()函数渲染出场景在页面展示出来,此时物体时静态的,如果我们想要物体动起来比如旋转起来,就要一边转换物体,一边渲染,该怎么实现呢?这就是我们今天要了解的动态渲染。

requestAnimationFrame

想要达到上述的效果,我们就需要创建一个定时任务,不停地更新,这里我们就需要用到requestAnimationFrame函数。 requestAnimationFrame函数适用于更新动画,它能通知浏览器将要去做动画更新效果,该函数有一个参数就是回调函数,回调函数在下次更新动画帧的时候调用,回调函数的回调次数与浏览器的屏幕频率有关,一般是60次一秒。这个特点也决定了用它来更新最合适。

   //全局函数
   window.requestAnimationFrame(callback);

实现

找到了适合的函数,接下来在回调函数中每次渲染一点物体,然后再执行render函数,物体就能动起来:

   function move() {
      renderer.render(scene, camera);
      //旋转
      cube.rotation.set(0, 0.01, 0);
      requestAnimationFrame(render);
  }
  move();

上面我们提到过执行的函数一般是60频率去运行,这个次数每秒会有所不同,在这一秒内相邻两次之间的执行间隔也有可能不同,这两个偏差最终会导致物体旋转看起来不太流畅,如果我们想要流畅一点就要想办法优化,让物体匀速去旋转。 要想实现匀速旋转我们可以利用时间戳,在函数执行前获取一次当前时间戳,函数执行时再次获取,算出两者时间差(1毫秒),再乘以每次旋转角度,最后将第一次时间戳更新为当前的,以供下次函数执行使用。

    let time1 = new Date()
    function move() {
      let time2 = new Date()
      let time = time2-time1
      time1 = time2
      renderer.render(scene, camera);
      //旋转
      cube.rotation.set(0, 0.001*time, 0);
      requestAnimationFrame(render);
  }
  move();

总结

在动态渲染更新时,requestAnimationFrame发挥了重要的作用,这个函数时需要我们牢记的,上述只是以旋转为例,我们也可以让它平移,缩小,当然做这两种转换时需要进行判断。