文档库 最新最全的文档下载
当前位置:文档库 › AE表达式详解

AE表达式详解

AE表达式详解
AE表达式详解

今天准备抽点时间来讲一下表达式,百度了一下,表达式方面的教程比较少,视频教程有琳达的和frak的,不过都是国外的,有中文字幕。国内的视频教程有罡渡晨星的,不过要给钱才能看,我没有给,所以我不知道他讲得怎么样。至于那两个国外的教程,我觉得讲得不错,Frank的讲得比较深入,而琳达的讲得比较全一些,不过还是有一些许地方没有涉及到,文字方面的教程往往比较支离破碎,言此失彼,不够系统。所以我决定开一个帖子作一些抛砖引玉性质的讲解,可能会比较长,也许词不达意,难免有错误,希望吧友不吝海涵。

在正式接入正题之前,先了解一些基本的问题。

一、表达式能干什么?

答:表达式并不能帮你做出华丽的特效,但是可以让一些看起来比较麻烦的事情变得比较轻松,比如说你想做两个圆球的动画,并且保证两个圆球的大小无论如何变化,它们的面积之和始终是一个定值。或者一个球在做不规则移动的时候,它的周长刚好是它运动路程的三分之一。

二、表达式难学不?

答:在学之前,我也有这样的疑问,但学完之后,我才发现我完全多虑了。

三、表达式需要掌握哪些知识?

答:1、英语。英语好一点,你可以更明白你在做的是什么事情。

2、数学,主要是函数、几何方面的东西。它能告诉你怎样达到你所要的结果。

3、JAVA编程基础。你只需要懂一点点基础就可以,不必像程序员一样,这有助于你写出更规范的东西,减少出错的可能。

4、AE基础知识。这能够让你的表达式发挥得淋漓尽致。

下面说一些基本的问题

一、怎样添加表达式?

答:按ALT SHIFT 和等号键,也可以直接接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(https://www.wendangku.net/doc/d66941153.html,yer("circle").transform.position,position)

这个式子的意思是:

方形的旋转度数=两个图形之间的距离

length的格式为:length(a,b),这样,得到的结果就是两点之间的距离,再把这个距离赋予旋转角度就可以了。

接下来讲一下valueAtTime命令,这是一个定时函数,常常用来做跟随运动,后面会提到一些更复杂的用法。先来看一个图例,如果我在方形后面写一个表达式:https://www.wendangku.net/doc/d66941153.html,yer("circle").transform.position

这样的话,圆圈的位置就会完全沿用方形的位置,所以二者重合,如图。也就是说二者似乎是粘在了一起。

如果接着在后面加上一个定时函数,变成

https://www.wendangku.net/doc/d66941153.html,yer("circle").transform.position.valueAtTime(time-0.5)

这时候你就会发现,当圆做运动的时候,方形就像个跟屁虫一样跟在后面。如下图:

valueAtTime(time-0.5)是什么意思呢?类同楼上,方形仍然取圆形的位置做自己的位置,只不过延迟了0.5秒。也就是说,方形取圆形0.5秒之前的值

下面来说一下曲线方程的问题:

假设你想让上图的方形转着圆转圈,如果你直接旋转,结果是下面这样的:

如果:你不想让矩形改变朝向,只是位置在转圈,而不调头,怎么办?

如图,矩形的横纵坐标可以由蓝色圆的半径及圆心角求出,设半径为两物体的距离为r,角度为a,粉圆的坐标为(c,d)则矩形的坐标为

x=r cos a + c

y=r sin a + d

运用到图上可以这样:

对方形的位置添加式子:

a=time*Math.PI;

x=effect("Slider Control")("Slider")*Math.cos(a);

y=effect("Slider Control")("Slider")*Math.sin(a);

[https://www.wendangku.net/doc/d66941153.html,yer("circle").transform.position[0]+x,https://www.wendangku.net/doc/d66941153.html,yer("cir cle").transform.position[1]+y]

我先来解释一下式子的内容,内容比较多:

Math.PI实际上就是数学的派(原谅楼主打不来希腊字母),由于三角函数默认是弧度制。

第一行实际上就是建一个角度变量a,使其为时间*派,也就是说,两秒钟转一圈(2PI)(我只是举例)

这里的半径R我使用了一个表达式控件代替,方便调节旋转半径:

上面的式子看似复杂,实际上结构就是如下:

a=time*b

x=a*cos e

y=a*sin e

[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],这就表示位置的纵坐标。

相关文档