很多童鞋在学习AE的时候会觉得表达式很难,不知道如何使用。今天像素妹给大家分享一些常用的表达式用法,揭开AE表达式神秘的面纱,为你的动效设计加速。

表达式是AE内部基于Java Script语言开发的编辑工具,能够通过简洁的代码代替复杂的关键帧对于动画属性的控制,从而提高我们的工作效率,实现出更加流畅、真实的效果。

AE里可以打关键帧的属性前面都会有码表,我们按着Alt键+鼠标左键点击码表,就可以调出来属性的表达式输入框,接下来在里面输入想要添加的表达式就可以了。

1、time时间表达式

time表达式的写法是time*n,n表示单位时间(每秒)内,属性参数的变化量。如给图层的旋转属性添加表达式:time*90,则表示该图层每秒钟旋转90度,并且旋转会一直持续下去。

了解time表达式后,我们可以尝试着做一个时钟,画出外轮廓以及秒针、分针。将秒针图层旋转属性添加表达式time*360,分针图层旋转属性添加表达式time*6(数值可以自定义,数值大小决定了旋转的快慢)。

我们来看一下效果:

2、wiggle抖动表达式

wiggle是很常用的表达式,对物体实现随机抖动。写法是wiggle(x,y),x表示每秒钟抖动的频率,y表示抖动的幅度,即每次抖动所偏移的量。

如新建一个文本图层,调出位置属性P,给位置属性添加表达式wiggle(7,40),表示每秒抖动7次,每次抖动40个像素单位。

除了可以给位置属性添加wiggle表达式以外,还可以给别的属性添加,如缩放、旋转、不透明度等。

如果希望在单个轴向上进行抖动,我们就需要修改一下wiggle表达式的写法。举个例子,想要将动画限制在x轴抖动,抖动频率3,抖动幅度90,那么表达式为[wiggle(3,90)[0],value[1]] 。(在这里0对应x轴,1对应y轴)

3、loopOut循环表达式

loopOut表达式可以创建循环的动画效果,我们只需要做动画的开始帧、结束帧,添加表达式后动画就会一直循环运动,不用再重复打关键帧了。

基础写法是loopOut()

接下来我们使用loopOut表达式制作一个音量播放的效果,巩固一下。

我们在AE中绘制一个矩形,将矩形的锚点调整至底部中心位置,这样就可以通过缩放属性来控制单向的长短变化。调出缩放S,把约束比例锁链去掉,然后根据矩形的高度变化来打关键帧(结束帧与开始帧属性相同)。

按Alt键+左键点击缩放码表,表达式输入框内只需要写loopOut()即可实现循环效果;

用同样的方式做出其它矩形,我们来看一下效果:

进阶一些的用法,是在loopOut()括号里面写内容,如下:

loopOut(type = “cycle”, numKeyframes = 0)

我们也可以在表达式语言菜单里面选择,点击表达式右侧的三角箭头——Property中进行调用。

loopOut循环表达式的类型,最常用的是“cycle”,指的是在动画的最后一个关键帧结束,然后从第一个关键帧开始循环播放。

想要做动画播放完再反向的来回循环运动,可以将括号里的cycle替换成pingpong

若想在当前动画基础上叠加循环运动,需要将括号里的cycle替换成offset

4、惯性弹跳表达式

生活中我们见过太多自由落体反弹的例子,比如篮球、乒乓球等,我们可以通过使用表达式来代替复杂的手动k帧。接下来以一个案例的形式,给大家分享一下惯性弹跳表达式Bounce,让我们可以轻而易举地实现弹跳动画。

首先我们绘制地平线,再画一个椭圆,对椭圆小球的位置属性做垂直方向的运动。

将这两个关键帧变成缓动,进入图表编辑器中调节运动曲线,保证结束帧的速度不为0(因为结束帧速度为0,添加的惯性弹跳表达式会失去效果)

