2016-08-03 20:47:27

你所不知道的AE技巧-表达式篇

基本上,AE用户的进阶都是从表达式开始的.它语法简单(纯JavaScript),全局的变量与方法很少,便于学习.然而,JavaScript一直是一个易学难精的语言,即使是ES3标准(对,你没看错,Adobe用的就是1999年的ES3)的AE表达式,也是有很多初学者难以发现的技巧的

用ESTK对表达式进行调试

此方法对Mac不适用,会造成AE崩溃

打开盘卷:Users\对应用户\AppData\Roaming\Adobe\After Effects\AE对应的版本号路径的Adobe After Effects 12.0 Prefs文件,修改EnableExpressionsDebuggingAtYourOwnRisk的值为"1",接着在表达式中使用$.writeln(),并打开ESTK的控制台,就可以进行对表达式的简单调试了.

一旦能够拿到表达式的中间值,测试复杂表达式就会变得十分方便了,特别是对文字层表达式选择器的加持非常大.

更改全局函数中时间参数的单位

AE表达式提供了几种时间转换的函数,例如timeToFrames,然而,它们做的不仅仅是时间转换,还把脚本环境的时间单位给改变了.

一些以时间为参数的变量,都可以用数值+单位来描述,它们在ESTK中被称为unit类型.timeToFrames的转换,会同时将单位改变,这个改变是全局的,也就是说,任何其他参数有时间的方法,都必须相应地根据单位修改时间,比如inear(t, tMin, tMax, value1, value2)中前三个参数

获得图层的像素

表达式拥有直接访问图层像素的权限.这和插件的权限一致,相对应的,脚本完全没有这种权限.有很多AE工具都是利用了表达式的这种权限

Layer.sampleImage(point, radius = [.5, .5], postEffect=true, t=time)函数,能够直接在表达式中获得指定点的像素.

  • point
    • 获得像素的点
  • radius
    • 获得像素的范围,默认[.5,.5]为一个像素,可以扩大来获得更大范围的平均像素值
  • postEffect
    • 计算像素时是否考虑遮罩与插件
  • t
    • 时间线上的时间

利用表达式选择器崩掉AE

文字层表达式选择器有一点好,那就是能获得单个文字的任一属性并进行设置.它有很多特别的属性.

一旦表达式选择器中的表达式变得过大,AE将直接崩溃,而不是普通的JavaScript引擎崩溃

跨合成的锁链拾取

常见的振荡表达式的数学实质

市面上最常见的AE表达式就是振荡表达式了,其实质是很简单的,但是加了很多Slider来控制后,就会变得看起来很复杂.只要明白其基础只是简单的sin(x)/e^x,任何振荡表达式都是纸老虎

让文字层通过表达式显示外部文件中的文字

AE表达式环境与AI和PS的JavaScript命名空间类似,一旦计算完毕后,整个空间就被丢弃.同时相比脚本,表达式中只能访问到基础类型,类似File等完全无法得到.但是,由Adobe提供的$对象,如PS和AI一般,可以在这种命名空间中访问到

$.evalFile()的参数是路径字符串,作用是运行JavaScript文件.这符合不使用File等扩展类型这一条件,因此,可以在任一文件中输入如下语句

var str=["firstline","secondline"];

再在某个文字层的sourceText中输入如下表达式

$.evalFile("path/to/file");
str[0];

就会显示firstline了.

之后,就可以只更改外部文件中的值,来修改AE工程中的文字层了

这是其中一种套模板的方法

直接对数组进行算术运算

表达式命名空间还有一点好,它自动重载了数组的操作符,使得数组之间可以直接通过+-*/进行运算,例如

[50,100]/2 // 输出[25,50]

本文链接:https://smallpath.me/post/ae-skill-expression

-- EOF --