提交需求
赛事与广告咨询合作,请填写需求表单,我们会在第一时间与您联系!
关于ae的教程译文,弹跳和缓冲,炫酷得不得了!
这是一种用于模拟谐波共振指数衰减正弦波的波形。注意,频率是恒定的振幅衰减。
基本衰减的正弦波振荡应用到旋转属性。
该波形通过模拟反弹表达式生成。请注意,反弹出现较多的对象失去能量。
一个基本的反弹表达已应用到旋转属性。
amp = 80;
freq = 1;
decay = 1;t = time - inPoint;
amp*Math.sin(t*freq*Math.PI*2)/Math.exp(t*decay);
因为它位于,这种表达会引发衰减的正弦波振荡图层的入点。前三行只需设定的波形参数进行:80最大振幅,每秒一个振荡的频率,和一个衰减(多快的振幅减小)之一值。变量t是用来计算由于层的In点的时间。所有真正的数学发生在最后一行。
注:
JavaScript函数Math.sin()和Math.cos()实现都产生正弦波,但他们的目的不同表达作家。该Math.sin()函数从零开始,增加价值。 Math.cos()实现为90度的相位差Math.sin(),这意味着它开始于最大值和减小。
你通常会选择Math.cos()实现当你想一开始就在完全伸展,或完全旋转状态的对象。例如,您可能要开始与摆在最高转速,而不是零钟摆运动。我们不会在这里使用它,但它是一个很好的工具来了解。
t = time - inPoint;
startVal = [0,0];
endVal = [200,200];
dur = 0.1;
linear(t,0,dur,startVal,endVal);
freq = 3;
decay = 5;t = time - inPoint;
startVal = [0,0];
endVal = [200,200];
dur = 0.1;
if (t < dur){
linear(t,0,dur,startVal,endVal);
}else{
amp = (endVal - startVal)/dur;
w = freq*Math.PI*2;
endVal + amp*(Math.sin((t-dur)*w)/Math.exp(decay*(t-dur))/w);
}
请注意,从linear()坡道的过冲振荡(其中发生在5f)的过渡完美匹配。
缓冲动画匹配传入动画的速度。
freq = 3;
decay = 5;
maxDelay = 1.0;seedRandom(textIndex,true);
myDelay = random(maxDelay);
t = time - (inPoint + myDelay);
startVal = [100,100];
endVal = [0,0];
dur = 0.1;
if (t < dur){
linear(t,0,dur,startVal,endVal);
}else{
amp = (endVal - startVal)/dur;
w = freq*Math.PI*2;
endVal + amp*(Math.sin((t-dur)*w)/Math.exp(decay*(t-dur))/w);
}
freq = 2;
decay = 5;
delay = .15;
dur = .12;myDelay = (textIndex-1)*delay;
t = time - (inPoint + myDelay);
startVal = 100;
endVal = 0;if(t < dur){
linear(t,0,dur,startVal,endVal);
}else{
amp = (endVal - startVal)/dur;
w = freq*Math.PI*2;
endVal + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);
}
3D人物旋转到顺序来看,有缓冲。
freq = 3;
decay = 5;n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0){
t = time - key(n).time;
amp = velocityAtTime(key(n).time - .001);
w = freq*Math.PI*2;
value + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);
}else
value
弹跳的表达已经被应用到了关键帧的X轴旋转性能。
这里,缓冲表达已施加到关键帧位置属性。
elev = degreesToRadians(75);
v = 1900;
e = .7;
f = .5;
g = 5000;
nMax = 9;
tLaunch = 1;
vy = v*Math.sin(elev);
vx = v*Math.cos(elev);
if (time >= tLaunch){
t = time - tLaunch;
tCur = 0;
segDur = 2*vy/g;
tNext = segDur;
d = 0; // x distance traveled
nb = 0; // number of bounces
while (tNext < t && nb <= nMax){
d += vx*segDur;
vy *= e;
vx *= f;
segDur *= e;
tCur = tNext;
tNext += segDur;
nb++
}
if(nb <= nMax){
delta = t - tCur;
x = d + delta*vx;
y = delta*(vy - g*delta/2);
}else{
x = d;
y = 0;
}
value + [x,-y]
}else
value
有几件事情需要注意的这一表达。弹跳参数发射角(海拔),初始速度(ⅴ),弹性(e)所示,摩擦(f)和比重(g)-are所有限定在表达的顶部。请注意,您还必须定义,以保持从表情到消失的小反弹无尽计算反弹(n最大)的最大数量。这个版本的表达还包括一个变量来控制发射时间(tLaunch)。
二维模拟反弹使用发射角度,初速度,重力,弹力,和摩擦。
e = .7;
g = 5000;
nMax = 9;n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0){
t = time - key(n).time;
v = -velocityAtTime(key(n).time - .001)*e;
vl = length(v);
if (value instanceof Array){
vu = (vl > 0) ? normalize(v) : [0,0,0];
}else{
vu = (v < 0) ? -1 : 1;
}
tCur = 0;
segDur = 2*vl/g;
tNext = segDur;
nb = 1; // number of bounces
while (tNext < t && nb <= nMax){
vl *= e;
segDur *= e;
tCur = tNext;
tNext += segDur;
nb++
}
if(nb <= nMax){
delta = t - tCur;
value + vu*delta*(vl - g*delta/2);
}else{
value
}
}else
value
该弹回表达应用于位置,旋转和缩放属性。
和以前一样,你可以通过调整弹性(E)和重力(G)变量控制反弹的特点。
译文:UI中国@郑囧前端
原作者:
Goldfish don't bounce.
—Bart Simpson
译文有很多的语法错误,看不明白的,可以去看一下原文
http://www.motionscript.com/articles/bounce-and-overshoot.html
(郑囧英语不好,费了好大的劲才搞定的,不到之处还请指教!如果你看到错,告诉我!“我是跪着在打字”老是都你看不下去了,这孩纸太好雪了,<->).
大牛,别默默的看了,快登录帮我点评一下吧!:)
登录 立即注册