TERM x SFT 联动系列教程(一) AE基础表达式补全(一)

您所在的位置:网站首页 ae表达式是基于哪种语言 TERM x SFT 联动系列教程(一) AE基础表达式补全(一)

TERM x SFT 联动系列教程(一) AE基础表达式补全(一)

2024-07-10 04:56| 来源: 网络整理| 查看: 265

大家好,我是Phinkself。  

作为一个菜的要死的萌新,很高兴和大家分享一些我对于AE表达式的理解和经验。

本文需要一定的AE基础。

什么是AE表达式

AE表达式的语言是基于JavaScript,如果学过该语言,使用表达式会轻松很多。  

AE表达式是直接与源代码对话的一种语言

在我的理解里,AE表达式是通过你设定的条件,计算出的值。其中你设定的条件就是AE表达式。

案例如下

在上图中,蓝线和红线标记处即为“值”,可以通过表达式(即条件)对其进行改变

在上图中,Source Text(源文本)的表达式为“text.sourceText”,此为文字串“Phinkself_”的源表达式(源条件)。而当我用橡皮筋(拉索工具)将Soure Txet与Rotation(旋转)绑定时,则会发生如下的变化。

在上图中,可以很清晰的看到,Source Text中的表达式由“text.sourceText”→“transform.rotation”

而字符串“Phinkself_”→“0”

如上图所示,都是AE表达式是通过你设定的条件,计算出的值,进而影响你的画面的表现。

为了理解方便,目前接触的表达式可以分为两种:

1. 是输入简单参数,但不与其他属性建立联系

如:

Wiggle(*,*)【振动表达式】

2. 是涉及多语句,与其他属性建立联系的

如:

freq = 3;decay = 5;

n = 0;if (numKeys > 0){  n = nearestKey(time).index;  if (key(n).time > time) n--;}if (n > 0){  t = time - key(n).time;  amp = velocityAtTime(key(n).time - .001);  w = freq*Math.PI*2;  value + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);}else  value

该段表达式解析将写在后文

理解AE表达式

层级关系

如上图所示

一个工程中,全局包含了不同的合成(合成1、合成2、合成3)

而在每个合成中,又包含了不同的图层(图层1、图层2、图层3)

在每个图层中,也包含了不同的属性(Property1....)  

而表达式同样是通过上述的层级关系进行运作的

如:

上图为编写过程

由图可见,本段表达式“thisComp.layer("Phinkself_").transform.position.value”

并未报错,说明是符合编写规则的。

而正如上述的层级关系,“thisComp.layer("Phinkself_").transform.position.value”中

thisComp表示本合成(即合成1)

layer(“Phinkself”)表示文字层Phinkself_

transform表示文字层的变换

position表示变换中的位置属性

value即是值;

故根据层级关系,该段表达式“thisComp.layer("Phinkself_").transform.position.value”=文字层Phinkself_的位置值。

故可以得到如下的效果

文字显示随位置变化

AE基础表达式

Wiggle

格式:Wiggle(freq,amp)

Wiggle(20,10)

time

它返回的是时间线上对应的时间

time表示时间,以秒为单位,time*n =时间(秒数)*n

time*10

这里我将time同样用在Source Text上,产生了不断变化的时间

index

为每间隔多少数值来产生多少变化

运用:如果将第一个图层旋转输入index*1,则当你不断复制第一个图层时,该图层会不断旋转1°

index的运用loopOut表达式

运用:

loopOut(type=”类型”,numkeyframes=0)对一组动作进行循环

loopOut(type=”pingpong”,numkeyframes=0)是类似像乒乓球一样的来回循环;

loopOut(type=”cycle”,numkeyframes=0)是周而复始的循环;

loopOut(type=”continue”)延续属性变化的最后速度,

loopOut(type=”offset”,numkeyframes=0)是重复指定的时间段进行循环;

numkeyframes=0是循环的次数,0为无限循环,1是最后两个关键帧无限循环,2是最后三个关键帧无限循环,

....(写太多没人看了)

更多基础表达式参考:https://www.zcool.com.cn/article/ZMTE3MDM2OA==.html

AE表达式控制器介绍

上图所示为AE表达式控制器

Angle Control(角度控制)

案例如下:

CheckBox Control

表达真&假,True&False

首先我在方块不透明度上编写一段模板函数

 if(){

 }else{

 }

该段表达的含义是,如果(条件)则(发生什么)

 

