freq = effect("frequency")("滑块");
decay = effect("decay")("滑块");
duration = effect("duration")("滑块");
retard = textIndex * thisComp.frameDuration * 2;
t = time - (inPoint + retard);
startVal = [100,100,100];
endVal = [0,0,0];
if (t < duration)
{
linear(t,0,duration,startVal,endVal);
}
else
{
amp = (endVal - startVal)/duration;
w = freq*Math.PI*2;
endVal + amp*(Math.sin((t-duration)*w)/Math.exp(decay*(t-duration))/w);
}
linear 函数相当于线性映射的工具,把一个从
[
m
i
n
,
m
a
x
]
[min,max]
[min,max]区间的数字映射到
[
s
t
a
r
t
V
a
l
,
e
n
d
V
a
l
]
[startVal,endVal]
[startVal,endVal]。
l
i
n
e
a
r
(
t
,
m
i
n
,
m
a
x
,
s
t
a
r
t
V
a
l
,
e
n
d
V
a
l
)
=
{
s
t
a
r
t
V
a
l
,
t
≤
0
e
n
d
V
a
l
?
s
t
a
r
t
V
a
l
m
a
x
?
m
i
n
×
(
t
?
m
i
n
)
+
s
t
a
r
t
V
a
l
,
m
i
n
<
t
<
m
a
x
e
n
d
V
a
l
,
t
≥
m
a
x
linear(t,min,max,startVal,endVal)= \left\{ \begin{array}{} startVal, & t\leq 0\\ \frac{endVal-startVal}{max-min} \times (t-min) + startVal, & min < t < max\\ endVal, & t\geq max\\ \end{array} \right.
linear(t,min,max,startVal,endVal)=?
?
??startVal,max?minendVal?startVal?×(t?min)+startVal,endVal,?t≤0min<t<maxt≥max? 如果说,表达式选择器的数量 这个值我们用
H
(
t
)
H(t)
H(t) 表示,那么就是:
w
=
2
π
T
=
2
π
f
w=\frac{2\pi}{T}=2\pi f
w=T2π?=2πf
如果你不理解表达式选择器的数量含义,请看这里:
- 这个数量是一个0-1之间的值
- 这个值用来修正运动
- 以位置参数为例子:真实的位置参数 = 该图层在变换中的位置 + 偏移量(动画制作/表达式选择器中的位置值) * 表达式选择器里面的数量百分比值
- 也就是说:
x
=
x
0
+
k
Δ
x
(
0
≤
k
≤
100
%
)
x = x_0 + k\Delta x (0\leq k \leq 100\%)
x=x0?+kΔx(0≤k≤100%)
- 在运动中,k可以从0变到1,也可以从1变到0,取决于运动设计者。
H
(
t
)
=
{
0
,
t
≤
t
0
100
?
100
d
u
r
a
t
i
o
n
×
(
t
?
t
0
)
,
t
0
<
t
<
d
u
r
a
t
i
o
n
?
100
d
u
r
a
t
i
o
n
×
s
i
n
[
w
(
t
?
d
u
r
a
t
i
o
n
)
]
w
×
e
d
e
c
a
y
×
(
t
?
d
u
r
a
t
i
o
n
)
,
t
≥
d
u
r
a
t
i
o
n
H(t)= \left\{ \begin{array}{} 0, & t\leq t_0\\ 100 - \frac{100}{duration} \times (t-t_0) , & t_0 < t < duration\\ - \frac{100}{duration} \times \frac{sin[w(t-duration)]}{w \times e^{decay \times (t- duration)}}, & t\geq duration\\ \end{array} \right.
H(t)=?
?
??0,100?duration100?×(t?t0?),?duration100?×w×edecay×(t?duration)sin[w(t?duration)]?,?t≤t0?t0?<t<durationt≥duration?
翻译成人话就是:
- 动画还没开始前,这个表达式的值为100%
- 动画开始,这个表达式的值线性的从
100
%
100\%
100%变化到
0
%
0\%
0%
- 动画结束,这个表达式的值为【振幅指数级别减小】的正弦函数。
这个函数巧妙的地方在于,它完美的让二阶导在临界值的时候保证了连续,我们不妨求导一下:
H
′
(
t
)
=
{
0
,
t
≤
t
0
?
100
d
u
r
a
t
i
o
n
,
t
0
<
t
<
d
u
r
a
t
i
o
n
?
100
d
u
r
a
t
i
o
n
×
w
×
w
?
c
o
s
[
w
(
t
?
d
u
r
a
t
i
o
n
)
]
?
s
i
n
[
w
(
t
?
d
u
r
a
t
i
o
n
)
]
d
e
c
a
y
e
d
e
c
a
y
×
(
t
?
d
u
r
a
t
i
o
n
)
,
t
≥
d
u
r
a
t
i
o
n
H^{'}(t)= \left\{ \begin{array}{} 0, & t\leq t_0\\ - \frac{100}{duration} , & t_0 < t < duration\\ - \frac{100}{duration \times w} \times \frac{w \cdot cos[w(t-duration)]-sin[w(t-duration)] decay}{e^{decay \times (t- duration)}}, & t\geq duration\\ \end{array} \right.
H′(t)=?
?
??0,?duration100?,?duration×w100?×edecay×(t?duration)w?cos[w(t?duration)]?sin[w(t?duration)]decay?,?t≤t0?t0?<t<durationt≥duration?
当
t
=
d
u
r
a
t
i
o
n
t=duration
t=duration 的时候,你会发现第二行的表达式结果完全等于第三行的结果,也就是保证了运动的速度的连续性变化!
|