接下来是重点了,Keyframe Bounce Back表达式:

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表示重力,nMax表示最大跳动次数。我们将这一大段表达式进行复制,按Alt键点击位置属性码表,将表达式粘贴到表达式输入框内,弹跳的效果就做好了~(我们可以适当调节结束帧的速度以及重力等参数,会看到不一样的效果哦)

5、random随机表达式

random表达式,可以实现随机变化的效果。写法是random(min,max),min表示最小值,max表示最大值,添加表达式后会在最小值与最大值之间随机取数值进行变化(很多人容易把random与wiggle搞混,wiggle是控制两个不同属性参数的变化)。

比如我们给矩形图层的不透明度属性添加表达式,random(50,100),图层不透明度的值会在50%~100%之间随机变化。

我们也可以给文本添加表达式,做出数字随机出现的效果。选中文本图层,找到“源文本”属性,按Alt键单击码表,输入random(5,20),表示文本会在5~20之间,随机生成数值(这时生成的数值是带有很长的小数点数字)。

为了在实际工作中更加实用,我们想要得到随机生成的整数数字,就需要使用取整表达式Math.round() ,将需要取整数的表达式放在括号内就可以了。如刚才的案例,表达式需要写为Math.round(random(5,20)),这样就可以实现随机的整数数值变化了。

6、index图层编号表达式

index指的是AE图层前面的编号,使用这个表达式可以非常便捷的做出有规律的变化效果。

先举个简单的例子,在AE中制作一个小太阳:

绘制一个椭圆和圆角矩形,将圆角矩形锚点调整至圆的中心,图中红框所示就是图层的编号。

选中圆角矩形图层,调出旋转属性R,按Alt键点击码表,表达式输入框中输入index*45

复制多个圆角矩形图层,你会发现图层边复制边旋转,转了一圈。在这个例子中,给第一个图层旋转属性添加表达式index*45,index此时为1,表示图层旋转了45度,那么在复制图层的时候,第二个图层(图层编号2)的角度就变成了90度,以此类推。

接下来像素妹给大家分享一个很有意思的index表达式拓展内容:在AE中制作3D展示效果

首先我们在AE合成中导入一张APP效果图,打开3D图层属性。新建摄像机,调节摄像机的参数,将图层顺序放在效果图的下面。

调出效果图图层的位置属性,点击位置——右键——单独尺寸,这样就可以把x、y、z位置属性分离。

对z位置属性添加表达式:index*1,这样在进行每次复制图层的时候,会在z轴方向往后移动1px,从而营造出三维厚度效果。

选中效果图图层,菜单栏——效果——颜色校正——曝光度,添加曝光效果。

在效果控件面板,降低曝光度的参数,如-0.6,使整体图片变暗。