然后我在效果控件中添加一个CheckBox Control

然后在Scale(缩放)中输入表达式:

if(effect("Checkbox Control")("Checkbox")==true)[50,50]else[100,100]

根据上述的编写规则,该段表达式表达的意思是,当checkbox control表现为True时,缩放的数值为(50,50),反之,则为(100,100)

演示过程如下图所示

当我打开checkbox control时,此时checkbox control显示为True,因此方块的缩放数值由(100,100)→(50,50)

Color control

顾名思义,颜色的控制器。

新建一个颜色

在效果控件添加一个Color control

将正方形的填充打开表达式输入,然后用套索工具连接Color Control,从而实现对颜色的控制。

Layer Control

使用:让图层的效果与 图层控制效果 中指定的图层一致。

新建一个纯色层和一个文字层

在文字层中添加Layer Control和高斯模糊

在高斯模糊的模糊度中打上表达式,用套索工具连接Layer control,复制文字层一次,在此时,当你拉动文字层1的模糊度时,你会发现文字层2的模糊度也同步变化。

演示过程如下图所示:

Point Control

控制位置的一个控制器。

新建一个文字层“Phinkself_”,在其中添加Point Control。

演示过程如下:

AE表达式应用——做一个三维卡片人

演示过程如下所示:

操作过程:

首先在空对象中添加一个Slide Control(滑块控制),然后在卡片人图层中,对位置输入如下表达式,“thisComp.layer("2.png").transform.position.value+[0,0,index]”

之后在index之后用套索工具连接Slider Control,AE将自动生成如下表达式

“thisComp.layer("2.png").transform.position.value+[0,0,index*thisComp.layer("Null 2").effect("Slider Control")("Slider")]”

复制卡片人图层n层,就会得到伪3维的如下效果。

进阶表达式运用(一)——弹性表达式

本节是对上文弹性表达式的分解,分析

本节的目的旨在能理解弹性表达式的意思,并能后续自行编写弹性表达式

freq = 3;decay = 5;

n = 0;if (numKeys > 0){ n = nearestKey(time).index; if (key(n).time > time) n--;}if (n > 0){ t = time - key(n).time; amp = velocityAtTime(key(n).time - .001); w = freq*Math.PI*2; value + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);}else value

首先,我们通过每行代码来进行解析

第一行第二行为变量的定义,分别是频率和衰变指数。

第三行,n=0;

n用来记录关键帧序号,是一个很重要的变量

第四行,if (numKeys > 0);

意思是判断关键帧数量是否大于零,如果大于,则进行大括号后的内容:

{ n = nearestKey(time).index; if (key(n).time > time) n--;}

第五行,n = nearestKey(time).index;

取靠近时间线的那一个关键帧序号

需要注意的是,这里选取的关键帧序号可能是时间线的前一个,也可能是时间线的后一个。因此,我们需要下一行的表达式进行判定关键帧序号

第六行, if (key(n).time > time) n--;

如果取得的关键帧是时间线的后一个,则n的序号减一,这样获得的关键帧序号永远是时间线的前一个。

第八行,if (n > 0){}

当存在关键帧时,则进行{}内的内容

重点在下面的内容!

t = time - key(n).time;

此处的t,等于时间线与其之前最后一个关键帧的时间的差

amp = velocityAtTime(key(n).time - .001);

知识扩展:velocityAtTime()所求的是某一时刻对象的速度

在AE中,该速度被称为关键帧速率(像素/秒),为物体相对于你屏幕的瞬时速度

 

w = freq*Math.PI*2; value + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);

在amp*(Math.sin(t*w/Math.exp(decay*t)/w)中

因为正弦运动的幅值是恒定的,因此我们需要t*w来对其进行处理,使其显得自然。

因为t,等于时间线与其之前最后一个关键帧的时间的差

→所以,t是随着时间的变化不断增大的,值越大,导致频率越来越快故t在Math.sin()中,是作为频率的补充而存在的

而在Math.exp()中,t作为阻力系数存在,当时间越长,阻力越大,物体慢慢趋于平静。

由于篇幅过长!!

所以表达式基础补全会分多期写完,本期主要从表达式的基础来进行教学

在往后的分享教学中,将会从本期所分享的基础进行延伸,来进行表达式的基础补全

最后谢谢大家的耐心阅读!

我们下期再见!

以上就是本期的经验分享,感谢Term的信任!!!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3