首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

影视后期特效制作深入剖析AE表达式

其实表达式的教程写过不少,网上也不少,这次希望从计算机编程和算法的角度上去剖析,可能更好理解,这是根难啃的骨头,很多人也就一知半解懂个wiggle什么的,学好表达式,对工作效率的提升是很大的。新手的话不太建议在这方面花太多时间,因为表达式是个难点,但在AE中并算不上重点,不会表达式KK帧很多效果都能搞定。

第一步:开启表达式

首先我们来说说如何开启表达式和表达式的一些功能按键。首先,如何开启表达式界面呢,按住alt+鼠标左键点击秒表处打开表达式界面。

表达式处有四个按钮:

,第一个是打开关闭表达式,第二个是打开表达式曲线图像,打开后能看到用过表达式后的曲线图。

打开后能显示路径和曲线,如图。第三个按钮是拾取按钮,等等我们会说怎么用。第四个是预设按钮,能调出AE所有可调用的预设。

第二步:了解表达式的本质。

懂得如何打开表达式面板之后,我们来看看表达式的本质是什么吧。

我们新建一个合成和一个固态层,在固态层的不透明度属性上表达式“20”,如下图所示,我们会见到不透明度变成了20。

其实说到底,AE的表达式,就是返回最后一行所得到的数字或者数组,这个数字或者数组是个变量,是会随着时间改变而改变的,这里不变的原因只是因为,它每一帧都是数值20罢了。说完这些,可能会有点不解,我们来看下面几个例子。

在位置属性我输入了表达式“[20,30]”,这个表达式是一个数组,有两个数值,叫做二维数组,这个位置属性,叫做二维属性,他有x,y两个参数,这也是上文中提到的返回的可能是数组,不一定是数值。

我在缩放属性上写的表达式有三行,但可以看到,属性的数值是50%,50%,跟第一第二行的a=3和b=3完全没有半点关系,这就是上文说的,返回的仅是最后一行,不管前面运算再多,你最后一行才是最关键的。

那么再回来说表达式的本质,是啥呢,它其实就是通过代码的方式表述的数值或者数组在每一帧上的集合。

那么这里要补充两个概念和一些常识。

1.数组:其实就是一类有着相同数据类型的东西按顺序排列的集合。这集合里的元素可以是任何东西,包括数组。也就是数组的元素就可以是数组,还有整数,布尔值等等,甚至到几个图层,它们也能组成一个数组。

2.数据类型:这东西为何要在这说呢,因为有些属性的值并不是单纯的数字或者数字组成的数组,其他的数据类型也会包含到,常见的比如布尔型和字符串。我们来看下面三个比较特殊的例子。

第一个透视位移那是布尔类型,所谓的布尔类型,它就是只有对和错两种情况的。要么勾上,要么不勾。

第二个混合模式是枚举型。说这个比较麻烦,理解为它本身就是只有几种情况,而且是特殊的。这个混合模式中就是只有相加,叠加,正常的那些情况。

第三种算是特别特殊了,是字符串类型。所谓的字符串,是由数字、字母、下划线组成的一串字符。

然后来补充一张小图。多维属性的归类。

第三步:了解一些编程基础。

那么解释完了本质,我们就要说下投入使用了,但在这之前要补充一些编程方面的小知识。

1.运算符。

算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。

