做扇动的翅膀需要用到正弦函数,我们就先来看看这个表达式:Math.sin()。
使用AE自带的write-on来绘出Math.sin的运动轨迹:
上图的例子里是给Brush Position(画笔位置)使用表达式:
amp = .5 ; offset = 100; offsetY = Math.sin(amp*time*2*Math.PI)*offset; x = position[0] - width/2 + time*width/4; y = position[1] + offsetY; [x,y]
正弦函数的最小周期是2π,AE里函数Math.PI = 3.14159265358976323846…… ,也就是π的值。
参看了Jerlin的一篇文章,AE里sin默认的弧度,2π刚好让sin在1秒内走一个周期。也就是说:
Math.sin(time*2*Math.PI)
刚好让正弦函数往返一个周期,因而,如果要控制sin的周期,我们引入一个变量t,表达式可以改为:
t = 2;//t的值就是正弦函数一个周期的时间,单位为秒 offset = 200;//y轴偏移值 offsetY = Math.sin((2/t)*Math.PI*time)*offset; x = position[0] - width/2 + time*width/4; y = position[1] + offsetY; [x,y]
这个表达式里,t是跑完一个周期的时间,值越大,函数变化的越快。
offset控制的是在y轴的便宜幅度,这里相当于振幅。
我们知道正弦函数其实就是在0的上下规律的波动,因此常常可以用来驱动一些规律的动作,比如扇动翅膀。
惯例先做一半,突然的恶趣味,打算做一个小蚊子,先画个身子,再画一边的翅膀,给形状层里的图形Shape的Rotation添加表达式:
amp = 40; //控制幅度 freq = 20; //控制频率 offset = -30; //控制偏移 value + Math.sin(freq*time)*amp + offset
引入三个变量amp、freq、offset是为了方便调试。
调试好后,复制一层,将锚点移动到合适位置,旋转y轴,翻转出另一面翅膀。
预合成,旋转让头朝右,给position添加表达式:
amp = .5 ; offset = 100; offsetY = Math.sin(amp*time*2*Math.PI)*offset; x = position[0] - width/2 + time*width/4; y = position[1] + offsetY; [x,y]
和之前的write-on在一起就成了一只以正弦函数轨迹飞行的蚊子:
按照Jerlin的方法给这个蚊子一点阻力:
amp = 1; offset = 500; decay = 2; a = Math.sin(amp*time*2*Math.PI)*offset; offsetY = a/Math.exp(decay*time); x = position[0] - width/2 + time*width/4; y = position[1] + offsetY; [x,y]
TIPS:
Math.exp(value)返回的是自然常数e的value次幂,e 是欧拉数,它约等于 2.71828 。
再来一只撞到天花板的蚊子:
amp = 1; offset = 500; decay = 2; a = Math.sin(amp*time*2*Math.PI)*offset; offsetY = Math.abs(a)/Math.exp(decay*time); x = position[0] - width/2 + time*width/4; y = position[1] + offsetY; [x,y]
TIPS:
Math.abs()如果参数是非负数,则返回该参数。如果参数是负数,则返回该参数的相反数。
特殊情况是:
如果参数是正零或负零,那么结果是正零。
如果参数是无穷大,那么结果是正无穷大。
如果参数是 NaN,那么结果就是 NaN。
请登录以参与评论
现在登录