可以用marker.nearestKey(time)访问标记点的index、time和comment等参数;用marker.key(n)访问相应index值的标记点,比如marker.key(1)访问的是第一个标记点,marker.key(2)访问的是第二个标记点。
我们一步步来。
我们首先来写一个控制淡出的表达式,这类表达式用linear来写。新建形状层,给Opacity写入表达式:
t = time; linear(t, 0, 1, value, 0)
这个表达式是让对象在1秒内从现有的透明度变为0 。
我们再引入一个表达式framesToTime(frames, fps = 1.0 / thisComp.frameDuration),这个表达式是将帧数转变为时间值,如framesToTime(10),是将10帧转变为当前合成帧率下10帧的时间,如果当前合成是24fps,那么framesToTime(10)其返回值就是10/24。这个表达式方便进行帧数级别的控制,比用时间值进行控制方便得多。
那么,我们的表达式可以改进为:
t = time; fadeFrames = 10; linear(t, 0, framesToTime(fadeFrames), value, 0)
旧话重提,写表达式一定要方便调试,这里引入变量fadeFrames,并写在前面几行,当fadeFrames等于10时候,这个表达式让对象在10帧内,从现有透明度变为0 。
接下来,我们给图层打上标记点,用标记点来控制淡出:
t = time - marker.key(1).time; fadeFrames = 10; linear(t, 0, framesToTime(fadeFrames), value, 0)
既然现在是用time作为“引擎”来驱动linear让Opacity淡出,那么,time反过来,就能控制淡入,所以表达式写成:
t = marker.key(1).time - time; fadeFrames = 10; linear(t, 0, framesToTime(fadeFrames), value, 0)
上面两个表达式是用时间线上第一个标记点来控制,且只能一次控制淡入或淡出,那么,能否再打上一个标记点,让第一个标记点控制淡入,第二个标记点控制淡出?
fadeFrames = 10; m = marker.nearestKey(time).index; if(m == 1){ t = marker.key(m).time - time;} else if(m == 2){ t = time - marker.key(m).time;} linear(t, 0, framesToTime(fadeFrames), value, 0)
“=”是赋值操作符。
“==”是判断值是否相等操作符。
所以上面表达式在写条件判断时候,要使用“==” 。
当我们这个图层上只有两个标记点的时候,这样写就没有问题,第一个标记点是淡入,第二个标记点是淡出。但是,如果我们的图层上有其他标记点,比如我们还有其他标记点控制其他参数,这时候就需要饮用标记点的comment来进行判断。
给图层打上两个标记点,控制淡入的标记点其comment写入“In”,控制淡出的标记点其comment写入“Out”,给Opacity写入表达式:
fadeFrames = 10; m = marker.nearestKey(time).index; tag = marker.key(m).comment; if (tag == "In"){ t = marker.key(m).time - time;} else if(tag == "Out"){ t = time - marker.key(m).time;} linear(t, 0, framesToTime(fadeFrames), value, 0)
这个表达式还有一个小问题,就是当图层上面没有标记点时候就会报错,所以我们再加一个判断if(marker.numKeys > 0),就是当标记点数量大于0的时候,才进行淡入淡出的判断,否则输出value,相当于不做任何变化。
fadeFrames = 10; if(marker.numKeys > 0){ m = marker.nearestKey(time).index; tag = marker.key(m).comment; if (tag == "In"){ t = marker.key(m).time - time;} else if(tag == "Out"){ t = time - marker.key(m).time;} linear(t, 0, framesToTime(fadeFrames), value, 0) }else{ value; }
这个表达式已经可以使用并且不会报错。
我在youtube上看到一位youtuber写的这个表达式,首行还有另外两个赋值:在首行添加“m = 0;”设置初始的层标记数量(一开始是0个标记点0)。添加“t = time;”代表将稍后重新定义时间。
fadeFrames = 10; m = 0;t = time; if(marker.numKeys > 0){ m = marker.nearestKey(time).index; tag = marker.key(m).comment; if (tag == "In"){ t = marker.key(m).time - time;} else if(tag == "Out"){ t = time - marker.key(m).time;} linear(t, 0, framesToTime(fadeFrames), value, 0) }else{ value; }
再看一个简单例子,给Opacity添加表达式:
if(marker.numKeys > 0){ m1 = marker.key("Start").time; m2 = marker.key("End").time; linear(time, m1, m2, 0, 100); }else{ value }
这个表达式的作用,是控制淡入的起点和终点。
也就是从“Start”标记点开始淡入,Opacity(透明度)开始从0%往100%变化,到“End”标记点结束淡入。
请登录以参与评论
现在登录