Adobe After Effects是专门用于视觉特效制作的一款视频编辑软件,也是一款非常强大的工具。在AE中,表达式是一个非常重要的功能,它可以让我们对动画效果进行更精细的控制。其中,时间表达式(time expression)也是比较常用的一种。
时间表达式可以控制一个图层的时间属性(比如说位置、旋转、缩放等)随着时间的推移而改变,并根据一定的规律进行变化,下面我们从多个角度来介绍AE表达式time的使用。
一、表达式基础
在AE中使用表达式,需要选中需要添加表达式的图层,在属性面板上找到需要控制的属性(如位置、缩放、旋转等),然后打开表达式面板。表达式一般由两部分组成,分别是变量和表达式,其中变量是指需要控制的图层属性,表达式是指实现控制的算法。在时间表达式中,变量是time,它代表着当前动画的总时间,表达式则是用来控制属性值随着时间变化而变化的算法。
二、控制属性的变化规律
1. 线性变化
线性变化是最基础的属性变化,它通过控制属性的起始值和结束值,使属性在整个动画期间内均匀的变化。可以通过以下代码实现,例如你想让一个图层的位置属性从左到右平移:
```
startX = 100;
endX = 500;
linear(time, 0, 10, startX, endX);
```
上述代码的意思是:
在0秒到10秒的时间内,让位置从startX变为endX,进行线性变化。
2. 碰撞动画
碰撞动画是一种非常流行的动画效果,它可以使动画达到一定的弹性效果。如果想让一个图层水平移动,当移动到一定程度时,弹性碰撞一下,会有类似反弹的动态效果,我们可以通过以下表达式来实现:
```
startX = 100;
endX = 500;
bounce = 2;
decay = 5;
amp = 15;
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time >= time) n--;
}
if (n == 0){
t = 0;
}else{
t = time - key(n).time;
}
if (n > 0 && t < decay){
v = -amp*Math.exp(-t/decay)*Math.sin(bounce*(t-decay));
}else{
v = 0;
}
value + [v, 0];
```
该表达式中,bounce、decay和amp都是一些参数,可以调整碰撞动画的弹性强度、颤动频率和颤动幅度等。在这个例子中,图层位置将水平移动,水平方向的速度由v参数定义,v随着时间变化而变化。
3. 呼吸动画
呼吸动画可以使图层在整个动画周期内呈现出柔和的呼吸效果,其表达式如下所示:
```
amp = 20;
freq = 1.5;
decay = 4.0;
(offset = amp*Math.sin(freq*time*Math.PI*2))/Math.exp(decay*time)
```
在这个表达式中,amp代表呼吸动画的幅度,freq表示呼吸动画的频率,decay表示呼吸动画缓和的时间。
三、时间表达式在实际应用中的应用
时间表达式可以将我们的动画效果提升到一个新的层次,让动画变得更加精致。下面举几个具体的例子来讲述时间表达式的应用:
1. 跟随行进的点
在地图制作中,经常需要显示行进的路径,有时候还需要加上一个圆点或者其他的标识来显示当前位置。这时候就可以使用时间表达式来实现,随着时间的推移,标识也会随之移动,例如:
```
offset = 50;
t = time*2;
x = Math.sin(t)*offset;
y = Math.cos(t)*offset;
[value[0]+x, value[1]+y]
```
上述代码中, t = time * 2,表示在时间轴上进行了加速,不过整个时间轴的长度不会改变,offset定义了行进距离,x和y表示圆点在X轴和Y轴上的移动距离。
2. 不规则路径缓动
有时候需要一条路径,在路径第一帧到最后一帧之间移动对象,路径不是一条直线,而是一条不规则的曲线。根据路径的不同,您需要使用不同的参数来实现不同的缓动效果,例如:
```
maxdistance = 400 ;
tension = 5 ;
value + transform.position.velocityAtTime(time)/maxdistance*tension;
```
这个表达式中,maxdistance表示路径的最大长度,tension表示线条的张力,这条路径是基于图层自身运动轨迹而创建的,根据图层的运动,创建一条类似弹簧的曲线,然后让图层沿着这个曲线缓动。
四、结语
在AE中,时间表达式是一个非常有用的工具,能够帮助我们实现更多的动画效果。通过上述介绍,相信大家已经对表达式的使用方式和原理有了一定的了解。同时,在实际的使用中,也需要结合具体的场景和需求,进行灵活的运用。