threejs实现物体平滑的动画效果

785 阅读1分钟

⭐使用tweenjs来实现平滑的动画效果,最近在项目中遇到了需要根据数据实现地铁进站出站的动画效果,threejs和tweenjs的结合其实不要太好用。

tweenjs

  • TweenJS提供了一个简单但强大的渐变界面。它支持渐变的数字对象属性&CSS样式属性,并允许链接补间动画和行动结合起来,创造出复杂的序列

  • tween.js允许以平滑的方式修改元素的属性值。只需要告诉tween想修改什么值,以及动画结束时它的最终值是什么,动画花费多少时间等信息,tween引擎就可以计算从开始动画点到结束动画点之间值,来产生平滑的动画效果

安装tween.js

npm

npm i @tweenjs/tween.js@^18

tweenjs CDN

https://cdnjs.cloudflare.com/ajax/libs/tween.js/17.1.1/Tween.min.js

tweenjs在threejs中的应用

⭐将 TWEEN.update() 添加到three的animate里面,这个很重要。

 animate () {
      this.render();
      this.controls.update();
      requestAnimationFrame(this.animate);
      TWEEN.update()
  }

⭐动画方法封装

/**
*@cube 需要移动的物体位置
*@oldPo 物体原来的位置,也就是动画开始位置
*@newPo 物体新的位置,也就是动画结束的位置
*@time 动画的时间 1000=1s
*/
  initTweenNone(cube, oldPo, newPo, time) {
      const tween = new TWEEN.Tween(oldPo)
        .to(newPo, time)
        .easing(TWEEN.Easing.Exponential.Out)
        .onUpdate((obj) => {
          cube.x = obj.x;
          cube.y = obj.y;
          cube.z = obj.z;
        })
        .start();
  }
  

⭐方法调用

 var oldObjF = {
      x: -2000,
      y: -140,
      z: 0,
  };
 var newObjF = {
     x: 0,
     y: -140,
     z: 0,
 };
 this.initTweenNone(this.card.position, oldObjF, newObjF, 5000);

⭐如果需要在移动物体的同时也移动相机位置进行运镜的效果,可直接加入相机的位置


 var tween = new TWEEN.Tween({
      x1: oldC.x, // 相机x
      y1: oldC.y, // 相机y
      z1: oldC.z, // 相机z
      x2: oldT.x, // 控制点的中心点x
      y2: oldT.y, // 控制点的中心点y
      z2: oldT.z  // 控制点的中心点z
  });
 tween.to({
      x1: newC.x,
      y1: newC.y,
      z1: newC.z,
      x2: newT.x,
      y2: newT.y,
      z2: newT.z
  }, 1000);

❤ 感谢浏览~