共有回帖数 0 个
-
数组 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条件语句。
1.4 if/else 条件语句
if/else条件函数
当我们编写表达式的时候,我们经常会遇到根据一些条件判断情况的需求。我们看一个简单的例子,比如我们有一个旋转的表针,我们希望当这个表针指向右边的时候,它的透明度是100%的;指向左边的时候,它的透明度是50%。这里我们假设当旋转至0度的时候它是指向上方的,这个表达式我们就可以使用JS的if/else条件语句来完成,这个表达式如下:
if (rotation 180) 100 else 50


咱们分析一下这个表达式:“if”大家都应该知道这个英文单词的意思,“if”也是JS语言中条件函数的声明,紧跟着括号里面就是条件,在我们这句表达式中就是(rotation 180) ,它的意思是把if函数的条件设置为旋转小于180。接下来的100告诉表达式,当旋转小于180的时候透明度为100,接着我们写了一个 else 50, 意思就是如果旋转大于180的时候,透明度是50。
这个表达式还有很多书写的方式,我来给大家展示几种方式,有很多简化的写法我们甚至可以省略else。
t = 50;
if (rotation 180) t = 100;
t
有一点需要注意一下,如下的这种写法是有问题的:
if (rotation 180) 100
这种写法会报错,因为AE不知道当Rotation大于180的结果,AE会自动屏蔽这个表达式。
好,下面我们在看另一个稍微复杂一点的版本:
if (rotation 180){
100
}else{
50
}
这也是一种写法,得到的结果是一样的,但是我们为什么要写的这么复杂呢?对于这种就一行的表达式我们可以尽量简单的写,大家注意一下这种写法里面的大括号“{}”,因为利用这种嵌套的方式我们可以写出更加复杂的表达式,甚至在{}之间我们还可以添加if/else条件语句,在后面的章节中我会给大家展示更多复杂的嵌套方式。
对比及等于运算符:
到这里我觉得有必要介绍一下JS里面的对比符。刚刚我们用过的“”,小于号,相反我们有“”,大于号。“=”,"=",大于等于以及小于等于。还有两个是不等于"!="以及等于“==”。
这里提个醒"="和“==”的区别,第一个符号式给变量赋予值,第二个才是等于号。






最后大家需要注意一下,运算符计算优先于逻辑符号,逻辑符号的&&优先于||,大家注意不要添加过多的括号。
截止到这里,我们完成了第一部分的对于表达式基础的介绍,主要为大家介绍了一下JS的函数和语法,但是都比较基础。如果大家对这门语言有更多的兴趣,大家可以登录这个网址http://www.w3school.com.cn,这个网站的JS专区有非常详细的JS语言介绍。
下一篇推送我将开始为大家介绍一些仿真运算,我们下期再见
楼主 2015-12-02 13:28 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知