在www.motionscript.com上有一个用标记点来触发动作的高级表达式:
action = comp(name).layer("action");//使用时唯一需要编辑的一行, 这行寻找预合成下名为“action”的层,也是放图层标记点的那层,其名称根据自己需要更改 n = 0;//重新定义图层标记数的初始值。 if (marker.numKeys > 0){ //检查图层上是否有标记。 n = marker.nearestKey(time).index; // 如果有标记,将重新定义n为标记索引。 if (marker.key(n).time > time){ n--; } } if (n == 0){ 0 //如果没有检测到任何标记,将时间重映射设置为0 。 }else{ m = marker.key(n); myComment = m.comment; t = time - m.time; try{ actMarker = action.marker.key(myComment); if (action.marker.numKeys > actMarker.index){ tMax = action.marker.key(actMarker.index + 1).time - actMarker.time; }else{ tMax = action.outPoint - actMarker.time; } t = Math.min(t, tMax); actMarker.time + t; //检测到标记注释匹配,则更改时间重映射。 }catch (err){ 0 //catch以抑制错误,如果标记不匹配,则将时间重映射设置为0 。 } }
这个表达式能够控制预合层中数个图层的动画。使用方法为:
1、新建一个空白对象(或者一个空的形状层),将其命名为“action”,或者其他自己定义的名字,如果改了这个层的名字,就需要更改表达式第一行;
2、在第一帧打上标记点,其comment写入希望作为基础层的图层名称。(当有很多层的时候,究竟以那一层的时间作为预合层时间重映射的基准,在这里指定)(ps,因为是图层名称,可以使用汉字)
上图的例子中,作为承载图层标记的空白对象其名称为“星变”,需要将表达式第一行改为:
action = comp(name).layer("星变");
第一帧打上标记点并注释为“星星”,表示在“星星”和“多边形”两个形状层中,是以“星星”作为时间重映射的基准的。
3、各个图层上已经打上了数组关键帧,控制数个动作,一组关键帧一个动作,从开始到结束一般有两个关键帧。在需要控制的地方也就是动作开始的关键帧位置打上标记点,一般以动作的名称来命名,如“变三角”(可使用汉字)。
4、将所有图层,包含打上标记点的空白层,全部预合层。勾选预合层的时间重映射Enable Time Remapping,并给时间重映射添加表达式:
action = comp(name).layer("action"); n = 0; if (marker.numKeys > 0){ n = marker.nearestKey(time).index; if (marker.key(n).time > time){ n--; } } if (n == 0){ 0 }else{ m = marker.key(n); myComment = m.comment; t = time - m.time; try{ actMarker = action.marker.key(myComment); if (action.marker.numKeys > actMarker.index){ tMax = action.marker.key(actMarker.index + 1).time - actMarker.time; }else{ tMax = action.outPoint - actMarker.time; } t = Math.min(t, tMax); actMarker.time + t; }catch (err){ 0 } }
修改第一行承载标记点的层的名称。
5、在预合层上打标记点,标记点注释为动作的名称,当注释名匹配时候,就会有相应的动作。可以非常灵活的控制,比如重复打标记点以重复动作,拖动标记点以变化动作的发生时间,切动作的顺序也能随意变化不再局限于形状层上的关键帧。
如上面例子中,给图层添加了“变三角”、“变六角”、“变圆”的动作,在预合层上,用标记点就可以随意控制这三个动作发生的时间、顺序等。
在motionscript.com上,作者解释了这个表达式的工作原理,感兴趣可以研究:
这个表达式里使用了camp(name),顺便小结一下(以下内容来自于Adobe官方帮助文档):
全局对象、属性和方法(表达式引用)
comp(name) 返回类型:合成。参数类型:name 是一个字符串。按照名称检索其他合成。
footage(name) 返回类型:素材。参数类型:name 是一个字符串。按照名称检索素材项目。
thisComp 返回类型:合成。表示包含表达式的合成。
thisLayer 返回类型:图层、光照或摄像机。表示包含表达式的图层。因为 thisLayer 是默认对象,所以其使用是可选的。例如,以 thisLayer.width 或 width 开头的表达式将生成相同的结果。
thisProperty 返回类型:属性。表示包含表达式的属性。例如,如果您对旋转属性编写表达式,则可使用以 thisProperty 开头的表达式来引用旋转属性。
time返回类型:数值。表示以秒为单位的合成时间,将以此计算表达式。
colorDepth 返回类型:数值。返回项目颜色深度值。例如,当每个通道的项目颜色深度为 16 位时,colorDepth 返回 16。
posterizeTime(framesPerSecond) 返回类型:数值。参数类型:framesPerSecond 是数值。framesPerSecond 值成为其余表达式运行的帧速率。此表达式允许您将属性的帧速率设置为低于合成的速率。例如,以下表达式每秒使用随机值更新一次属性值: posterizeTime(1); random()
value 返回类型:数值、数组或字符串。表示当前时间包含表达式的属性的值。
看完这个,马上去补一补trt和catch的意思。
好难呀这个~~~