龙空技术网

点我带你详细剖析AE表达式

视界资源网 494

前言:

而今各位老铁们对“ae旋转怎么改变轴心”都比较珍视,小伙伴们都需要学习一些“ae旋转怎么改变轴心”的相关文章。那么小编在网上收集了一些有关“ae旋转怎么改变轴心””的相关内容,希望你们能喜欢,你们快快来学习一下吧!

表达式简介

在详细讲解表达式之前,我们先总体了解一下AE中元素之间的关系,据我所知在AE中主要有五种方法建立元素之间的关系:

关键帧:即使元素间没有必然的连接关系,你也可以通过设置关键帧来为它们建立联系。这是最普通的一种连接关系,这种方法也是最灵活的,但是很不利于修改和调试。

合并嵌套: 你可以将几个图层一起放置于一个新合成中,这很像其他应用程序中的成组操作,一种将多层素材元素作为单独素材处理设置的方法。

父子连接: 不用嵌套为图层建立层级关系的方法,在父子连接关系中任何应用于父层级的变化都会立即影响子层级,而针对子层级的设置不会影响到父层级。

动力学脚本: 像表达式一样,动力学脚本是AE中内置的简单功能,动力学脚本可以为当前图层创建基于另一个图层或属性的关键帧。例如,你可以使用动力学脚本令一个图层模拟另一个图层的位置变化。美中不足的是,使用动力学脚本建立的元素间关系只是暂时的,仅当脚本执行时才会起作用,在后面的设调整中,针对一个图层的改变不会反映在另一个图连接层上,除非重新应用动力学脚本。

表达式: 表达式很类似于动力学脚本,不同的是表达式会保持始终使能,只要应用表达式之后,任何关键帧都会永久保持与之的连接关系。

在这几种连接关系中,表达式的功能最强大,但是学习起来有一定的难度,需要一定的毅力。

使用表达式的时机

使用表达式为图层建立动态连接是一种非常方便高效的方法。

从父层级中仅仅复制一个参数. 有些时候,你只想从一个图层中复制一个参数,而不是一整套父子连接图层关系。 例如, 两个图层建立了父子联接, 利用父子联接建立的图层关系中子层级会继承父层级的位置与旋转属性。而应用表达式建立的图层关系,子图层只会继承父层级的一个属性,而其旋转属性由于未被联接到旋转属性,所以该参数不会改变。

通过使用表达式你不用设置任何关键帧就可以为参数设置动画。

你可以使用表达式为存在的关键帧增加随机性,这种方法非常巧妙,它保留了原始的关键帧设置。使用表达式建立的随机性效果可以轻松的切换表达式的使能状态,不会影响原始关键帧。

通常情况下使用其他方法可以实现的效果就不要使用表达式,AE具有强大的工具和功能来实现各种各样的效果。例如,使用父子连接可以实现的效果就不需要再使用表达式。表达式功能的确很强大,但是它不是万能的,而且精心书写表达式后还要维护表达式。

解析表达式

简单的说表达式就是为特定参数赋予特定值的一条或一组语句,最简单的表达式就是一个数值:6; 当然了,这种表达式的用处不是很大,常量通过调整参数的值来实现就可以了,像下面这种变量表达式用处会更大:rotation;

当执行该语句时,AE的表达式会自动计算当前图层当前时间的旋转参数值,返回的值会赋予表达式连接的参数值。 如果表达式应用于图层的不透明度属性,那么该图层的不透明度属性会随着旋转属性同步变化,当旋转三十度的时候,图层不透明度也会被设置为30%。

AE中的表达式以Javascript语言为基础,Javascript包括一套丰富的语言工具来创建更复杂的表达式,当然包括最基本的数学运算:opacity*10;

意思就是当前图层在当前时间的不透明度参数乘以10,因为不透明度参数的值阈是0~100,所以该表达式的之余就是0~1000,该值将赋予表达式连接的任何参数。

等号的位置

也许你认为表达式应该是这种形式,“position=rotation”,AE中的表达式不需要使用等于号将其赋予参数,为参数添加表达式的时候,直接将计算出来的结果赋予参数。当然,你也可以在表达式中使用等于号,为参数赋变量值。

表达式、参数值一一对应

