美文网首页
缓动动画Tween公式分析

缓动动画Tween公式分析

作者: 乐宝呗 | 来源:发表于2021-12-22 10:28 被阅读0次

 var Tween={

    Linear:function(t,b,c,d){

        return c*t/d+b;

    },

    QuadIn:function(t,b,c,d){

        return c*(t/=d)*t+b;

    },

    QuadOut:function(t,b,c,d){

        return -c*(t/=d)*(t-2)+b;

    },

    QuadInOut:function(t,b,c,d){

        if((t/=d/2)<1) return c/2*t*t+b;

        return -c/2*((--t)*(t-2)-1)+b;

    },

    CubicIn:function(t,b,c,d){

        return c*(t/=d)*t*t+b;

    }

    放眼望去,基本都是靠 t, b, c, d 四个参数来控制曲线,先搞清楚四个参数的含义。

    t ----初始时间     b ----起始位置          c ----移动的距离         d ----缓动执行多长时间


用最基础的线性公式自己琢磨一下吧:

Linear:function(t,b,c,d){

    return c*t/d+b;

}

根据 return,b 应该是初始位置,t / d 是动画完成百分比,d 是总动画时长,t 是已经运行动画时长,c 是总移动距离(状态),目的位置(状态)= b + c 。

参数里 b, c, d (初始位置,目的位置 - 初始位置, 动画时长)是一开始设定好的,在运行过程中不变,只有 t 是随着时间变化,让函数返回不同的值,这个值,就是变化状态的百分比值。例如,物体从 x=20 移动到 x = 100,物体当前 x = 20 + (100 - 20) * 返回值。


开始分析 CubicOut 公式:

return c*((t=t/d-1)*t*t + 1) + b;

公式里面 t 还有一个赋值运算,所以公式实际上是这样子的

t=t/d-1;return c*(t*t*t+1)+b;

经过赋值计算的 t ,实际上已经跟真正的 t (已运行动画时长)没什么关系了,赋值后的 "t" 其实是 “负动画剩余时间百分比”,下文加引号的 "t" 指的都是赋值之后的 t。

举个数值来带入,假设动画总时长 d = 1,初始位置 b = 0,移动距离 c = 1,动画运行时间为 t = 0.1,

先带入 Linear:c * t / d + b ==> 1 * 0.1 / 1 + 0 = 0.1;

再带入 Cubic:t = t / d - 1 ==> t = -0.9;

c * (t * t * t + 1) + b ==> 1 * (-0.9 * -0.9 * -0.9 + 1) + 0 = 1 - 0.729 = 0.271;

Cubic 比 Linear 初速度更快,符合预期,现在把 0.1 时间间隔的位置计算并代入一下看看:

Cubic 曲线和生成的点契合,公式没问题(不知道啥 gif 这么卡)。

Cubic 立方曲线顾名思义,公式里 "t" 进行了三次相乘。

那 Quad 就是两个 "t" 相乘:

t = t / d - 1;

return c * (t * t + 1) + b;

代入图形看一下:

代入公式生成的点都飞出画面了,原来因为 "t" 是一个负数, t3< 0,但是  t2> 0,所以飞上去了。

公式调整一下:t=t/d-1;return  c*(-t*t+1)+b;

正常了,所以遇到偶数次方公式,"t" 乘积前加个 "-" 就好。

有个疑问,公式调整一下,保证每次 "t" > 0,不是更方便么,像这样:

t = 1 - t / d;

return c * (1 - t * t) + b;


现在用“推导”的 Quad 公式和 Tween.js 里的 Quad 公式对比一下:

t=1-t/d; 

return c*(1-t*t)+b;

...

return c*(1-(1-t/ d) * (1 - t /d))+b;

...

return c*(1-(1+(t/ d) * (t /d)-2*t/d))+b;

...

return c*(1-1-(t/ d) * (t /d)+2*t/d)+b;

...

return c*(-(t/ d) * (t /d)+2*t/d)+b;

...

return -c*((t/ d) * (t /d)-2*t/d)+b;

...

return -c*((t/ d - 2) * (t /d))+b;

...

return -c*(t/=d)*(t-2)+b;

...

return -c*(t/d)*(t/d-2)+b;

两个公式是相等的,完毕。

Quad 二次、Cubic 三次、Quart 四次、Quint 五次同理,都可以用:

t=1-t/d;  return   c*(1-Math.pow(t,n))+b;  //n=几次

相关文章

网友评论

      本文标题:缓动动画Tween公式分析

      本文链接:https://www.haomeiwen.com/subject/ifkqqrtx.html