先放原版
freq = 1; amp = 100; loopTime = 3;
t = time % loopTime;
wiggle1 = wiggle(freq, amp, 1, 0.5, t);
wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);
linear(t, 0, loopTime, wiggle1, wiggle2)
原版来自 http://www.motionscript.com/design-guide/looping-wiggle.html
简单来说,就是左右两个口袋都有弹珠,总有一袋是完全空着;左手每拿一颗左边的出来,右手就把一颗原来是右边的给拿回去。
我觉得每次填点开表达式填数值太麻烦了,而且我通常是基于整个合成循环,于是有了下面的改进版:
fr=effect("freq")(1);
am=effect("amp")(1);
lt=thisComp.duration;
loopWiggle(fr,am,lt);
function loopWiggle(freq, amp, loopTime) {
var t = time % loopTime;
var wiggle1 = wiggle(freq, amp, 1, 0.5, t);
var wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);
var result = linear(t, 0, loopTime, wiggle1, wiggle2);
return result;
}
如你所见,前面多了两个效果,所以这里需要添加两个控制器。
至于添加滑块控制器,还是角度控制器,你喜欢就行;加的两个控制器,分别改名叫做 freq 以及 amp 就可以自动识别到。
然后的然后,为了方便 ctrl+D 复制层,同时带着表达式,但是复制出来的又需要修改动画,于是有了下面这个,先在wiggle里面去掉了value,最后再加上value的版本。
换句话说,循环的是撇去value的wiggle,整体循不循环,看首尾关键帧。
fr=effect("freq")(1);
am=effect("amp")(1);
lt=thisComp.duration;
loopWiggle(fr,am,lt,thisProperty);
function loopWiggle(freq, amp, loopTime,obj) {
var t = time % loopTime;
var wiggle1 = obj.wiggle(freq, amp, 1, 0.5, t)-obj.valueAtTime(t);
var wiggle2 = obj.wiggle(freq, amp, 1, 0.5, t - loopTime)-obj.valueAtTime(t-loopTime);
var result = linear(t, 0, loopTime, wiggle1, wiggle2)+obj.value;
return result;
}
使用的时候,也可以把里面的 obj.value 去掉,再在外面加上。加上之后想加减乘除什么的,自己喜欢。譬如:
fr=effect("freq")(1);
am=effect("amp")(1);
lt=thisComp.duration;
loopWiggle(fr,am,lt,thisProperty)+value*0.8;
function loopWiggle(freq, amp, loopTime,obj) {
var t = time % loopTime;
var wiggle1 = obj.wiggle(freq, amp, 1, 0.5, t)-obj.valueAtTime(t);
var wiggle2 = obj.wiggle(freq, amp, 1, 0.5, t - loopTime)-obj.valueAtTime(t-loopTime);
var result = linear(t, 0, loopTime, wiggle1, wiggle2);
return result;
}
对于wiggle的使用小技巧大概就这些,各位有更赞的办法,请不惜赐教。