一句表达式控制一个参数,因为一句表达式仅连接在一个参数上,它仅将值赋予该参数。例如,你不可以使用一句表达式来同时修改一个图层的位置和旋转值;你只有创建两个区分开来的关键帧,一个连接到位置属性上,另一个连接到旋转属性上。

多行表达式

表达式可以以多条语句的形式来组织书写。

当表达式由多条语句组成的时候,最后一行语句所计算出来的值将赋予表达式连接的参数,如下面的表达式:

offset=30;

ralph=rotation+offset;

ralph;

该表达式组将会使图层的旋转值设置为当前时间的旋转值加上30度。

为参数加入表达式 有两种方法为选择的参数加入表达式,一种方法是在时间轴选择参数后,从动画菜单中选择增加表达式;另一种方法 是按住ALT键的同时鼠标左键单击参数左边的马表,快速为参数加入表达式。

加入表达式后,你会发现时间轴发生了变化:

首先,在参数名称的左侧多了一个带有“=”的按钮,单击该按钮来切换表达式的使能状态。

其次,参数值变为红色,表示该参数由表达式控制,手动编辑该参数将失效。

第三,在参数名称的右边增加了并排的三个图标(稍后讨论)。

最后,在时间轴中增加了一个表达式编辑区域,该区域可以通过下拉箭头来改变显示范围。

单击第一个图标按钮会在时间轴窗口中打开表达式的变化图表,从中你可以观察到参数值的变化曲线和参数变化的加速度。如果表达式影响到元素的运动路径,那么合成窗口中显示的路径曲线也会发生变化。

第二个图标按钮是拾取线一个帮助你书写表达式的工具,只需要简单的将拾取线拖动到另一个参数上面,就可以为当前参数与拾取的参数建立动态连接关系,在后面的教程中详细讲解拾取线的功能。

第三个按钮是表达式结构下拉菜单,使用该菜单可以方便的参考AE的表达式语言,使用该菜单可以清晰的看到表达式所影响的属性和元素。

拾取线

使用拾取线可以方便的建立参数间的连接表达式:

例如,为图层的不透明度添加表达式,然后拖动拾取线到图层旋转参数上就会为不透明度与旋转参数建立动态连接,现在再为旋转参数设置关键帧,会同步影响到不透明度属性:

如果你将拾取线拖动到同一合成不同图层的属性参数上,那么AE就会创建一个稍微复杂一点的表达式,表明与哪一个图层的属性建立动态连接:

this_comp.layer("Solid 1").opacity

这个表达式首先指明合成("this_comp"),然后指明该合成中的图层("solid1"),最后指明该图层被用于建立连接的属性(opacity)。

顺便说一句,拾取线没有什么特别神奇的地方,可以说它仅仅起到自动将连接的属性名称及其所属合成与图层添加到表达式文本区。你也可以亲自手写表达式,但是这种方式远远不及拾取线方便准确,特别是当需要编写较复杂的表达式时,拾取线的高效快捷更是体现的淋漓尽致。

向量、阵列、维数、索引 有时候你会发现通过拾取线创建的表达式看上去好象在重复参数,例如,如果你将位置参数的拾取线拖动到旋转参数上,你就会得到如下表式:

[rotation, rotation];

因为位置属性有两个参数(X、Y坐标)而旋转属性只有一个参数,建立连接关系后,表达式自动将旋转参数应用两次分别位置属性的X、Y坐标参数。

由两个或三个数值来描述属性的参数组叫做向量或阵列,AE中很多的属性参数是向量式的,包括位置、轴心点和缩放等属性;

与阵列对应的用单个数值来描述属性的参数叫做标量式参数。

向量与阵列:究竟向量和阵列之间有什么区别呢,你也许会注意到AE的帮助文件有时候互用这两个单词,简单的说向量是既有大小又有方向的数字阵列,其运算结果即要考虑到大小又要考虑到方向;阵列是一套独立元素的组合,阵列中可以包含任何元素,可以是物体阵列,词汇阵列或者是混合阵列:

ralph=[10, this_layer, "bob"];

也许没有人会知道上面的这种阵列会有什么用处,但是它确实是一个正确的阵列,当然在AE中我们大部分时间内遇到的是数字阵列(也叫向量)。所以,在接下来的描述中,当谈论到通用的概念和操作应用时,我们使用阵列来描述;当涉及到特殊的数字阵列时我们用向量来描述。

