AEJoy —— 表达式之速度和频率控制(一)【JS】

1,014 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

效果图

用关键帧的滑块控件控制旋转速度的失败尝试 00.gif

前言

这似乎很简单。假设您已经根据全局属性 timerotate 属性创建了一个表达式,它将生成一个非常平滑的旋转。而且已经添加了一个名为 spd 的变量来设置旋转速度。以下是表达式的样子,设置为 360 度每秒(旋转一圈):

spd = 360;
value + time*spd

到目前为止还不错——它能按照预期工作(如果您想知道表达式的 value 用法,请参阅引用部分)。现在你决定想要能够控制旋转速度。你的想法是将变量 spd 连接到滑块控件并为滑块值打上关键帧。

这是表达式的新版本:

spd = effect("Slider Control")("Slider");
value + time*spd

关键帧让滑块从 0 移动到 360 度,保持 360 度,然后回到 0 。但是有些事情发生了可怕的错误。不是像期待的那样逐渐加速,接着保持稳定,然后再减速,而是旋转以一个相当恒定的速度开始,在中间减速,然后实际上在结束时后退(参见上方动图)。这显然不是你想要的。这是怎么回事?

最后一行代码是,在表达式的世界中,控制速度或频率不是一件简单的任务。看起来应该是这样,但事实并非如此。好消息是,有办法解决这些问题。在本文中,我将介绍表达式速度和频率控制所涉及的问题,然后提出一些实际的解决方案。

value 的值:对于本文中的许多表达式,生成表达式结果的行都以 “value +” 开头。在表达式语言中,value 表示属性的表达式先前值(没有表达式的静态值或关键帧值)。通过以 value + 开始生成结果的代码,表达式的计算结果被简单地添加到属性的表达式先前值。这让您可以轻松地设置属性的初始值,或将表达式的动画添加到关键帧动画中。

除了 value ,您还可以使用属性本身的名称(例如, transform.rotation)。但我更喜欢 value ,因为它使表达式更易于从一个属性移植到另一个属性。