目录

矢量加法

距离与长度

三角函数

图象:正弦、余弦与正切

圆周函数

简谐运动

频率与振幅

波形加法与乘法

反函数

其他材料

表达式基础

参考表格

工程文件连接

返回主页

波长、频率与振幅

任何波形的运动(例如简谐运动)都可以用两个基本的特征来描述:波长与振幅。波长是指震动的速度,振幅是指震动的幅度。

具体的说,波长就是相临的波峰之间的距离,振幅就是从波的基线到波峰之间的高度(或者说是波峰波谷之间的高度的一半)。

波的频率是另外一种描述波速的方式,它的值等于波长的相反数(频率=1/波长)。频率不是测量相临波峰之间的间隔,频率是用来描述在给定时间间隔内(通常是一秒)波峰的数量。

在Javascript中,我们可以通过给特定值(自变量)乘以某个系数来增加波形的频率。这就将使这些特定值快速的变大,进而增加最终的频率。例如,函数Math.sin(time*6)的波形频率就是函数Math.sin(time)的波形频率的六倍,因为输入值增加到原来的六倍。

可以给三角函数值乘以一个系数来增加波形的振幅,例如,函数5*Math.sin(time)的波形振幅就是函数Math.sin(time)的波形振幅的五倍,前一个波形振幅范围是-5至5,后一个是-1至1。

amplitude*Math.sin(angle*frequency)

波形的振幅或频率在波形的变化过程中不一定要保持连续,例如,我们可以使用一个划块来控制系数的变化,调整频率或振幅随着波形的变化而做出非连续的变化。下面的图例中表示出了控制波形频率与振幅的差别:

顺便说一句,上面的波形变化就是AM波段与FM波段最本质的区别:一个是调节振幅另一个是调节频率。

示例:弹簧运动衰减

在前面的例子中我们利用简谐运动模拟出了弹簧的运动——非真实的运动,因为他们的运动不能像真实世界中的弹簧那样进行运动衰减。在了解了振幅与频率之后让我们重新来设置一下弹簧的运动以达到更加真实的效果。

原始的表达式和动画如下所示:

x=Math.sin(time*3)*60;
rest=position;
add(rest, [x,0]);

我们的目的是让弹簧的运动慢慢减慢直到停止运动,这就意味着我们需要在动画的过程中将振幅的值逐渐衰减到零。在原始的表达式中我们将振幅(60)与频率(3)设置为常量,所以在动画的过程中,其频率与振幅保持不变。要达到我们的要求,需要将这些值设置为变量:

frequency=3;
amplitude=60;
x=Math.sin(time*frequency)*amplitude;
rest=position;
add(rest, [x,0]);

现在,我们降低波形的频率,但是这样会导致运动结果不真实。弹簧的运动会慢慢减速,但是最终弹簧不会停止下来,而是运动的周期非常的长,就像是在稠稠的蜜糖中运动一样,因为其振幅始终不为零。这样,我们就要来降低振幅以达到减速停止运动的目的,最终的运动变化图象如下图所示:

那么我们怎样来定义振幅变量以使其随着时间慢慢减小呢,一种方法是利用时间书写一个简单的方程式来控制振幅变化,例如"amplitude=60/time.", 但是这种方法比我们实际需要的变化要快得多, 而且当时间为零时会产生错误,因为零不能做分母。 我们将采用另外一种简单高效的方法得到更好的效果——liner()函数插值函数

amplitude=linear(time, 0, out_point-1, 120, 0);

随着时间从零变化到图层出点的前一秒,振幅将从120变化到0,我们将使用一个较大振幅值(120)以表现出运动的力量,同时将频率值增大以加强运动的节奏。

frequency=10;
amplitude=linear(time, 0, out_point-1, 120, 0);
rest=position;
x=Math.sin(time*frequency)*amplitude;
add(rest, [x,0]);

最终的结果将比以前的运动更加真实:

还有一点遗憾的是,这种方法模拟的运动还有一点点的失真,因为我们需要准确的计算出弹簧到达极限时蕴涵的弹性势能并将这个能量值按照能量的转换定律传递给后面的每一帧画面,但是表达式不会预测到下一帧或上一帧,所以模拟这种运动十分困难,在早期版本的AE中的Motion Math可以实现这种效果,甚至还包括两个简单的弹簧脚本("spring.mm" and "dbspring.mm"位于AE应用程序的文件夹中),用这个脚本来模拟弹簧运动可以达到非常真实的效果。

单击这里 下载工程文件 (Windows 用户单击这里)

所有内容版权归JJ Gifford.所有,翻译权归CG频道所有,违者必纠。