签到

05月06日
尚未签到

共有回帖数 10

    长街旧港00

    等级:


    今天准备抽点时间来讲一下表达式,百度了一下,表达式方面的教程比较少,视频教程有琳达的和frak的,不过都是国外的,有中文字幕。国内的视频教程有罡渡晨星的,不过要给钱才能看,我没有给,所以我不知道他讲得怎么样。至于那两个国外的教程,我觉得讲得不错,Frank的讲得比较深入,而琳达的讲得比较全一些,不过还是有一些许地方没有涉及到,文字方面的教程往往比较支离破碎,言此失彼,不够系统。所以我决定开一个帖子作一些抛砖引玉性质的讲解,可能会比较长,也许词不达意,难免有错误,希望吧友不吝海涵。
    在正式接入正题之前,先了解一些基本的问题。
    一、表达式能干什么?
    答:表达式并不能帮你做出华丽的特效,但是可以让一些看起来比较麻烦的事情变得比较轻松,比如说你想做两个圆球的动画,并且保证两个圆球的大小无论如何变化,它们的面积之和始终是一个定值。或者一个球在做不规则移动的时候,它的周长刚好是它运动路程的三分之一。


    二、表达式难学不?
    答:在学之前,我也有这样的疑问,但学完之后,我才发现我完全多虑了。


    三、表达式需要掌握哪些知识?
    答:1、英语。英语好一点,你可以更明白你在做的是什么事情。
    2、数学,主要是函数、几何方面的东西。它能告诉你怎样达到你所要的结果。
    3、JAVA编程基础。你只需要懂一点点基础就可以,不必像程序员一样,这有助于你写出更规范的东西,减少出错的可能。
    4、AE基础知识。这能够让你的表达式发挥得淋漓尽致。
    下面说一些基本的问题
    一、怎样添加表达式?
    答:按ALT SHIFT 和等号键,也可以直接接ALT再点码表,如果你喜欢,你也可以在菜单的动画列表下找到它。如果你要临时禁用它,请点击=图标
    二、写表达式要注意什么?
    1、表达式是区分大小写的,比如:LOVE和LOVe,会被认为是两个东西。
    2、写之前,确认你用的是英文输入法,比如一些中文标点,是不被认可的。
    3、尽量写英文,这样会让你的表达式和脚本更好地兼容,同时也 更美观,更重要的是,这样逼格更高一些。
    4、表达式是忽略空格和换行的,当然你也可以用空格和换行,这样会更方便你阅读。
    5、表达式写完一句话,末尾用分号隔开,否则会被认为后面的内容是接着前面写的。


    如果,你在里面输入time,结果会是怎样?
    在第1秒的时候,不透明度是1;
    第2秒,不透明度是2;
    第3秒,不透明度是3……
    这样,一个动画就生成了
    但,这也许不是你想要的,你可能想要的是:
    前三秒,透明度是50%,第三至第五秒,透明度变至100%,当然,你可以用关键帧。不过我要讲的是,表达式,这只是为了便于你理解。
    你可以这样输入:
    clamp(time*25-25,50,100)
    time*25是什么意思呢?意是是,第1秒,透明度是25,第2秒,透明度是50,也就是每秒钟增加25的意思。
    然后来看clamp,这个命令的作用就是起到一个限制作用,格式是:clamp(a,b,c)意思是:无论a怎样变化,限制a的值始终介于b和c之间。
    除此之外,你也有别的选择,比如说:
    linear(time,3,5,50,100)
    这也是可以的,linear是一个线性映射函数,意是是:当时间从3秒运动到5秒的时候,值从50运动到100。
    格式是linear(a,b,c,d,e),意思是:当 a从b变化到c的时候,整个式子的值从d运动到e。
    下面来看一个例子,这里我们要学习的是length命令

    图上有一个方形和一个圆形,当圆靠近方时,方就逆针转圈,当两者远离时,方就顺针转圈。这是怎么做到的呢?来看表达式:
    对方形的旋转添加表达式:
    length(thisComp.layer("circle").transform.position,position)
    这个式子的意思是:
    方形的旋转度数=两个图形之间的距离
    length的格式为:length(a,b),这样,得到的结果就是两点之间的距离,再把这个距离赋予旋转角度就可以了。

    接下来讲一下valueAtTime命令,这是一个定时函数,常常用来做跟随运动,后面会提到一些更复杂的用法。先来看一个图例,如果我在方形后面写一个表达式:
    thisComp.layer("circle").transform.position
    这样的话,圆圈的位置就会完全沿用方形的位置,所以二者重合,如图。也就是说二者似乎是粘在了一起。
    如果接着在后面加上一个定时函数,变成
    thisComp.layer("circle").transform.position.valueAtTime(time-0.5)
    这时候 你就会发现,当圆做运动的时候,方形就像个跟屁虫一样跟在后面。如下图

    valueAtTime(time-0.5)是什么意思呢?类同楼上,方形仍然取圆形的位置做自己的位置,只不过延迟了0.5秒。也就是说,方形取圆形0.5秒之前的值
    再说一下数组的问题,其实在前面就该说了。
    比如:
    a=[10,20,30],假定这是一个三维坐标。
    如果你想取a的第二个坐标的值,20,你应该怎样写?
    答案:
    a[1]
    数组是从0开始计数的,也就是说,
    a[0],表示10。
    a[1],表示20
    ……
    再如:
    position[1],这就表示位置的纵坐标。
    下面来说一下曲线方程的问题:

    假设你想让上图的方形转着圆转圈,如果你直接旋转,结果是下面这样的:

    如果:你不想让矩形改变朝向,只是位置在转圈,而不调头,怎么办?


    对方形的位置添加式子:
    a=time*Math.PI;
    x=effect("Slider Control")("Slider")*Math.cos(a);
    y=effect("Slider Control")("Slider")*Math.sin(a);
    [thisComp.layer("circle").transform.position[0]+x,thisComp.layer("circle").transform.position[1]+y]


    我先来解释一下式子的内容,内容比较多:
    Math.PI实际上就是数学的派(原谅楼主打不来希腊字母),由于三角函数默认是弧度制。
    第一行实际上就是建一个角度变量a,使其为时间*派,也就是说,两秒钟转一圈(2PI)(我只是举例)
    这里的半径R我使用了一个表达式控件代替,方便调节旋转半径:

    上面的式子看似复杂,实际上结构就是如下:
    a=time*b
    x=a*cos e
    y=a*sin e
    [x+f,y+g]
    只不过在表达式里,sin要写成Math.sin,cos要写成Math.cos,原理在22楼已经讲了。
    当然,另一种办法就是做一个空对象绕圆转,再把方形的位置链接到空对象上。这似乎更简捷,我只是讲方法。
    变量你可以随便取名字,比如:
    小明=3;
    曾哥=4;
    灰太狼=5;
    只要不使用它定义好的名字就可以。这样子,小明和3的意思是一样的。
    比如说time表示时间,你就不能把变量参数写成
    time=5

    楼主 2015-07-02 09:30 回复

    猴歌

    等级:
    • 荣誉:

    有误导性,ae的脚本语言是javascript 不是java,同学们不要搞错了,这是两个完全不一样的语言!学java对ae没有多大帮助!

    7楼 2016-07-14 01:09 回复

共有回帖数 10
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知