AEJoy —— 表达式之无缝循环摆/扭动【JS】

439 阅读2分钟

效果图

通过一点数学技巧,我们可以让 wiggle() 无缝循环

ue45.gif

白色物体的循环路径是通过混合蓝色和红色物体的路径创建的

ue46.gif

想法

毫无疑问,wiggle() 是为项目添加随机性的一种非常方便和通用的工具。有时候,如果能够让摆动运动循环起来,那将是非常有用的。在这里,我们将通过使用一些巧妙的数学运算和利用一个很少使用的 wiggle() 参数来实现这一点。

设计

假设我们想要创建一个三秒的摆动循环。可视化一个图表,显示我们的图层从时间 0 到 3 秒随机移动的路径。如果你看上方第二幅动图,你会看到蓝点描绘出的路径。它从左下角开始,三秒钟后在右边缘的中间附近结束。然后重复。

现在检查红点所描绘的路径。注意,它从右边缘附近开始,但在左下角结束-正是蓝点开始的地方。这听起来很巧合,对吧? 这里有一个小技巧这是让这一切顺利的关键。事实证明,红点和蓝点实际上是在追踪同一条随机的摆动路径。关键在于红点追踪的是时间零点之前的三秒路径。

让我们好好想想。红点正在追踪从 -3 秒到 0 秒之间的路径。蓝点在追踪 0 到 +3 秒之间发生的部分。我们可以通过使用很少使用的 wiggle() 的第五个参数 —— 负 time 来访问 wiggle() 的这些负时间值。这个参数的工作方式非常类似于 valueAtTime() 方法,您可以使用 valueAtTime() 方法在任何给定时间检索属性值。无论指定什么时间,都可以得到在那个时间发生的 wiggle() 值。通过为时间设置一个负值,我们可以让一个层描绘出时间 0 之前路径的一部分。

很好,但这对我们有什么帮助呢? 好了,我们现在要做的就是把路径的两个部分混合在一起,这样我们的图层就从蓝点开始的地方开始,但是在红点结束的地方结束(这恰好把它放回了它开始的地方,从而创建了一个循环)。这就是白点无缝循环是如何创建的。使用非常有用的 linear() 插值方法,可以很容易地实现路径的混合。

表达式代码

freq = 1;
amp = 110;
loopTime = 3;
t = time % loopTime;
wiggle1 = wiggle(freq, amp, 1, 0.5, t);
wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);
linear(t, 0,  loopTime, wiggle1, wiggle2)