【AE表达式】关于循环的wiggle

先放原版

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的使用小技巧大概就这些,各位有更赞的办法,请不惜赐教。

你可能感兴趣的:(【AE表达式】关于循环的wiggle)