签到

07月05日
尚未签到

共有回帖数 0

    做月子

    等级:

    暑期和我学表达式系列教程从0开始,让小白分分钟搞定复杂难懂的AE表达式。让大家对表达式有一个全面的认识;暑期过后,回到学校你就可以教你的同学使用表达式喽。

    表达式没有那么难,通过系统的学习,哪怕你写不出高深的表达式,但是至少能读懂别人的作品,看懂那些复杂的模板。


    第一章 - 表达式的语言

    1.1表达式控制面板
    学习表达式需要从表达式的操作界面开始,在AE里新建一个合成你就能看到如下界面:

    仔细观察你会发现,Position属性(665.5,441.0)由之前的黄色变成了红色,如果你在AE里面看到这种情况,说明这个属性被赋予了一个表达式。
    同时,我们还可以看到数字下面还多了四个按钮。第一个“=”是表达式的开关,可以打开和关闭表达式;第二个看似是曲线编辑器,这个按钮可以查看添加表达式后动画曲线的变化;第三个叫“橡皮筋”,用橡皮筋可以拾取属性帮你完成你的表达式;第四个是表达式语言按钮,有点像特效菜单,会把AE所有的表达式列出来。
    最后我们看到的就是表达式,默认AE会填写transform.position。transform是"变形",后面我们还会看到transform.opacity,transform.scale。position的意思是位置,transform这个单词记住是非常简单的,看下图:










    1.2表达式使用的计算机语言

    AE Javas cript 简介:讨论表达式问题,不可能避免讨论一些编程技术;AE的表达式采用的是Javas cript(后面简称为JS)作为基础程序,所以如果希望学习表达式,编程这一关是怎么也躲不开的。不过还好,大部分JS语言是为了制作网页而设计的,我们只需要学习其中的一部分就可以了。不过,再简单的编程也需要大家有意愿去学习,这一节我不会把所有的JS都写出来,这样会累死我,也会吓到你们。在本节我只介绍一些基础,让大家有一个简单的认识。

    Javas cript的暗语:

    首先我们需要学习一些JS的暗语,JS语言里面包括Objects(对象),methods(方法),properties(属性)。我们可以把Objects(对象)理解为AE中的图层,合成,和特效;methods(方法)我们可以理解为动作(也可以把它理解为一个动词);properties(属性)可以理解为物体的参数了(比如一个图层的宽度,或者一个合成的帧数)。
    运算数字和运算符:
    JS作为一种语言,和其它的语言一样具有运算能力。其实就是加(+)减(-)乘(*)除(/),乘除运算应该优先与加减运算。例如,3+2*5=13。也可以用括号改变运算顺序(3+2)*5=25,简单的数学运算我就不多写了。
    还有一个%,叫取模运算,这个算法计算两个数相除的余数。比如5%3=2,其实就是5/3=1,余数为2。
    变量:
    在较长的表达式中,使用变量可以大大提高我们的效率。我们来算一道数学题,如果y=x+4,x=6,问y=?。如果你没上过小学,那你就惨了。如果我还没记错,这里面的y和x就是变量。另一个认识变量的方式是,变量是“需要被定义的名称”。或者这么理解,变量是一个根据指定参数变化的数字。
    声明:
    许多AE表达式由很多的声明组成,通常每一个声明由“;”隔开。许多声明是为变量赋值的声明,这种声明类似这样 rotation=180。由左侧的变量名,中间的“=”,和右侧的变量组成。当然也有很多特殊情况,当我们遇到这种情况时,我会给大家解释一下。当然有一个特例,如果是一段表达式的最后一行,我们可以不加变量名称,等于号以及分号,比如给Rotation的表达式添加一个180,这个Rotation就是180,不过你也可以写成 rotation=180。我们看一个例子:






    1.3 数组 Arrays
    数组 Arrays 简介:
    数组是具有相同的数据类型且按一定次序排列的一组变量的集合体,构成一个数组的这些变量称为数组元素。AE的表达式大量的使用了JS的数组,我也不太希望让大家学习这么复杂的数学知识,但是没办法,想了解表达式就要了解数组。不过,我尽量以最简单的方式给大家描述。最简单的数组就是一维数字,你可以把它想成一列数据;下一个就是二维数组,你可以把他它理解为像Excel表格的数据,有横有竖。数组可以有无限的维度,但是到了三维数组就变得比较难形象化了,你可以把他们想成一个立体的正方体的数据。不过,比较幸运的是,AE中我们大部分面对的是一维数组。


    如何获取数组中的数据:
    JS通过Index(索引)获取数组中的数据,索引从0开始。所以对于一维数组索引从0开始至数组中一共有多少数据。例如,如果我们的数组是上图的一维数组,通过索引0我们可以获得123.9这个数据,通过5我们可以获得498.2。多维数组通过多维索引获得其中的数据,但是我们不会涉及到那么复杂的问题。
    这里有一个比较值得注意的地方,AE中有很多属性是二维数组(位置,缩放),但是这些数据以一维数组的形式存储。比如,一个图层的位移是(124.9,235.8),我们通过0可以获得X的数据是124.9,通过1可以获得Y的数据235.8。


    数组的语法:
    当我们需要从数组中获取数据的时候,我们把索引放在方括号里面“[ ]”。所以如果希望获得一个图层的X位置的数据,我们可以通过position[0]获得,当然Y的位置是通过position[1]获得。这里大家可以记住在AE中所有的X的索引都是0,Y的所有都是1,对于3D层Z轴就是2。
    这里有一点要注意一下,定义一个数组也是用方括号“[ ]”,我们下面看一个例子:
    myArray = [5,6,7,8];
    通过上面这行代码我们定义了一个叫“myArray”的数组,里面有四个数据,5,6,7,8。如果希望调取这个数组中的第一个数据,我们可以这样获得myArray[0],我们可以获得5。定义和获取都使用大括号,可能会有一些混淆,但是稍加留心我们应该可以很容易区分开,我们看一个例子:
    newX = position[0] + 10;
    newY = position[1] + 25;
    [newX,newY]
    我来为大家解读一下上面的这个例子。第一行,我们通过position[0]获得了X轴的位置,并给X轴加10,然后我们将这个结果存储在了一个叫“newX”的变量中。第二行以此类推,newY变量里面存储了加了25的Y值。最后一行我们定义了一个新的数组,将新的X值和Y值赋予这个数组,然后这个数组将新的X和Y赋予Position。大家可以看下图,通过这个表达式我们将这个固态层的X移动了10,Y移动了25。



    上面这个例子,还引出了一个比较重要的问题(与数组无关),大家可以思考一下,如果我预览上面这个动画,这个蓝色的图层会每一帧都被表达式驱动吗(每一帧位移都发生变化)?为了解释方便我们看一下如下这行例子:
    opacity = opacity + 1;
    好,如果我们把这个表达式赋予给这个图层的透明属性,那么每一帧透明度会增加1吗?答案是不会的,上面的位移也不会发生变化。
    因为,表达式没有缓存机制。
    AE的表达式没有办法知道上一帧它做了什么(只能说是99%正确,通过程序表达式可以知道它上一帧做了什么,但是这没多大意义,而且比较浪费渲染资源),同时表达式也不能知道它下一帧的信息。
    还有一点需要大家知道的是,表达式没有全局变量。在编程中,全局变量被声明后,可以在任何时候调用,就好像我们在Position里面定义了一个变量,应该在其它的参数的表达式中也可以调用,但是AE的表达式是不能这样做的。表达式与表达式之间沟通的唯一方式是通过他们赋予的那个参数,比如位移,透明,缩放。
    关于表达式的一些“限制”我们会在其它篇章进行阐述,这里大家记住这个原理就可以了。
    数组的计算:
    现在我们看一下简单的数组数学,AE中的大部分数组计算都很简单,咱们看一个例子:
    a = [100,150];
    b = [200,250];
    a + b
    这个计算的结果是[300,400],非常简单。如果我们把这个表达式赋予位移,那么我们得到的就是X=300,Y=400,这个表达式我们还可以这样写:

    a = [100,150];
    b = [200,250];
    [a[0] + b[0],a[1] + b[1]]
    这么写看起来很复杂,但是结果是一样的。如果我们将两个不同产长度的数组相加我们会获得什么结果呢?比如:

    a = [1,2,3];
    b = [4,5];
    a + b
    这个表达式我们会获得这样的结果:[5,7,3]
    数组的减法基本也是差不多,看下面例子,不再过多赘述,大家应该可以猜到结果。

    a = [500,400];
    b = [200,300];
    a-b
    但是乘法和除法就不一样了,其实AE的表达式是不能做这种运算的,也用不到这么复杂。但是它知道如何将一个数组乘以一个数字,看下面的例子:
    a = [100,150];
    a*10
    这个计算的结果是[1000,1500],除法的结果以此类推应该是[10,15]。
    还有一个要注意的地方,AE知道10*[100,100]与[100,100]*10的结果是一样的。但是你不能写10/[100,100],AE不知道如何计算一个数字除以一个数组。
    好了今天就为大家介绍到这里,下次话题将会非常有意思,if/else条件语句。

    楼主 2015-09-24 14:22 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知