索引:对于阵列来说,你可以使用阵列名加上包含数字的中括号从阵列中提取需要的单一元素,例如:position[0];

这种表达方法叫做索引,注意在阵列中使用索引调用元素时,必须从0开始计数第一个元素。所以,上面的表达式就返回位置属性向量中的第一个参数——x坐标,那么position[1]就返回位置属性中的Y坐标,千万不要搞混淆了,在AE中虽然所有的调整都是从1开始的,但是当使用索引时,必须从零开始计数。

建立阵列:如果要建立阵列,可以将数值以逗号分隔开放入中括号中:

my_vector=[10,20,30];//该表达式的意思是将一个三维数组赋予变量my_vector,该数组中包含三个元素分别是10,20,30,

维数 :阵列中的元素个数代表阵列的维数,例如上面的my_vector是一个三维数组,位置属性是一个二维数组或三维数组(转变为三维图层)。标量式的属性如旋转和不透明度属于一维数组(准确说单一数字或者是标量数值就是一维向量)。

需要注意的是诸如位置、属性这样的多维数组或者是自定义的数组变量,不需要将他们的名字写在方括号中,AE会将其识别为数组。当要索引阵列或者是描述阵列时,需要使用方括号。

修改阵列中的一个元素 :可以用如下的方式来书写位置表达式:

[position[0], position[1]];

将位置阵列中的两个参数分别提出来后,再将他们放入同一个阵列中,看上去与仅仅书写positon的结果相同,优点是你可以使用这种结构来修改阵列中的一个元素而不影响另外元素,例如:

top_of_layer=0;

[anchor_point[0], top_of_layer];

在这个表达式中,阵列中的第一个元素是轴心点的X坐标值,第二个元素是0,如果将该值赋予轴心点属性,那么轴心点的X值将受AE的控制调整,而轴心点的Y值将始终为0。

当使用这种结构时要特别注意,如果将图层设置为3d图层,就需要重新书写表达式,将位置与轴心点Z轴考虑进去。例如,如果仍然使用上面轴心点的例子,但是这次将轴心点所在的图层设置为3D图层,AE会自动将丢失的Z轴坐标设置为0,这当然比出现程序错误要强的多,但是所得到的结果未必是我们需要的,因为表达式将忽略轴心点的Z轴坐标的变化。

再看另外一个例子,假如你将一个图层的位置属性复制到另外一个图层上,并且将该参数的Y轴值减去100:

ralph=this_comp.layer(1)

[ralph.position[0], ralph.position[1]-100];

如果这时将图层设置为3D图层,你会发现对控制图层的Z轴所做的任何操作丝毫不会影响到受控图层的Z轴,因为表达式中没有表明Z轴的坐标值,AE会自动将其设置为0。

参数值范围:当使用表达式中的拾取线来建立参数之间的关系时,AE会自动纠正由于错误的维数匹配导致的错误,但是这种纠正之后的表达式并不意味着就是你所需要的,物理错误是避免了,但是逻辑错误仍然会影响你的创作。

在这里特别强调一下,有时候你需要调整当前参数值以匹配目标参数。例如,在前面的例子中我们使用图层的旋转属性来控制图层的不透明度属性,你会发现当旋转属性达到100度时,不透明度属性就达到了上限,但是我们想要的效果是当图层完成一个周期的旋转时其不透明度回到原来的值,我们就需要调整参数范围以达到我们的需要。

缩放参数范围值的方法很简单,可以利用公式(当前连接参数/当前连接参数范围上限=目标连接参数/目标连接参数范围上限),还是使用上面的例子来说明,我们需要将旋转参数的范围(0~360)缩放到不透明度参数的范围(0~100),所以我们就需要为不透明度加上表达式:

rotation / 360 * 100,从而就达到了我们需要的效果,不透明度在0~360度范围内变化:

用这个简单的小技巧可以完成很多期望的效果。例如,使用一个轮胎的素材作为图层,我们就可以利用该图层的位置属性来驱动图层的旋转属性,我们只需缩放位置属性来为旋转属性建立正确的连接表达式,因为轮胎每旋转360度就会移动一个周长的距离,所以我们应该这样书写表达式:     rotation=distance/circumference*360:

插值方法:线性liner(),平滑ease()

