TERM x SFT 联动系列教程(一) AE基础表达式补全(一) |
您所在的位置:网站首页 › ae表达式是基于哪种语言 › TERM x SFT 联动系列教程(一) AE基础表达式补全(一) |
大家好,我是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 |