threejs结合tween实现动画效果

14 篇文章 1 订阅
8 篇文章 1 订阅

1 渲染一个八卦图,实现尺寸从1增大到2,并伴随着旋转

效果如下

 如果用原生js实现上面效果的话,代码如下:

首先创建一个八卦图圆面:

// 创建圆面
let texture =  new THREE.TextureLoader().load(
  require(`../../assets/images/bagua.jpeg`)
);
let geometry = new THREE.CircleGeometry(20, 150);
let mesh=new THREE.Mesh(
  geometry,
  new THREE.MeshBasicMaterial({
      map: texture,
      side: THREE.DoubleSide,
      transparent: true,
  })
);
this.scene.add(mesh);
mesh.rotateX(Math.PI/2);

然后写动画方法:

  基本原理就是利用requestAnimationFrame函数,定义两个更新函数,

  在update1中不断增大尺寸,并提高转速;当尺寸达到2,然后调用update2函数,不断减小尺寸和旋转速度,当尺寸达到1再调用update1

// 方式一
let scale=1;
let speed=2;
let inter1;
let inter2;
update1();
function update1(){ 
  mesh.rotateZ((Math.PI/50)*speed);
  mesh.scale.set(scale,scale,scale)
  scale+=0.01
  speed+=0.02;
  inter1=requestAnimationFrame(update1)
  if(scale>2){
    window.cancelAnimationFrame(inter1)
    update2();
  }    
}

function update2(){ 
  mesh.rotateZ((Math.PI/50)*speed);
  mesh.scale.set(scale,scale,scale)
  scale-=0.01
  speed-=0.02;
  inter2=requestAnimationFrame(update2)
  if(scale<1){
      window.cancelAnimationFrame(inter2)
      update1();
  } 
}

 2 利用tween插件实现上述动画

安装tween.js,然后引入tween:

import TWEEN from "tween.js";

代码如下:

const r={
  scale:1,
  rad:0
}
var s1 = new TWEEN.Tween(r);
s1.to({
  scale:2,
  rad:Math.PI/30
}, 4000)
s1.easing(TWEEN.Easing.Sinusoidal.InOut).repeat(Infinity)
s1.onUpdate(function() {
  debugger
  mesh.scale.set(this.scale,this.scale,this.scale)
  mesh.rotateZ(this.rad);
});

var s2 = new TWEEN.Tween(r);
s2.to({
  scale:1,
  rad:0
}, 4000)
s2.easing(TWEEN.Easing.Sinusoidal.InOut).repeat(Infinity)
s2.onUpdate(function() {  
  mesh.scale.set(this.scale,this.scale,this.scale)
  mesh.rotateZ(this.rad);
});
s1.chain(s2);
s2.chain(s1);
s1.start();

然后在animate函数中调用

animate(){
    TWEEN.update();
}

即可完成tween的动画

可以明显看出,使用tween插件,实现动画效果代码可读性提高,比如可以规定动画从起始效果到终止效果的时间,循环次数,过度效果等等;遇到更复杂的动画,tween的优势将更加明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨大大28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值