接下来就是重头戏了,我们将效果图图层选中,复制多个,然后将第一个图层(图层编号1)的曝光度参数调回0。神奇的3D展示效果就出现了,是不是很简单方便呢?ヾ(´∀`o)

7、延迟表达式

延迟表达式在动效设计中是用的比较多的,想要做出运动物体之间延迟的效果,利用错帧虽然可以实现,只不过想要后续修改的话会比较麻烦,那么使用表达式来做是一个非常便捷的方法。

首先新建合成,绘制小球,对位置属性做动画(0s左侧,1s右侧,2s左侧)

接下来我们认识一下延迟表达式valueAtTime(t),这个表达式可以通过括号内的参数对图层效果作用的时间产生影响,实现延迟的效果。可以直接用Alt键单击位置属性码表,然后在表达式输入框中输入,也可以在表达式语言菜单中进行调用。

我们可以结合前面讲的index表达式,配合着做延迟效果。按Alt键单击位置属性码表后,在表达式输入框中的内容最右侧输入一个点.,然后输入表达式valueAtTime(time-(index-1)*0.08)。这个表达式的意思是,第一个图层动画效果不延迟,第二个图层相较于第一个图层延迟0.08s,以此类推(这里的延迟时间0.08可以根据个人需要调整)。

如果想要让图层之间有不透明度的变化,可以手动k帧,也可以针对于不透明度属性,添加表达式:

opacityFactor = .75;

Math.pow(opacityFactor,index – 1)*100

将图层复制多个,延迟的效果就做好啦,非常的好用~

除了位置属性可以添加延迟表达式,其它属性也可以,如缩放、旋转、不透明度等,我们可以发挥自己的想象力,做出很多有意思的效果。

8、弹性表达式

在动效中加入弹性效果看起来会更富有趣味性,不过在AE里手动k帧简直是要了老命的体力活,而且效果不一定好,在这里给大家介绍一下弹性表达式:

amp = .1;

freq = 2.0;

decay = 2.0;

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){

v = velocityAtTime(key(n).time – thisComp.frameDuration/10);

value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);

 }

else{value}

首先我们绘制一个圆角矩形,将大小里的宽度、高度设置为一致,圆度调大,这样看起来就是一个圆形了。对大小、圆度属性打关键帧做出基础动画,为了视觉效果更自然,可以将大小变化的关键帧变为缓动(要注意,缓动的结束帧速度不能为0,不然弹性表达式不起作用)。

按Alt键单击大小属性码表,将弹性表达式粘贴至表达式输入框中,效果就出来啦,真的是非常友好~(弹性表达式里的amp表示振幅,freq表示频率,decay表示衰减,我们可以适当修改参数来看一下不同的效果)

最后妹儿给大家讲解一下弹性表达式与延迟表达式的综合使用,我们在前面学习到了延迟表达式的基础用法,那么如何将两个不同表达式结合呢?接下来给大家用一个简单的案例来说明:

我们在AE中绘制一个小球,调出位置属性,选中位置——右键——单独尺寸,将位置属性分离为x位置、y位置两个独立的属性。将小球进行复制,把复制的小球图层顺序放在下方。

然后对小球1(图层编号1)的x位置打关键帧,做水平方向的位移动画。选中关键帧变成缓动,同样需要注意的是结束帧的速度不能为0,需要在图表编辑器中进行调节运动曲线。按着Alt键单击小球1的x位置属性码表,将弹性表达式粘贴在表达式输入框中。(根据个人需要可以适当调节表达式参数)

这时候我们发现小球2的y位置是与小球1一致的,我们想要让它们垂直方向数值不同,可以按着Alt键单击小球2的y位置码表,在表达式输入框内容的后面写:+100*(index-1)

表示当前小球2(图层编号2)的垂直方向会增加100,也是考虑到后期会复制图层,所以直接采用了表达式的方式(你们应该知道我不会手动k帧的对吧o( ̄ε ̄*))

接下来难点来了,我们按Alt键单击小球2的x位置码表,然后拖拽表达式关联器(螺旋图标)到小球1的x位置上。这时候我们发现小球2的x位置表达式输入框里的内容就有变化了,变成了与小球1有关(此时已经具备了弹性表达式效果)

我们想要做出延迟的效果,就直接在小球2的x位置表达式输入框内容的后面输入.valueAtTime(time-(index-1)*0.05)

选中小球2图层,复制两层,最终的效果就完成了~是不是很简单呢?

以上这些表达式都是一些比较基础好记的,大家是不是已经学会了呢?当然并不是任何时候都要使用表达式,而是要根据不同的效果来选择,我们最终的目的是要实现出想表达的效果。

妹儿今天的这篇文章只是起到了抛砖引玉,最重要的是要打开思维,多练多思考,慢慢的就会发现AE表达式其实没有那么可怕。

感谢大家的观看哦,我们下期再见~(๑•̀ㅂ•́)و✧

Powered by Froala Editor

声明:* 本站所提供的资源均来源于互联网,站内所有文字、图片内容由网站会员上传而来,UI社不具备此内容的版权。由于将本站资源用于商业用途而引起的纠纷,本站不负任何责任。如果有侵犯到您的权益,请联系本站删除,谢谢合作!联系邮箱:Uishe#qq.com (请将[#]换成@)