这回没有案例,比较枯燥,但是我觉得只有知其所以然,才能举一反三。
@ random()
random的返回值为数值或数组,在一定范围内随机取值,且计算时候会将time计算进去,也就是说,返回的随机值会随时间变化。
random后面括号里有三种情况:
1、为空:
random()括号里不填入数值时候,默认返回值为0~1之间。
2、填入一个数值,或数组:
填入的这个数值或数组为最大值,默认最小值为0,如random(80),返回值为0~80之间。
3、填入两个数值或数组:
填入两个数值或数组时候,第一个数值或数组为最小值,第二个数值或数组为最大值,如random(20,80),其返回值为20~80之间。
@ gaussRandom()
所谓高斯随机,官方文档解释为:“结果有一个高斯(钟形)分布。大约 90% 的结果都处于范围 0–1 内,其余 10% 在此范围之外。”
我们可以利用给文字层的Source Text添加表达式来观察返回值:
另外,如图中的小圆球,我们给Position添加表达式
value + gaussRandom(20, 80)
我们发现小球的位置只有x轴发生了变动。这里Position是一个二维数组,而gaussRandom(20, 80)返回的是一个数值,在两个输入数组的维度不匹配时候,将用零填充较短数组的更高维度的值。
如果我们希望小球在x轴和y轴都发生随机位移,除了直接使用wiggle,使用random怎样写表达式?
@ noise(valOrArray)
valOrArray是数值或数组,其返回值是-1~1之间。官方文档解释说:“噪声实际上不是随机的;它基于柏林噪声,这意味着相邻的两个输入值的返回值往往也是相邻的。此类噪声在您需要看似随机且相差不会很大的数值序列时(在对任何明显随机的自然运动进行动画制作时通常就如此)非常有用。”
另外,noise()在计算时候是没有把time计算进去的,也就是说,给noise输入一个值,noise就会返回一个-1到1之间的随机值,并且不会随值时间改变。下面图中的例子,noise(time)的返回值,是在-1和1之间的随机值,为了便于观察在后面乘以了80。
我的理解是,因为相邻的输入值返回值相邻,比如我们输入time这种线性变化的值的时候,每一个输入值都是上一个值的相邻值,所以返回的值会在范围内连续的随机变化。
相比于Math.sin(time)在-1和1之间的有规律的变化,noise(time)提供了一个-1到1之间的随机的连续变化的曲线。
比如官方文档举例的用法:
这个图形的随机旋转是连续的,如果使用random,则是跳跃的:
@ seedRandom
seedRandom(offset, timeless=false)参数类型:offset 是数值,timeless 是布尔值。seedRandom必须和random一起使用。
举例来理解这个表达式。如果我们新建图层后,希望复制这个图层,并且每个复制出来的图层都拥有不同的位置和透明度,怎么做?
给Position添加表达式,让每一层位置发生300左右的偏移:
seedRandom(index, true); value + random([300,300])
给Opacity添加表达式,是每一图层透明度在10%~100%之间随机取值:
seedRandom(index, true);
random(10, 100)
之后command/ctrl + D复制图层,每一图层都会有随机的改变。
timeless的值默认是false,我们可以对 timeless 参数使用 true 以便不使用当前时间作为随机种子的输入。也就是说,将此参数改为true,复制出来的图层不会随着时间重新取随机值,相当于将返回的随机值固定下来。
请登录以参与评论
现在登录