我们已经学习了怎样利用表达式来缩放参数值的范围,只需要简单的乘除运算就可以了。例如将旋转参数范围(0~360)缩放到不透明度参数范围(0~100),但是这不是唯一的方法,AE提供了一套内置的插值算法进行参数之间的转换:

linear(t, t_min, t_max, value1, value2)

ease(t, t_min, t_max, value1, value2)

ease_in(...), ease_out(...)

这些语句看起来很复杂,因为语句中包含很多参数:

t 当前参数,例如旋转参数,不透明度参数或者是你所选择的其他变量,该参数必须是一维的,该参数为必选参数。

t_min 当前参数范围的下限,该参数为可选参数,如果参数范围的下限或上限被忽略掉了,那么AE会将参数的范围定义在0~1之间。

t_max 当前参数范围的上限,该参数为可选参数。

value1 目标参数范围下限,当t≤t_min时,表达式返回该值,该值可以是一维标量也可以是二维向量,与value1的维数相同,该参数为 必选参数。

value2 目标参数范围上限,当t≥t_max时,表达式返回该值,该值几可以是一维标量也可以是二维向量,但是如果该值与value1 的维数不同,AE会自动以value1 值为标准进行匹配,该参数为必选参数。

通过下面的例子让我们来了解一下该语句的含义:

linear(time, 0, 5, 0, 360);通过上面的学习,我们应该将这个语句理解为,时间的变化范围是0到5,目标参数的范围是0到360,整个变化过程是线性的。如果将该表达式应用到图层的旋转属性上,那么你会发现图层在前5秒内完成了一周的旋转。

应用该表达式后,图层在第五秒停止旋转,这就是与我们前面介绍的直接手写公式time/5*360最大的区别,插值算法自动在当前参数与目标参数之间采样范围极值。

另外一个区别就是你可以设置不同的插值算法:ease(),ease_in()和ease_out()。这些插值算法与同名的关键帧插值算法(通过关键帧助手菜单设置)的作用相同。利用这些插值算法可以为数值转换计算提供一个更自然的运算过程,从而得到更流畅的变化效果,仅仅使用前面介绍的手写公式是做不到这一点的。

示例: 滚动栏 现在让我们使用这种简单的方法来快速完成一个例子,我们将制作一个滚动栏的动画。首先我们需要建立两个图层,一个文本区域图层和一个滚动栏图层。我们要为文本图层的轴心点加入表达式,因为这样可以保证我们可以操纵图层的位置属性(当图层滚动时位置属性仍然不会改变)。

记住一定要在一个方向上控制轴心点以得到正确的滚动效果,在这个例子中我们将对轴心点做垂直方向的运动以使文本区在合成窗口中上下滚动。为了使滚动的范围最大,也就是文本区域全部实现滚动,我们将轴心点的Y值范围设置为0到图层的高度,也就是我们的目标参数值为:

value1=0;value2=height;

至于当前参数范围,我们将其设置在合成窗口的高度之间,我们需要在顶部与底部空出几行以得到更好的效果。假如合成窗口的尺寸为320×240,那么就将当前参数范围设置在25至215之间,当滚动栏在Y轴上从25运动到215时,文本区将开始滚动。可以设置:

t_min=20

t_max=220

当然,当前参数就是滚动栏的Y轴坐标:t=this_comp.layer("Scroll").position[1]

将几条语句综合起来,加以恰当的变量名称,我们就得到了下面的表达式:

scroll_y=this_comp.layer("Scroll").position[1];

scrolled_amount=linear(scroll_y, 20, 220, 0, height);

最后我们将scrolled_amount的值放到一个二维数组中,让文本图层的轴心点X轴坐标保持不变,最终的表达式为:

scroll_y=this_comp.layer("Scroll").position[1];

scrolled_amount=linear(scroll_y, 20, 220, 0, height);

[anchor_point[0], scrolled_amount];//(只为滚动栏Y轴的位置属性设置关键帧):

如果将该表达式应用到3D图层的旋转属性上,就可以制作出三维滚动旋转效果:

缓存参考对象:相当于临时变量

前面我们已经讲解了如何使用拾取线来建立简单的表达式,有时候你不想也不能通过这种方式来建立表达式。例如,你不可以将拾取线拖动到屏幕中不可见的参数上(图层宽度或者是持续时间等)。

