返回

AEJoy —— 表达式之模拟超越与反弹(二)【JS】

前端

超越动画(Overshoot Animation)在动画设计中十分常见,它能够为动画效果增添活力与灵动性。本文将带您探索AEJoy——模拟超越与反弹的奇妙世界,帮助您更深入地理解超越动画的原理和应用。

深入超越(Overshoot)

超越动画的关键在于“超越”(Overshoot),即动画元素在运动过程中超出目标位置,然后反弹回目标位置。这种效果可以通过指数衰减正弦波的基本表达式来实现:

function overshoot(t, b, c, d, s) {
  if (s == undefined) {
    s = 1.70158;
  }
  return c * (Math.pow(2, -10 * t / d) * Math.sin((t * d - s) * (2 * Math.PI) / d)) + b;
}
  • t:当前时间
  • b:起始值
  • c:变化量
  • d:持续时间
  • s:弹簧张力,值越大弹性越大

模拟反弹

在动画设计中,反弹效果与超越动画同样重要。模拟反弹的关键在于调整弹簧张力(s)的值。当s的值较大时,弹簧张力较强,反弹效果也更明显。

示例代码

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

var ball = {
  x: 100,
  y: 100,
  radius: 10,
  color: 'red'
};

var vy = 0;
var gravity = 0.1;

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  vy += gravity;
  ball.y += vy;

  // 检测反弹
  if (ball.y + ball.radius > canvas.height) {
    vy = -vy * 0.9;
    ball.y = canvas.height - ball.radius;
  }

  ctx.beginPath();
  ctx.arc(ball.x, ball.y, ball.radius, 0, 2 * Math.PI);
  ctx.fillStyle = ball.color;
  ctx.fill();

  requestAnimationFrame(draw);
}

draw();

这段代码模拟了一个小球从高处落下,然后在地面上反弹的效果。您可以调整弹簧张力(s)的值来改变反弹效果的强度。

结语

超越动画和反弹效果在动画设计中非常有用,它们可以为动画增添活力与灵动性。AEJoy通过指数衰减正弦波的基本表达式来模拟超越与反弹,为动画设计师们提供了强大的工具。希望本文对您有所帮助,也欢迎您在评论区分享您的想法和经验。