签到

05月10日
尚未签到

共有回帖数 0

    孤单的狼

    等级:
    下面是这个表达式的效果动画:



    上图是这个小球的运动轨迹,下面我们来解答一下这个表达式。
    首先,这个表达式形成了一个从左至右震荡前进的动作(Math.PI是JS的一个属性得出的结果就是趋近于3.1415的一个数值,π就是上学时都学过的圆周率),thisComp.height/2,thisComp是调取当前合成,height就是合成的高度,这句的意思是调取合成的高度并除以2,加上这句的意思是让Y轴的位置位于合成的中间。Y做的几次乘法,在这里我就不过多解释了,根据英文的意思大家应该可以看懂,最简单的方法就是将表达式粘贴到AE中,自己试验一下。
    对于表达式,我们还可以给X轴添加从左至右移动的关键帧,Y轴运用表达式驱动,同样可以达到相同的效果。
    表达式如下:

    veloc = 170; //平行移动加速度 (40像素/秒)
    amp = 48; //正弦曲线振幅(像素)
    freq = 4.8;//震荡次数/秒
    y = amp*time*Math.sin(freq*time*2*Math.PI);
    position + [0,y]
    注意这里我们去掉了驱动X轴运动的 x = veloc * time,增加了一句 position + [0,y] ,意思就是用物体本身的位置加上表达式计算出来的位置。
    下面我们在来说说弧度,JS的三角函数的单位是弧度,不是度。这样,一个完整的震荡周期就是π值的两倍。所以,如果希望我们的频率是每秒一个完整的振幅(我们上面的例子里面也乘以2了)我们就需要将π值乘以2,后面大家会大量看到我们“2*Math.PI”。
    我们再看一个例子,如果我们希望刚才的动画改为震动向上移动,我们看看表达式是如何写的:

    veloc = 170; //平行移动加速度 (40像素/秒)
    amp = 48; //正弦曲线振幅(像素)
    freq = 4.8;//震荡次数/秒
    x = time*veloc;
    y = amp*time*Math.sin(freq*time*2*Math.PI - 1) /2+ thisComp.height/2;
    [x,y]




    这里我们做了一点点小的调整,首先我们让Math.sin()函数减1,这样我们得到的曲线就从-1 至 1,变成了-2 至 0。然后我们有除以2,这样这个范围就变成了-1 至 0。为什么要是-1 至 0呢?我们不是要向上的运动吗?因为AE向上是在负Y轴的方向。
    好,下面我们再做一些调整,让这个运动的振幅恒定,不要随着时间震动增大。

    veloc = 180; //平行移动加速度 (180 像素/秒)
    amp =48; //正弦曲线振幅(像素)
    freq = 4.8; //震荡次数/秒
    rise = 20; // 正弦曲线向上移动的速度 (像素/秒)
    x = time*veloc;
    y = amp*Math.sin(freq*time*2*Math.PI) - rise*time + .6*thisComp.height;
    [x,y]




    咱们在看看这样的运动是如何达成的,首先我们新增了一个“rise”参数,这个rise定义了我们正弦曲线向上移动的速度。Rise乘以time用来计算Y轴的移动。Math.sin()这个参数没有乘以时间,所以我们的移动没有随着时间而变化。最后.6*thisComp.height可以让位移运动在合适的位置。
    下面,我们再看一种变化,我们让物体随着从左至右移动的同时频率逐渐增加。
    veloc = 180; //平行移动加速度 (180 像素/秒)
    amp = 32; //正弦曲线振幅(像素)
    freq = 1; //震荡次数/秒
    x = time*veloc;
    y = amp*Math.sin(freq*time*time*2*Math.PI) + thisComp.height/2;
    [x,y]




    达到这种效果是因为我们在Math.sin()这个函数中写了两次“time”,大家可以自己在AE中实验一下。

    我们最后再看一种比较有用的变化,如果我们将两个正弦曲线相乘,我们会得到什么结果呢?如果其中一个波浪的频率比另一个小一点,我们下面的是freq1小于freq2,这样我们会的得到一个忽快忽慢的运动,我们看看下面的表达式。

    veloc = 170; //平行移动加速度 (170 像素/秒)
    amp = 32; //正弦曲线振幅(像素)
    freq1 = 0.5; //震荡次数/秒
    freq2 = 7.0;
    x = time*veloc;
    wave1 = Math.sin(freq1*time*2*Math.PI);
    wave2 = Math.sin(freq2*time*2*Math.PI)
    y = amp*wave1*wave2 + thisComp.height/2;
    [x,y]




    好了,本次我给大家演示了几种sin()和cos()的用法,在后面的课程中我们还会大量用到这两个函数,工程文件大家可以点击链接下载,今天的内容相对复杂很多了,希望大家可以自己上机试一下,你会觉得非常有意思的,

    楼主 2015-12-02 13:43 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知