valueAtTime(t)
返回类型:数值或数组。
参数类型:t 是数值。
返回属性在指定时间(以秒为单位)的值。
例如,要从一组(四个)值中随机选择每个帧的属性值,请在 0、1、2 和 3 秒将您的四个值设为关键帧,然后将以下表达式应用于该属性:
valueAtTime(random(4))
注意:
Dan Ebberts 在其 MotionScript 网站上提供了使用 valueAtTime 和 velocityAtTime 方法的更多示例和技术。
我在AE表达式|06、如何做一个Q弹的圆球?@ speed @toFixed(n) @valueAtTime里提到过利用valueAtTime来实现延迟。
我们一般会建立一个“引导层”,然后command/ctrl + D ,通过duplicate(复制)出其他一定数量的层,让其他层继承“引导层”的运动,但是有一定延迟,达到“重影”的效果。
本文来说说Dan Ebberts 的几个案例,看一看ValueAtTime几种延迟效果:
一、 位置延迟
1、新建图层,给Position(位置)和Rotation(旋转)key帧
2、给Position添加表达式:
delay = 8; //需要延迟的帧数 d = delay*thisComp.frameDuration*(index - 1); thisComp.layer(1).position.valueAtTime(time - d)
frameDuration 指的是每帧的时间,thisComp.frameDuration 指的是这个合成里每帧的时间。
比如这个案例,为25fps ,那么thisComp.frameDuration每帧时间就是60 / 25 = 0.24 ;
index是引用的索引数,之前提到过。第一层,index - 1 = 0 ;那么d = 0 ,也就是第一层不会因为这个表达式发生改变,这个层作为“引导层”,是最前面的一个层。
这个案例里delay设置成 8 ,也就是第二层(index - 1 = 1)的位置取的是“引导层”8秒前位置的数值。第三层(index - 1 = 2)的位置取的是引导层 8 * 2 = 16秒前的位置。
另外,valueAtTime的括号中只能设定time的值,不能直接设置帧数,所以我们利用frameDuration将帧数换算成时间值。
3、复制图层,效果如下:
三、 旋转延迟
仅给Rotation(旋转)key帧,然后给rotation写表达式:
delay = 8; d = delay*thisComp.frameDuration*(index - 1); transform.rotation.valueAtTime(time - d)
三、 透明度延迟
给Opacity添加表达式:
opacityFactor = .75; Math.pow(opacityFactor,index - 1)*100
这里用到了函数Math.pow(value, exponent)。value为基数,exponent为指数,其返回值是value的exponent次幂。
四、 时间延迟
那么,如果“引导层”,也就是第一层给旋转、位置、透明度等等都key帧了,用上面的办法给每一个属性值添加相应的表达式,可以让所有duplicate出来的层延迟出现,那么,有没有方法一个表达式搞定,而不是每个属性值都要添加表达式?
有。首先要将引导层预合成(shift + command + C),然后右键,选择enable time remapping
给Time Remap 添加表达式:
delay = 3; //number of frames to delay d = delay*thisComp.frameDuration*(index - 1); time - d
这里我建立了一个小长方形,给Position、Rotation、Opacity打了关键帧,并且添加了Tint效果,并key帧,得到如下效果:
Good!