服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

关于AE表达式Wiggle(摆动)的理解与应用

日期: 来源:兆日UCD收集编辑:曾能鼎

引言

使用过AE(After Effects)软件的同学,或多或少都了解过表达式这一概念,表达式其实就是一段代码,属于编程范畴,这对于我们设计师而言有一定的门槛,但幸运的是表达式不需要我们会编程才能使用,我们只需要了解一点表达式基础知识便可以简单使用它,稍微复杂点的表达式,我们也只需要学会复制粘贴即可,有时候根据需要修改几个参数,甚至目前也有非常多的表达式集合插件可以下载使用,只需要点点鼠标便能生成表达式,可以说非常方便。然而,对于大多数设计师来说,我们习惯于过多依赖插件,这样固然是能提高工作效率,但带来不好的一面是我们对于表达式的理解不够深入,仅仅是知道怎么使用某个特定的插件,做不到灵活使用表达式,使得我们的思维局限在工具的使用上面,这对于我们的能力提升是不利的,鉴于此,我想重新针对于表达式做个全面深入的理解学习,那么就从常见的表达式入手,一个个地去解剖它们,以便真正地理解并能够灵活运用它们。如果你有一定的表达式基础,那么可以继续阅读下面的文章,如果没有,那么你可以先去了解学习一下表达式基础知识,这是AE官方帮助文档里面关于表达式基础知识的部分(https://helpx.adobe.com/cn/after-effects/using/expression-basics.html)。

如果你学习过表达式的话,那么我相信大家最常见的表达式是wiggle、time、index、value、loopOut、linear等,今天我们就从wiggle的学习开始。


在AE里面,给一个新建固态图层的旋转属性添加表达式,然后使用表达式菜单找到wiggle表达式,我们会发wiggle表达式是这样的:

wiggle(freq, amp, octaves = 1, amp_mult = .5, t = time)。

下面这张图是Adobe官方文档里面对于wiggle的定义:

第一次看官方的解释的时候,有些解释不是很好理解,后面查看了其他教程后才渐渐有了些许的理解,但是直到目前为止,还不能说对于wiggle有了足够的理解,看起来一个简单的表达式,实际上并不简单,下面是我个人对于wiggle的理解,如果不妥之处,敬请指教,谢谢。


freq:全称frequency,就是频率,在这个表达式里也叫做振频。

我们都知道,频率越大,变化越快,也就是节奏越快。很多人在教程里面解释说这个参数是每秒变化的次数,比如wiggle(1,30)就是每秒变化1次。但我经过验证并不是的那样,在一秒时间内,wiggle(1,30)数值变化了很多次。


表达式wiggle(1,30)图表

频率的实际定义是单位时间内完成周期性变化的次数,官方的解释也是每秒摆动的频率,摆动其实就是一个周期性变化,对照上面的表达式里面数值变化的曲线图,我们可以直观地看到,1秒时间内,数值是在不断变化的,只是做了一个周期性的变化,而且也不是精确的,大概就是一个周期。在AE表达式wiggle里面,freq没有默认值,必须传入一个参数(数值)。


amp:全称amplitude,就是振幅。

振幅越大单位时间数值变化范围越大,从上面的表达式wiggle(1,30)图表中我们可以看到,旋转数值的变化范围始终都位于(-30~30)之间,因为该属性的初始值为0,如果初始值为10,那么变化范围为(-20~40)。amp也没有默认值必须传入一个参数(数值)。


我们初学者一般接触到的最多的也就是使用上面的两个参数,例如wiggle(1,30),只传入了前两个参数(freq和amp),简单的动画使用上面两个参数基本都能满足效果了。后面三个参数属于进阶的,相对比较复杂和难以理解,一般都是默认值(ae自带函数写入带“=”表示默认值,可以不输入数值),有兴趣的可以继续深入研究,这里只做个简单解读。最后一个参数t比较有意思,我们可以利用它来做表达式的循环效果,文章后面会详细解析,先埋个伏笔。


octaves:在基波上增加谐波的量。

即在基础波形上叠加另一个波形。默认值为1、有效值为0~10的整数。为了便于大家理解,这里引用了知乎@饺子的关于基波和谐波的图。

amp_mult:谐波被放大的量,作为放大器使用。
默认数值为0.5,一般使用默认值就可以了,如果要改变该参数,上面的octaves参数必须大于1,因为当octaves小于等于1时,则该参数传入多少都不会产生变化。


t:时间采样。

默认值是time,就是随着时间变化,持续返回对应时间点的数值,如果传入的是个固定的数值,则持续返回这个数值对应的采样时间下的结果,比如输入t=5的话,那么就会一直返回第5秒的数值,这个结果就会一直不变,也就不会产生摆动效果了。


下面这张动图演示了wiggle前面四个参数变化的效果。

理解了wiggle表达式的5个参数,就能更好地理解和应用该表达式,参考知乎@饺子的解释,wiggle(1, 2, 3, 4, 5)的解释就是:返回一个振频为1,振幅为2的,基波在增加了3个单位谐波后,谐波被放大4个单位时,第5秒的数值或数组。


为什么上面表达式返回的是数值或数组呢,这是因为wiggle是根据它所作用的属性返回对应类型的数据。比如,在旋转属性上使用wiggle,返回的是一维的数值,即返回旋转了多少度;在2d图层的位置属性使用wiggle,则返回二维数组[x,y],即返回二维坐标,如果是3d图层的位置属性,那返回的是三维数组[x,y,z],即是三维坐标。




Wiggle和random都是随机产生某些数值的表达式,但是它们有很多的不一样的地方。
Wiggle(1,30)
random(1,30)

从上面两张图的变化图表可以看出,它们的随机变化的不同,wiggle的变化相比random产生的效果要平滑很多,还有一个就是random只会产生一个数值,而wiggle可以产生数组,例如可以直接在位置属性上输入wiggle(1,30),如果直接输入random(1,30)的话软件会报错,正确的做法是输入[random(1,30), random(1,30)]。


在实际操作过程中,我们发现wiggle的初始值很奇怪,只要在同一个合成里面新增一个图层,那么之前添加的wiggle表达式的值就会发生变化,如下图:

我们知道wiggle表达式产生的数值是随机的,而这些随机是根据默认的随机种子来决定的。而默认随机种子跟图层索引号(index)相关的,也就是图层所在的顺序。因此wiggle的基波数值是受到图层序号影响的,改变图层顺序后,摆动的初始值和随机值都会改变,但有没有办法不让它们改变呢,答案是肯定的,如果wiggle产生的效果不想受制于图层顺序,可以在wiggle表达式之前加上seedRandom(seed,timeless),相当于给一个固定的随机种子,限制摆动的随机性,这样就可以随意调整图层顺序了。seedRandom(seed,timeless)的两个参数可以只输入第一个,也就是种子数,第二个参数默认为0,可以不写,例如在表达式编辑框里面输入seedRandom(5);wiggle(1,30)就能让摆动的效果不受图层顺序影响。该表达式这里不做过多分析,有兴趣可以自行研究。




一、wiggle的简单运用

wiggle常见的简单运用小案例一般是直接在位置、旋转、透明度这几个属性上添加表达式,例如:运用于位置属性上产生的位置晃动效果;运用于3d图层的旋转属性上的模拟翅膀摆动效果;运用于透明度属性上的闪光效果。关于缩放属性的使用,一般不是简单添加wiggle表达式,因为宽高的变化不是等比例的,效果会比较奇怪,下面文章会针对该属性的运用进一步解析。     


二、如何单独控制wiggle的不同方向效果?

如上图,在缩放属性上直接添加wiggle表达式之后,我们会发现,他的宽和高两个维度上的缩放比例是不同比的,这就导致看起来很奇怪,一般都无法满足我们的需求,要想使wiggle的不同维度的数值一样,也就是同比例缩放,有2种方法:

1、使用数组索引,实现等比缩放

在表达式编辑框内输入x=wiggle(1,30); [x[0],x[0]];就能实现同比缩放,输入x=wiggle(1,30);[x[1],x[1]]也是同样的效果,但不能是x=wiggle(1,30);[x[0],x[1]],因为这样返回的两个数值也是不同的,还记得上面我们说到的wiggle返回的是数值或数组吗,wiggle缩放属性返回的数组就包括x 轴和y轴的不同值: 

当然也可以换其他写法,只要能符合表达式的规范,编写正确都是可以的,例如还可以这样写:x=wiggle(1,30)[0];[x,x]; 这就是表达式的灵活之处。

2、使用滑块控制缩放

其实原理跟上面的差不多,把缩放的属性值链接到滑块上,再给滑块添加表达式wiggle(1,30),这样滑块返回的值就是一维的。

上面Wiggle表达式使用了数组索引的方法实现了wiggle不同维度数值的拆分,让拆分出来的数值保持一致就能实现同比例变化。既然能单独控制拆分的数值变化,那么肯定也能只让一个维度的数值产生变化,这又能产生什么效果呢?

比如我们想要在一个轴向上随机摆动的物体,甚至是指定方向或角度上摆动的物体,又或者在一个方向上随机缩放的物体等。下面用两个案例来展示一下:

案例a:指定方向上的摆动小球

小球水平摆动的表达式:

x=wiggle(1,1000);

y=wiggle(1,0);

[x[0],y[0]];

小球45度方向摆动的表达式:

x=wiggle(1,1000);

y=wiggle(1,1000);

[x[0],y[0]];

沿着x轴(y轴)运动只需要让y轴(x轴)摆动的两个参数,频率或振幅其中一个为0就行,也就是只让一个轴向生效。在其他方向上,要让小球在某一条线上摆动,必须得让他们两个轴向上的摆动频率一致,摆动数组的索引号也要一致,然后调整振幅来控制想要的角度(根据勾股定理)。

案例b:音频频谱摆动

第一部分先做一个柱子的动画:

1、新建形状图层,调整宽、高尺寸,本案例里面的宽是100,高是400,然后把图层变换的锚点调整到形状的底部,这样在高度上缩放的基准就是形状底部了。

2、新建一个空对象图层,分别添加两个滑块表达式用来控制摆动的频率和振幅,方便后面调试动画效果,然后在柱子1的缩放属性上添加如下表达式:

freq=thisComp.layer("空 5").effect("freq")("滑块");

amp=thisComp.layer("空 5").effect("amp")("滑块");

s=wiggle(freq,amp);

[value[0],s[1]]

freq和amp分别链接到空对象的控制滑块上,这样一个柱子的摆动效果就完成了。

第二部分重复多个柱子的动画:

3、接下来是复制形状图层(mac电脑按command+D),形成多个柱子的效果,这一步可以直接复制柱子1图层,然后手动摆放其他图层,但是有更便捷的方法,是使用表达式index来自动调整后面复制出来的图层的位置。在柱子1的位置属性上输入表达式:

value+[200*(index-1),0] 

这个表达式的意思就是在柱子1的基础上,每复制一个图层,原先的图层便会往右边移动200个像素,这里的value表示图层的初始位置,index表示图层的索引号,这个索引号会根据图层数量变化的,例如柱子1的索引号在没复制其他图层之前是2,每复制一个图层,柱子1的索引号就会增加1,复制8个图层后,柱子1的图层索引号就变成9了,此时柱子1的位置为value+[200*8,0],也就是往右边移动了1600个像素。

最后可以调整空对象图层上的滑块数值,来达到你想要的效果,只要调整一次,所有的形状图层就会同时生效,因为所有图层都绑定了同一个滑块控制,这就是表达式的便捷之处。


三、如何控制摆动效果的作用时间?

有3种方法来实现对wiggle效果的时间控制:

1、第一种方法是断开图层,然后调整图层的起始点,这样就能控制表达式生效的时间范围。如下图,在2~3秒时间内图层动画是没有摆动效果的,这里注意要添加seedRandom来保证两个图层的wiggle效果初始值和随机值是一样的,这样效果会顺滑一点,否则前后图层会出现闪跳。

反之,如果想要摆动动画只会在2~3秒的时间内生效的话,复制图层然后断开图层,删除掉表达式,这样前后的图层就不会摆动了,只有2~3秒的时间内是会摆动的,如下图所示。

2、第二种方法可以使用滑块控制,给滑块打关键帧。如下图,把wiggle表达式的两个参数分别链接到滑块控制表达式上面,然后通过给滑块打关键帧,让关键帧在2~3秒的时间内是非0,其他时间都是0就可以控制摆动在2~3秒内有效了。因为我们知道wiggle的频率或振幅这两个参数为0的时候是没有效果的。

3、第三种方法可以使用纯表达式来控制时间,在表达式编辑框内输入:

var w= wiggle(1,30);
if(2<time&&time<3)
      w;
else 0;
这段表达式的意思就是:
定义一个变量w等于wiggle(1,30)
如果时间“大于2秒”和“小于3秒”
则返回w的值
否则就返回0
这样可以控制动画在2~3秒持续时间段内生效,其余时间不生效:

反之,在表达式编辑框内输入:

var w=wiggle(1,30);

if(time<2)

      w;

else if(3<time)

      w;

else 0;


四、Wiggle能做循环动画吗?

Wiggle本身返回的就是随机数值或数组,其不确定性就是它的特征,那么有没有办法针对wiggle表达式做循环动画呢,答案是肯定的,只是其表达式对初学者稍微复杂了点,理解起来不太容易,下面的一段表达式就是wiggle的循环表达式:

frequency = 1;

amplitude = 40;

secondsToLoop = 3;

t = time % secondsToLoop;

wiggle1 = wiggle(frequency, amplitude, 1, 0.5, t);

wiggle2 = wiggle(frequency, amplitude, 1, 0.5, t - secondsToLoop);

linear(t, 0, secondsToLoop, wiggle1, wiggle2)

上面的表达式里面,前面三个都好理解,就是定义频率、振幅和循环周期,第四行是动画能真正循环起来的时间采样,其实就是利用取余数不断地返回一组循环的时间值,比如上面的t=time%3,为了便于大家理解,这里就简化成取余数的整数吧,就是随着时间从0开始变化,第0秒、1秒、2秒、3秒、4秒、5秒、6秒,t分别返回0、1、2、0、1、2、0 ,这样就能在时间轴上不断采样这些时间,形成一个3秒循环一次的循环动画了。

比较难理解的是后面的三行表达式,为了让大家更好的理解它们是怎么运行的,我分别做了三个小球,并在一个固态层上添加3个写入效果,用来展示三个小球的运动轨迹。如下图:

上图的红色小球是完整的循环过程,蓝色小球是复制红色小球后偏移位置,然后修改表达式,绿色小球是直接复制蓝色小球然后修改表达式,这里面为了直观展示运动轨迹,在表达式前面都加了seedRandom(1),就是文章上面参数解析部分所讲的,这样就能保证随机种子一样,动画初始值和随机值就不会受图层顺序的影响,不理解的可以回过头去看看这部分内容。

我们单独把小球运动的动图拿出来看,可以直观地看到,蓝色小球和绿色小球的运动轨迹存在着微妙的联系,细心的朋友应该能看得出来,这两个小球的首尾位置分别是重合的,也就是说它们的运动轨迹合并的话是能形成一个闭环的。这两个小球的表达式的不同之处在于wiggle的最后一个参数t和t-loopTime,它们正好相差了一个循环周期。

而红色小球的表达式结合了蓝色小球和绿色小球的表达式,再利用一个插值表达式linear(t,0,loopTime,x,y)来形成一个完整的循环动画。把红色小球的初始位置跟蓝色小球对齐后,他们的运动轨迹如下图,可以看到,红色小球一直处于蓝色小球和绿色小球的位置连线上,这就是linear(t,0,loopTime,x,y)表达式的作用,在循环周期内,持续返回蓝绿两个小球位置的线性插值。

以上便是我个人关于wiggle表达式的理解与一些常见的应用案例,上面的案例中实现方法肯定不止我列举的这些,有其他更合理和高效的方法,欢迎留言,在理解上有不同见解也欢迎指正。不可否认,表达式确实存在巨大的优势,能完成我们手动关键帧难以实现的动画,而且实现的方式具有多样性,可以根据自己的实际情况灵活运用,触类旁通然后做到举一反三。虽然表达式看起来复杂了点,对于没学过编程的初学者不太友好,但是它相对于其他编程语言,表达式还是比较容易上手的,不要害怕,我相信只要你开始学习它,就会被它的巨大魅力所折服,然后吸引你不断去探索。


相关阅读

  • 点击收获活蹦乱跳新春小兔!

  • 兔年快乐! 感谢读者朋友在过去一年中对新闻坊的喜爱与支持,RUC新闻坊在此送出300张订制小兔红包封面。 兔子的视野宽阔,双眼有如两颗超广角镜头。兔耳可以转动,分辨来自各个方向
  • 一例犬蛋白尿的病例报告

  • 投稿作者:李新玲点击阅读作者更多临床文献摘要一只贵宾犬,8岁,雄性已绝育,因近期排尿感觉有泡沫过来就诊。检查有蛋白尿,经过治疗控制稳定。关键词:蛋白尿,UPC,慢性肾病1.基本信息一
  • 专家孙晓光:审证求因,揪出隐匿的糖尿病肾病

  • 近些年,随着人们生活条件越来越好,一些中老年“富贵病”找上门来。其中,糖尿病、高尿酸血症等代谢性疾病较为常见,不加以及时治疗,不仅会导致病情加重,还会损伤肾脏。“由糖尿病引
  • 小球大世界丨2023年2月8日-12日寒假活动预告

  • 223寒假活动预告2023年2月8日-12日寒假期间,小球大世界主题展教区为小伙伴们准备了丰富的主题活动,为你的假期“涨知识”,快来北京科学中心“小球大世界”一起体验科学的魅力吧
  • 小球大世界丨2023年2月1日-5日寒假活动预告

  • 223寒假活动预告2023年2月1日-5日寒假期间,小球大世界主题展教区为小伙伴们准备了丰富的主题活动,为你的假期“涨知识”,快来北京科学中心“小球大世界”一起体验科学的魅力吧!

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 关于AE表达式Wiggle(摆动)的理解与应用

  • 引言使用过AE(After Effects)软件的同学,或多或少都了解过表达式这一概念,表达式其实就是一段代码,属于编程范畴,这对于我们设计师而言有一定的门槛,但幸运的是表达式不需要我们会
  • 【兴证海外医药】美国Biopharma成长启示录

  • 点击上方“公众号”可订阅哦!近期,我们发布了《美国Biopharma成长启示录》深度报告,欢迎阅读^^联系人:邹文凯17621880725/孙媛媛/黄翰漾/张忆东自媒体信息披露与重要声明注:文报
  • 【兴证医药】2022-2023年重点行业报告合集

  • 点击上方“公众号”可订阅哦!癸卯兔年已经到来,兴证医药团队整理了2022年重点行业报告,欢迎阅读,恭祝各位投资人新春快乐,万事如意!【兴证医药】PD-(L)1未来增长引擎:辅助与新辅助
  • 上周私募基金分化明显,权益类普涨,CTA受挫

  • ▷是新朋友吗?记得先点关注「探普学堂」上周A股各大宽基指数全线上涨,其中中证1000领涨3.48%,科创50上涨3.25%,创业板指上涨3.21%,深证成指上涨3.19%,沪深300上涨2.82%,上证指数上
  • 【兴证医药】一图读懂2022Q4公募基金医药持仓

  • 点击上方“公众号”可订阅哦!联系人:王佳慧18801298007/黄翰漾/孙媛媛自媒体信息披露与重要声明使用本研究报告的风险提示及法律声明 兴业证券股份有限公司经中国证券监督
  • 【兴证医药】社会招聘及实习生招聘启事

  • 团队简介兴业证券医药团队是一支历史悠久,持续传承的团队,共6次获得权威评选最佳分析师第一名。我们希望寻求志同道合的你一起加入我们的大家庭,通过深度研究,共同去寻找和陪伴