效果图:
画一根橡皮筋,给一个CC Bender特效,固定好橡皮筋的两端,加大Amount值,就能看到橡皮筋产生弯曲变形了,将表达式赋给Amount属性,就能控制弯曲变形程度的变化,从而实现橡皮筋回弹效果。
t=time-0.58;
freq=t*(t+1)*10;
if (time>0.58){
value+-Math.sin(freq)*80/(Math.exp(t))
else{value}
其中,t=time-0.58是因为动画中病毒从高空落到橡皮筋上时时间线正好走了0.58秒。
freq=t*(t+1)*10是回弹频率越来越快的终极原因,freq的值会随着t的匀速增大以越来越快的速度变大。
变大的速度越来越快就能使回弹频率越来越快,比如填入Math.exp(t)也会有一样的效果,只不过不一定是你想要的效果。
设定一个条件,当物体的y坐标大于某个值value的时候,就将正线函数曲线走到大于value值的部分的曲线镜像翻转。
将红线以上部分波峰以红线为轴镜像翻转到红线以下,就有了粉色曲线,粉色曲线就是物体落地反弹的运动曲线,红线就是地面的y轴坐标,也就是value值。这个值就是病毒位置属性最末关键帧的值。
表达式:
amp=0.1;
freq=6;
v=1;
decay=2.5/v;
a=numKeys;
n=nearestKey(time).index;
et=key(n).time;
t=time-et;
v=velocityAtTime(et-0.01);
p=value+v*amp*Math.sin(t*(t+1)*freq)/Math.exp(t*decay);
q=value+-v*amp*Math.sin(t*(t+1)*freq)/Math.exp(t*decay);
if (t>0 & n>=a){
p;
if (p>=value) {q;}
else{p;}
}
else{value;}
表达式关键点在“if (p>=value) {q;}”,p和q的差别在于q在正弦函数部分“v*amp*Math.sin(t*(t+1)*freq)”前面乘了一个“-1”,就使得value值以上部分被翻转到value轴线以下。