我们想要实现一个什么样的效果?
1、文字在y轴方向随机跳跃
2、随机的单个文字放大
那么,要实现这种观念效果需要怎样做?
1、文字在y轴方向随机跳跃
文字的随机跳跃,我们依然用“可能性随机”表达式:
- probability = 4;
- r = Math.round(random(-probability+2,1));
- v = clamp(r,0,1);
- wiggle(10,400*v)
但是这里Position是一个阵列,直接给Position加上上面这个表达式,会在x轴和y轴两个方向随机跳跃。怎样只在y轴跳跃?
两种方法。
方法一:
将上面加在Position上的表达式改一下:
- probability = 4;
- r = Math.round(random(-probability+2,1));
- v = clamp(r,0,1);
- s = wiggle(10,400*v) ;
- x = value[0];
- y = s[1];
- [x,y]
因为Position是一个阵列,也就是说不是单独的一个数字,而是两个数字[x,y],这里s = wiggle(10,400*v)返回值也只会是一个阵列[x,y](s是一个单独的字母,但是这里必须把它看成两个数字的阵列,可以理解成一个拥有x值和y值的封装包)。
AE中以0、1、2分别代表阵列中第一、第二、第三个值,这里位置阵列中[0]代表的就是x轴,[1]代表的就是y轴。我们这里只想要s = wiggle(10,400*v)返回值[x,y]中的y值,也就是要将这个阵列中的y值提取出来,表达式里这个值可以写为 s[1] 。
在这个例子里,可以在表达式编辑里用Position[0]来提取没有经过表达式运算的原本的x轴的值,不过在AE里,原本的值一般会用value来表示,更加通用一些,所以这里提取原本的x轴的值,可以写作: value[0] (同样的,value[1]代表的是没经过其他表达式运算的原本的y轴的值)
那么,这里要实现x轴不动(本案例中未加关键帧,x轴是固定的),也就是x不参与“可能性随机”表达式的运算,y轴随机运动,后面应该加上的语句是:
- [value[0],s[1]]
为了整齐美观写成:
- x = value[0];
- y = s[1];
- [x,y]
方法二:
右键Position,选择Separate Dimensions,会把Position分成两个参数:X Positon 和 Y Position 。
然后在Y Position上加上“可能性随机”表达式。
2、单个文字随机放大
这样直接添加之后,改变scale的值,会所有文字一起放大缩小,所以接下来在选择范围这里,选取单独的文字。
默认的单位是Percentage百分比选择,也就是以文本长度的百分比作为单位,比如start为0%,end为50%时候,选择的就是文本前面50%的文字。
这里要选取单个文字,将单位改成Index,以单个的文字(字母)为单位。
比如这里:四个字“飞向电影”,每一个字是一个单位。
start为0,表示从最开始的位置开始选择;
end为1,表示往后选择1个单位就结束,如果end为2,那就是往后选择两个单位,选择的范围就变成“飞向”两个字。
offset是偏移,值为1,表示往后偏移一个单位,本例中就会选择成为“向”;值为2,偏移两个单位,选择“电”,依次类推。
有offset参数,要随机选择单独文字就很简单了,就是让这个偏移值随机,也就是添加一个wiggle就可以了。比如可以直接在后面添加wiggle(4,2)。
在这里,向安宇希望随机放大效果不是从“飞”开始的,而是从这段位子中间开始的。这里有4个文字,那么我会选择offset的振幅(括号里第一值为频率,第二个值为振幅)是文字长度除以2,也就是2。
本例是可以直接添加2,但是表达式的好处就是方便修改。比如:如果我把文字改成一句8个字的话,就需要重新打开表达式编辑,并找到这一行的这个数字,把2改成4 。这样无疑是复杂的,不方便的。所以我需要让offset自动偏移到中心点,方法很简单,就是用text.sourceText.length找到这一个文字层的阵列长度,然后除以2 。
- n = text.sourceText.length/2;
- wiggle(4,n)
这里向安宇发现wiggle的值是有小数点的,个人觉得效果太平滑, 就再添加了一个取整的函数(顺便加一个变量美化一下):
- t = text.sourceText;
- n = t.length/2;
- value = Math.round(wiggle(3,n))
现在实现了随机选择单独的文字,并且这个文字层可以随意改动文字(可以复制文字层,添加不同文字),还需要添加scale下的表达式。
注意这里要改的不是文字层的scale,而是上面我们添加的Animate下Scale效果选项中的Scale。这里依然是添加“可能性随机”表达式。但是添加后发现,Scale是一个阵列,所以会随机在x轴方向放大和随机在y轴方向放大,我们希望的是x轴和y轴同步放大,所以把阵列中的第一个值提取出来,让x轴和y轴方向的放大都是用同一个数值,在后面添加输出结果的语句:
- probability = 4;
- r = Math.round(random(-probability+2,1));
- v = clamp(r,0,1);
- x = wiggle(10,100*v);
- [x[0],x[0]]
也可以这样写:
- probability = 4;
- r = Math.round(random(-probability+2,1));
- v = clamp(r,0,1);
- s = wiggle(10,100*v);
- x = s[0];
- [x,x]
后面一种写法多加了一个变量,其实没有必要,这么写是为了思路可以表达更清楚:因为scale是一个阵列,添加wiggle之后,会是两个不同的随机值,可能是[100,50],也可能是[33,54]。我们要做的就是把这两个值中的一个提取出来,x = s[0], 同一个值重复,组成新的阵列。比如把[33,54]中的33提取出来(阵列中第一个数字用[0]表示),组成[33,33]。这里可以提前阵列中的第一个数值,也可提取第二个数值,s[0]可以是s[1],都不影响。
最终效果达成。
这种文本效果在很多恐怖片的包装里大量应用,是比较常见的一种文本效果。
请登录以参与评论
现在登录