您好,欢迎访问三七文档
今天准备抽点时间来讲一下表达式,百度了一下,表达式方面的教程比较少,视频教程有琳达的和frak的,不过都是国外的,有中文字幕。国内的视频教程有罡渡晨星的,不过要给钱才能看,我没有给,所以我不知道他讲得怎么样。至于那两个国外的教程,我觉得讲得不错,Frank的讲得比较深入,而琳达的讲得比较全一些,不过还是有一些许地方没有涉及到,文字方面的教程往往比较支离破碎,言此失彼,不够系统。所以我决定开一个帖子作一些抛砖引玉性质的讲解,可能会比较长,也许词不达意,难免有错误,希望吧友不吝海涵。在正式接入正题之前,先了解一些基本的问题。一、表达式能干什么?答:表达式并不能帮你做出华丽的特效,但是可以让一些看起来比较麻烦的事情变得比较轻松,比如说你想做两个圆球的动画,并且保证两个圆球的大小无论如何变化,它们的面积之和始终是一个定值。或者一个球在做不规则移动的时候,它的周长刚好是它运动路程的三分之一。二、表达式难学不?答:在学之前,我也有这样的疑问,但学完之后,我才发现我完全多虑了。三、表达式需要掌握哪些知识?答:1、英语。英语好一点,你可以更明白你在做的是什么事情。2、数学,主要是函数、几何方面的东西。它能告诉你怎样达到你所要的结果。3、JAVA编程基础。你只需要懂一点点基础就可以,不必像程序员一样,这有助于你写出更规范的东西,减少出错的可能。4、AE基础知识。这能够让你的表达式发挥得淋漓尽致。下面说一些基本的问题一、怎样添加表达式?答:按ALTSHIFT和等号键,也可以直接接ALT再点码表,如果你喜欢,你也可以在菜单的动画列表下找到它。如果你要临时禁用它,请点击=图标二、写表达式要注意什么?1、表达式是区分大小写的,比如:LOVE和LOVe,会被认为是两个东西。2、写之前,确认你用的是英文输入法,比如一些中文标点,是不被认可的。3、尽量写英文,这样会让你的表达式和脚本更好地兼容,同时也更美观,更重要的是,这样逼格更高一些。4、表达式是忽略空格和换行的,当然你也可以用空格和换行,这样会更方便你阅读。5、表达式写完一句话,末尾用分号隔开,否则会被认为后面的内容是接着前面写的。这四个按钮是什么鬼?答:等号,可以临时启用或者禁用表达式第二个是图表编辑器,你可以很容易地看到你的表达式的数据变化情况第三个是拾取线,这可以拖动的,你会经常用到第四个是语言参考,如果你不知道一个语言的格式,可以翻翻我没有打草稿,所以也不知道从哪里讲起,不过我们可以先来看一个简单的例子,我会从简单到复杂逐渐讲如上,比如说透明度,你可以输入50,这是透明度自动也变成了50%。你可能觉得我不必这么麻烦,直接在透明度里输入就可以了,何必要在表达式里输入?你甚至可以在里面输入一些算式,而不用你去计算结果。如果,你在里面输入time,结果会是怎样?在第1秒的时候,不透明度是1;第2秒,不透明度是2;第3秒,不透明度是3……这样,一个动画就生成了但,这也许不是你想要的,你可能想要的是:前三秒,透明度是50%,第三至第五秒,透明度变至100%,当然,你可以用关键帧。不过我要讲的是,表达式,这只是为了便于你理解。你可以这样输入:clamp(time*25-25,50,100)time*25是什么意思呢?意是是,第1秒,透明度是25,第2秒,透明度是50,也就是每秒钟增加25的意思。然后来看clamp,这个命令的作用就是起到一个限制作用,格式是:clamp(a,b,c)意思是:无论a怎样变化,限制a的值始终介于b和c之间。除此之外,你也有别的选择,比如说:linear(time,3,5,50,100)这也是可以的,linear是一个线性映射函数,意是是:当时间从3秒运动到5秒的时候,值从50运动到100。格式是linear(a,b,c,d,e),意思是:当a从b变化到c的时候,整个式子的值从d运动到e。下面来看一个例子,这里我们要学习的是length命令图上有一个方形和一个圆形,当圆靠近方时,方就逆针转圈,当两者远离时,方就顺针转圈。这是怎么做到的呢?来看表达式:对方形的旋转添加表达式:length(thisComp.layer(circle).transform.position,position)这个式子的意思是:方形的旋转度数=两个图形之间的距离length的格式为:length(a,b),这样,得到的结果就是两点之间的距离,再把这个距离赋予旋转角度就可以了。接下来讲一下valueAtTime命令,这是一个定时函数,常常用来做跟随运动,后面会提到一些更复杂的用法。先来看一个图例,如果我在方形后面写一个表达式:thisComp.layer(circle).transform.position这样的话,圆圈的位置就会完全沿用方形的位置,所以二者重合,如图。也就是说二者似乎是粘在了一起。如果接着在后面加上一个定时函数,变成thisComp.layer(circle).transform.position.valueAtTime(time-0.5)这时候你就会发现,当圆做运动的时候,方形就像个跟屁虫一样跟在后面。如下图:valueAtTime(time-0.5)是什么意思呢?类同楼上,方形仍然取圆形的位置做自己的位置,只不过延迟了0.5秒。也就是说,方形取圆形0.5秒之前的值下面来说一下曲线方程的问题:假设你想让上图的方形转着圆转圈,如果你直接旋转,结果是下面这样的:如果:你不想让矩形改变朝向,只是位置在转圈,而不调头,怎么办?如图,矩形的横纵坐标可以由蓝色圆的半径及圆心角求出,设半径为两物体的距离为r,角度为a,粉圆的坐标为(c,d)则矩形的坐标为x=rcosa+cy=rsina+d运用到图上可以这样:对方形的位置添加式子:a=time*Math.PI;x=effect(SliderControl)(Slider)*Math.cos(a);y=effect(SliderControl)(Slider)*Math.sin(a);[thisComp.layer(circle).transform.position[0]+x,thisComp.layer(circle).transform.position[1]+y]我先来解释一下式子的内容,内容比较多:Math.PI实际上就是数学的派(原谅楼主打不来希腊字母),由于三角函数默认是弧度制。第一行实际上就是建一个角度变量a,使其为时间*派,也就是说,两秒钟转一圈(2PI)(我只是举例)这里的半径R我使用了一个表达式控件代替,方便调节旋转半径:上面的式子看似复杂,实际上结构就是如下:a=time*bx=a*cosey=a*sine[x+f,y+g]只不过在表达式里,sin要写成Math.sin,cos要写成Math.cos,原理在22楼已经讲了。当然,另一种办法就是做一个空对象绕圆转,再把方形的位置链接到空对象上。这似乎更简捷,我只是讲方法。变量你可以随便取名字,比如:小明=3;曾哥=4;灰太狼=5;只要不使用它定义好的名字就可以。这样子,小明和3的意思是一样的。比如说time表示时间,你就不能把变量参数写成time=5再说一下数组的问题,其实在前面就该说了。比如:a=[10,20,30],假定这是一个三维坐标。如果你想取a的第二个坐标的值,20,你应该怎样写?答案:a[1]数组是从0开始计数的,也就是说,a[0],表示10。a[1],表示20……再如:position[1],这就表示位置的纵坐标。
本文标题:AE表达式详解
链接地址:https://www.777doc.com/doc-4245169 .html