我们想要做的是创造一个能像通用时钟一样工作的表达式。它应该能够显示小时、分钟、秒和毫秒。我们希望能够轻松地设置开始时间、计数速度、计数是向上还是向下,以及显示多少毫秒的数字。如果时钟时间小于零,就能显示一个负号(“-”),这也很好。表达式应该是易于编辑的,这样,例如,如果我们不希望显示小时数,就可以很容易地更改代码。
最合理的方法是为文本层的源文本(Source Text)属性开发一个表达式。在这个表达式中,我们将计算表示时钟当前时间的不同组件(小时、分钟、秒和毫秒)。在表达式的开头,我们将定义两个变量,
rate
和
clockStart
。rate 是我们的时钟计数速度与真实时间或合成时间相比的乘数。所以如果我们想让它以与挂钟有相同的 rate 计数,我们只需将它设为 1 。由于 rate 是乘数,如果我们把它的值设为负数,时钟就会倒数。
变量
clockStart
将表示我们的时钟的开始时间。因为 After Effects 中的时间值总是表示为秒,也是我们在本例中所使用的单位。否则,如果我们将
clockStart
定义为一个像 "00:00:00:00.000" 这样的字符串,无论如何,我们都必须编写代码将其转换为秒。
对于每一个小时、分钟和秒组件,我们将通过一个函数(我们将其称为
padZero()
)运行它们,该函数将将值转换为字符串,并在必要时添加一个前导零(leading zero)。这样我们就会得到一个每个组件都两位数的字符串。我们将以稍微不同的方式处理毫秒,利用内置的
JavaScript
函数
toFixed()
,该函数用于将一个数字转换为具有固定位数的字符串。
最后,我们将设置表达式,以便最后一行是所有部件组装到最终输出字符串的地方。例如,只需从该行中删除小时组件,就可以很容易地从输出中删除它。
表达式代码
rate = -2;
clockStart = 3604.999;
function padZero(n) {
return (n < 10 ? "0" : "") + n;
clockTime = clockStart + rate * (time - inPoint);
if (clockTime < 0) {
sign = "-";
clockTime = -clockTime;
} else {
sign = "";
t = Math.floor(clockTime);
hr = Math.floor(t / 3600);
min = Math.floor((t % 3600) / 60);
sec = Math.floor(t % 60);
ms = clockTime.toFixed(3).substr(-3);
sign + padZero(hr) + ":" + padZero(min) + ":" + padZero(sec) + "." + ms
ShaderJoy
首席 BUG 制造科学家+资深负优化专家+高级代码 CV 工程师 @美图网科技有限公司
粉丝