在这种情况下,你就需要建立一个缓存参考对象,这要比使用拾取线复杂的多,因为你需要理解一些Javascript的语法,刚接触到这种方法时也许会感到很困难,一旦我们理解了一些术语后,我们就会感受到建立参考对象的方便之处。

对象:简单的说对象就是一个容器,每一个对象都可以包含其他的对象、属性和方法。

例如,AE中的一个合成就是一类物体,每一个合成中都可以包含有其他的对象,像图层或者诸如持续时间和宽度等属性。AE中的所有元素对于我们来说都是很熟悉的——合成、图层、不透明度等等,他们或者属于对象或者属于对象包含的物体。

因为对象可以包含其他的对象,所以说对象存在层级结构,位于最高层级上面的对象叫做全局对象。

全局对象和非全局对象

要标识需要从中提取数据的属性,必须首先标定一个全局对象。

全局对象在AE的表达式中不需要作出任何的特定说明具有唯一的指向作用,其他的对象均隶属于全局对象。要想指向特定的非全局对象,必须首先在其前面加上所在的全局对象名称。

还没有理解,没关系,我们用街道地址来做一个比喻,如果要邮寄一封信件,仅将收信人地址写成92号的话邮递服务部门就会十分迷茫,因 为在全国可能有数十万个92号的门牌,而你所说的究竟是哪一个呢?所以说你至少要在地址前面加上省份、城市、地区和街道,如果你在海外还需要注明国家,至于国家的上一级就没什么说明的意义了——任何国家均在地球上是人人皆知的,那么国家就是全局对象。

因此,在AE中,在任何制作前你需要建立一个全局对象,就像你需要在信封上面注明收信人所在国家的地址一样。AE中的全局对象包括:

确定了全局对象后,我们就需要设置属于该对象的次级物体、属性或者是方法,但是你又怎么知道你所选择的属性或者是方法什么意思呢? 要查阅AE用户手册中的表达式部分来进行参考设置。

首先你需要明确对象的类型,例如,"this_comp"就会返回合成对象,然后你就可以在参考表格或用户手册中查找该类对象所包含的属性、方法或者是次级物体。所以,设置完全局对象后,我们可以在当前合成中选择一个特殊图层:

this_comp.layer("Solid 1") 该表达式返回当前合成中叫做“solid1”的图层,如果我们仅仅需要一个图层次级对象,那么到此就可以结束了,如果我们还需要该图层的属性或者是事件就需要在该语句后面加上相应的参数。

让我们再来看一下语句的书写方式,javascript语法规定全局对象与次级对象之间必须以点号分割,以说明物体之间的层次关系。

另外,在整条语句中,除了引号中间图层名称之间可以加入空格外,其余地方不允许出现空格。

如果你仍然感到这个语法十分麻烦,那么你还可以使用拾取线来帮助你,在表达式区域使用鼠标选中需要物体的参数参考连接的部分使其高亮显示,然后拖动鼠标到需要建立连接的参数上,AE将自动插入正确的对象参考连接。

除了我们前面列出的属性外,图层还包括下面的属性和方法:

这个表格不是十分详细。可以查阅AE的用户手册. 这里的表格仅仅证实图层的属性可以返回给不同对象, 甚至包括其他合成. 例如你可以建立下面的表达式:

this_comp.layer("Nested Comp").source.layer("Solid 1").position

默认对象——当前图层

图层参考语句看起来十分烦琐,也不便于记忆,AE提供了默认的对象以简化最通用的参考对象:this_layer,如果不设置任何全局对象,AE会自动理解为针对当前图层,并且所有的操作都从当前图层开始。这就是你可以只写"opacity"而不必书写"his_layer.opacity"的原因。

即使你想选择当前合成中的另外的图层, 你也不能写成这种形式‘layer("Layer 1")’ 因为图层不是全局对象–他们是属于合成的次级对象, AE需要知道图层所在的合成. 所以你需要在图层前面加上合成名字:this_comp.layer("Layer 1")

实例应用:在第一部分的最后,我们将使用前面介绍的表达式基础部分的知识来完成一个简单的小例子。我们将重新使用轮胎的例子,使用移动属性来控制图层的旋转属性。