关系运算符:用于比较运算。包括大于(>)、小于(=)、小于等于(

逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。

PS:运算符中的等于是用两个等号,一个等号代表的是赋值,其实还有些“+=”这种复合的赋值运算符,不过我们编写其实可以不用,所以跳过。有兴趣自行百度。

2.条件语句与循环语句。

条件语句用的一般是“if...else if..else”。

条件语句主要是我们想针对不同情况,有不同的返回值。这个在之后的实例会详细解释清楚这句话是啥意思。

其实光是一个if没有else语句也是可以执行的,这里就不演示了,具体写法是

if(布尔表达式)

else if(布尔表达式)

else

什么是布尔表达式呢,简单来说就是能判断对错的语句,例如上面的“a==b”,a等于b要么是对的,要么是错的,当然布尔表达式返回的值其实是0或者1,1代表正确,0代表错误,我在第三个例子中直接写了个1,执行的是if里面的语句。

循环语句一般用的是for循环。

关于for循环,是比较强的一个循环语句,循环,它主要就是用在我们要重复的执行一个动作的时候。具体写法是。

for(循环起点;循环终点判断;用来跳出循环的表达式(一般就是自加))

{

要重复的动作;

}

例子里的语句等于写十次c=c+1,其实高中时候也应该会接触流程图的循环,类似,上面条件也是,自行参悟。这里最后还是写了个“c;”,也证实了我之前说的表达式关键还是最后一行,前面的语句其实都是为最后一句铺路的。

PS:其实也有其他像switch..case,do..while这种语句,不过懂一种也差不多了,有兴趣可以自行百度。

3.构造一个新函数与设置变量。

这里是一个重点和难点,为什么说是重点呢,因为表达式很多语句是调用AE本身自带的函数,清晰理解函数的概念能快速解决掉一部分东西,难点是因为,这里各种形参,实参这种概念的东西,新手经常弄晕,不过我在这不会提这些概念,让你们实际上手就好。

函数,什么时候函数呢,输入自变量就会得到因变量的一个体,就叫做函数,前身的概念与映射接近。前面说了,表达式其实很多语句是调用AE本身的函数。例如wiggle,linear,random,loopout一类的。

那么让我们通过例子先来了解下怎么去构造函数和变量。写法如下

function 函数名(参数名)

这是构建函数,我例子里有个“ox(50,50)”的语句,是调用函数,等于输入两个50分别个函数中的a和b,这a和b也就是自变量,我定义了一个c作为因变量,最后返回了c。关于定义函数,我们一般在前面写个var就行了,其实也有其他能定义的,不过会涉及数据类型,例如int,float,double这些。那么接下来我们来通过wiggle深入了解函数这个东西,还有为什么我会说AE表达式有很大一部分其实就是在调用AE已经写好给我们的函数。下面是Adobe官方给出的wiggle表达式的帮助。

-------------------------------------------------------------------

wiggle(freq, amp, octaves=1, amp_mult=.5, t=time)

返回类型:数值或数组。

参数类型:freq、amp、octaves、amp_mult 和 t 是数值。

随机摇动(摆动)属性值。

freq 值是每秒摆动的频率。

amp 值是向其应用了此值的属性单位中的振幅。

octaves 是要加在一起的噪声的八度数。此值控制摆动的详细程度。使此值高于默认值 1 可在摆动中包括更高的频率,使此值低于默认值 1 可在摆动中包括振幅谐波。

amp_mult 是 amp 乘以每个八度的值。此值控制谐波减弱的速度。默认为 0.5;使其更接近 1 可以与基本频率相同的振幅添加谐波,使其更接近 0 可以添加更少的细节。

t 是基础启动时间。此值默认为当前时间。如果您希望输出成为在不同时间采样的属性值的摆动,请使用此参数。

示例:position.wiggle(5, 20, 3, .5) 每秒产生约 5 次摆动,平均大小约 20 像素。除了主要摆动之外,其他两个级别的详细摆动发生的频率为每秒 10 次和 20 次摆动,各自的大小为 10 和 5 像素。

-------------------------------------------------------------------

从上面可以看出,其实wiggle就是官方写好了一个

function wiggle(freq, amp, octaves=1, amp_mult=.5, t=time)

{

............;

}

我们省去了这些流程,可以直接调用罢了。

4.部分常用的语句。

break:在switch...case语句用到多点,用途是打断部分的流程。也可以拿来跳出循环。

continue:用作跳出循环(单次的)。

return:用作返回某个值,构建函数中经常用到。

PS:break是结束整个循环体,continue是结束单次循环。

5.选学:递归(这东西其实是个很好用的东西,熟用递归可以减少代码量,也基本用不到),循环和条件的嵌套(恩,其实没那么难,不过一般也不会用到嵌套那么复杂的表达式啦),自行百度。

PS:其实编程的基础知识在这还没结束,只是还有部分东西单独拿出来说不方便,我会在下面慢慢说完。

第四步:学习表达式绑定与表达式控制

知识说的差不多了,接下来我们会接触到面向对象的概念,不过在此之前,我们会先来说AE中表达式控制这一栏特效和表达式绑定。

先来说表达式绑定,因为他是利用表达式控制的基础。

这里会用到我们之前提到的第三个按钮。

我们来演示个最简单的例子,让摄像机目标点位置绑定一个空物体的位置。我们先把空物体的3D开关打开,找到摄像机目标点参数,打开表达式。然后拖动绑定。

这样做的结果就是摄像机目标点会完全等于空图层的位置,要注意的是,属性的数据类型要完全一致才能那么直接的绑定。那么我们来看看绑定后表达式显示的内容。

thisComp.layer("控制").transform.position

这个是啥意思呢,thisComp说的是当前合成,layer("控制")指的是名称为控制的图层,transfrom说的是变换属性组,position指的当然是位置属性。这样代码的写法一层一层,逻辑清楚。在AE中,基本就是这样的一个结构“合成-图层-属性类型组-具体属性”。其实这里还并不完整,不过不完整的内容我们之后再讲。

那么我们在来讲表达式控制的一个简单例子。用滑块控制去控制一个固态层的不透明度。新建一个固态层,给它一个滑块控制的特效,然后在不透明度属性处打开表达式,绑定到滑块控制。

可以看到我们不透明度的数值会等于滑块控制的数值。再来看看这次的表达式内容。

effect("滑块控制")("滑块")

和之前说的完全不一样。恩,其实我们可以换个写法。

thisComp.layer("soild").effect("滑块控制")("滑块")

这里因为调用本图层属性数据,于是把前面的合成到层两个去掉了。在这里,我们要引出AE表达式的一类预设了。例如index,time,value,width,height,这一类表达式本质上是返回AE内某些参数,下面我拿几个例子说明下。

首先是index

我在不透明度上输入表达式

thisComp.layer("soild").index*37

其实这就是我们平日写的“index*37”,只不过我把前面的内容补充完整了。这表达式的内容是,返回名字为solid的图层的层标号乘以37,假如我只写"index*37",意思将会变为此图层的层标号乘上37。

其次是time

这个其实是直接返回你时间轴上的时间,已经没有上级可写的了。返回的数值在时间轴的左上角。

再来说说value

我们在不透明度上输入表达式

最后再来说width

因为会超过100,我们在滑块控制上输入。我分别输入了两条不同的表达式,我们来看看会有什么区别

可以看出,两条表达式返回的值不同,一个返回的是合成的宽度(我这设定的是720P,所以为1280),一个返回的是固态层的宽度(我设置的是500*500的固态层)

从上面我们可以看出,预设中有些属性只能层对象调用,有些要属性调用,有些支持多个调用,要明确了解这个,多看官方帮助。

那么我们回来讲表达式控制。

3D点控制和点控制返回的分别是3维数组和2维数组,复选框返回的是布尔值,滑块返回的是一个数值,角度控制返回的也是一个数值,不过这个数到360会进一位那种感觉,图层控制返回的是一个图层,颜色控制返回的是一个四维数组。我们还是通过例子来具体解释一下这些特效的细微区别。

关于3D点控制和点控制我在这就不演示了,和表达式绑定到空物体位置没啥两样。滑块控制也是,在这不讲。

实例1:利用复选框控制控制特效的开关

表达式如下

if(复选框控制==0)

else

先来解释下这个表达式的意思,当复选框没有勾上的时候,保持当前值,否则(也就是勾上了),执行wiggle。前面提到过这种返回的是布尔类型,也就是只有对和错,布尔类型的对用1表示,错用0表示。

实例2:黑盒中用到的角度控制

表达式如下

transform.yRotation+[index*角度控制]

这表达式说的是,他本身的旋转数值(也就是transform.yRotation在这其实可以用value代替)加上一个角度控制数值和层标号的积。

实例3:利用图层控制制作3D空间中的瞬移

表达式如下

图层控制.transfrom.position

也就是返回各图层的位置属性。

实例4:利用颜色控制批量控制颜色更改

先做一个如图有三个不同颜色的形状层和一个空图层加上颜色控制。

然后都绑定到颜色控制。

这样做在你编好哪部分颜色要是什么,之后可以一次性批量修改颜色。

第五步:引出另外一类预设与一些简单算法的普及

其实另外一类我上面已经提到了一点,wiggle是官方写的一个函数。那么包括random,loopOut,noise这一系列都是AE提供的函数,这其中有一部分又是数学,包括vetcor math和javascript math两个部分。要用好这些,除了要好好参考AE官方提供的帮助外,还要懂一些很基础的算法。

1.通过对2的取余运算来做定格关键帧。

if(Math.floor(time)%2==1)

else

我们可以看到曲线是定格运动了,我先来解释一下表达式,math.floor是官方提供的一个函数,功能是向下取整(因为我们这里做的是取余运算,需要取整比较好),也就是说,表达式的意思是如果time取整后对二取余的值为1,那么值等于20,否则值等于50。

关于对二取余这个操作其实是拿来判定奇偶数用的,配合上条件语句会有奇效。具体要拿来怎么用,还得看个人的天马行空了。

2.交换数值。

这算是最基础的一个算法。表达式如下。

function ex(a,b)

{

var a;

var b;

var c;

c=a;

a=b;

b=c;

}

通过这个函数就能把a和b的值互换过来。

3.累加与累乘。

这里不再讲,用for循环或者其他循环语句实现。包括数列求前N项和也是用循环语句实现。

4.排序与查找。

排序用的是冒泡法,查找用的是二分法,有兴趣自行百度。

5.穷举。

也就是把可能的情况一一测试,用循环实现。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180328G1BJM800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券