首先,让我们整理一下制作思路,我们要给图层的旋转属性加上表达式,并在表达式的最后以一个常量结束,所以首先要给旋转参数加上一个表达式。

接下来,我们需要给图层的位置属性设置关键帧,以位置属性的变化驱动旋转属性的变化,在我们的例子中,我们仅仅需要轮胎在X 轴上移动,所以我们只需要:position[0]

真实的物理世界告诉我们,当轮胎移动一个周长的距离时,它将完成一个周期(360)的旋转,在开始时我们会为设置计算公式而犯愁,还需要知道,轮胎的尺寸会影响到在一个旋转周期内其移动的距离,所以我们需要了解轮胎的尺寸,图层的宽度。

假如轮胎的尺寸与图层的尺寸相差无几(在轮胎的周围没有空白的区域),我们可以使用图层宽度来描述轮胎的直径:width;

但是我们不能直接使用图层宽度,我们需要使用图层宽度来计算出轮胎的周长,

circumference=width*Math.PI; 如果轮胎的宽度是100个像素,他的周长将会是314个像素,但是如果我们改变图层缩放属性呢,再使用图层的宽度来计算轮胎的周长所得到的结果就不会准确,为了得到更准确的计算结果,我们要利用图层X轴向的缩放属性来控制轮胎的周长:circumference=width*( scale[0]/100)*Math.PI;

我们将图层的X轴缩放属性(scale[0])除以100是因为缩放属性的返回值是百分比,接下来我们就需要定义图层在X轴向移动的变量,在我们的例子中我们要使图层从X轴的零点开始移动,所以我们使用下面的表达式:

distance=position[0];

最后我们写出核心表达式:(distance/circumference)*360;

综合起来,我们需要给旋转属性赋予这样的表达式:circumference=width*( scale[0]/100)*Math.PI;

distance=position[0];

(distance/circumference)*360

这时再观看动画,会看到轮胎的移动与旋转已经非常的自然了,丝毫没有滑动的痕迹,还是那句话我们可以使用手动设置关键帧来实现同样的效果,但是如果图层作加速减速运动时,表达式的优势更是体现的淋漓尽致。

可以将这种方法应用到单独的文字动画中,也可以应用到非正常运动的物体中,得到真实的效果。

AE几何学概述

在表达式基础部分的讲解里,我们涉及到的大部分是一些代数的应用,在AE的表达式中只需要应用简单的代数学知识就可以实现很多效果,但是如果在书写表达式的时候融入几何学知识,那么表达式的高效便捷将体现的更加淋漓尽致。简单的说,几何学就是研究图形的空间关系的自然科学。在接下来的教程中我们将讲解一些基本的几何学公式和关系函数以及几何学在AE表达式中的应用。

这部分教程结构组织得非常严谨,当你完成这部分教程的学习时,你就能基本掌握几何学知识的实际应用,例如建立位移属性与角度属性之间的关系,进而生成和谐的运动状态。

矢量包含有自己的属性,矢量既有大小也有方向。每个数字阵列定义一个矢量,数字阵列就是矢量。

利用表达式制作一个淡入淡出效果,这是一个较常用且简单的效果,但每次都要设置透明度的四个关键帧动画,还要输入数值。如果多个镜头都要使用淡入淡出就会很麻烦,利用Sequence Layers功能也可以,但还是要点几下鼠标,所以不如做一个Presets方便。

首先,为了方便我们不使用关键帧来设置动画,因为这样做的话,每次还要调整关键帧3和4的位置,要知道关键帧记录的是时间轴的位置,而每次使用的素材长度是不同的。所以,我们使用表达式,让程序去找素材的出点。

第一步,我们利用一个linear(t, tMin, tMax, value1, value2)函数把时间轴上素材的出点转化为透明度变量。

为透明度添加表达式如下:

linear(time,outPoint-1,outPoint, 100, 0);//其中“linear”表示线性变化,“time”是时间,“outPoint”是素材的出点,该表达式表示素材的透明度在素材出点前一秒到素材出点从100变化到0,这样就实现了素材的淡出效果。

同样道理,使用:

linear(time,inPoint,inPoint+1, 0, 100);//这一个表达式可以使素材实现淡入效果。

学习Q群227496398

想要学习的童鞋请看图片描述哦.

标签: #ae旋转怎么改变轴心