either运用AE表达式建立震撼特效2010-01-19 20:07许多常用的合成软件都具有表达式的功能,用来实现一些特殊的效果。大名鼎鼎的Aftereffects当然也不例外,Aftereffects提供基于JavaScript的优秀表达式工具和函数,使许多平时难以想象的效果的制作有了可能。有人也许会认为使用表达式会因为不熟悉脚本语言和JavaScript而受到威胁,其实完全没有必要。不得不承认,对于那些完全没有编程基础的合成师而言,使用表达式可能会有一些困难,但是其实难度并不是太大的,而且在你用表达式完成了一个以往无法完成的效果时,成功的满足感会让你对AE和它的表达式充满兴趣。下面我们就将通过制作一个复杂而有趣的效果向大家解释AE表达式的使用过程和一般思路。
首先让我们看看我们将要完成的是个什么样的效果。今天我们将要制作的是一股文字形成的“流”,就是说成千上万内容颜色各异的文字汇合成一股流,并且我们将可以通过一系列的控制杆控制整个“流”的形状,里面的文字的大小,路径,颜色,以及各项参数的随机程度。其实实用粒子系统可以制作类似的效果,但是,如果你需要你的粒子系统受某个路径的控制,这就比较困难了。例如,如果我们要这个流最终形成一个心形,这种效果AE以及大部分合成软件的粒子系统就有些力不从心了。当然,使用3D软件,例如3Dmax我们也可以完成这样的效果,但是也就意味着我们在把3D元素和合成的视频组合的时候可能遇到更加严重的困难。
好了,鉴于AE的粒子系统甚至插件也难以完成这样的特效,我们决定向表达式求助了。在设计表达式之前,就像所有程序设计的过程一样,我们需要了解我们需要完成什么,如何完成。我决定用这样的方法
完成这个效果:首先创建一个“向导”层,他将按照我们给定的3D路径运动,然后我们将通过表达式创建一系列文字层,每一层都会自动模仿向导的动作,形成一股流。但是流的概念包括很多混乱因素,即所有文字层都模仿向导,但是每层都模仿的不完全一样,有的出发早,有的晚;有的飞行快,有的慢;有的大,有的小;颜色和文字内容也不一样;等等。之后,为了便于控制所有这些因素,我们还需要用一些控件对他们进行控制。
那么我们到底要计算机怎么做才能实现我们的要求的效果呢?首先要明白,计算机只不过是工具,他们不会直接给出解决的方案,他们最擅长的就是“模仿”。要知道我们需要他模仿什么,只要想,如果让你手动做这个效果,你怎么做?我们通常制作这个效果的方法是这样的:首先创建一个新的文字层,输入内容,设置颜色,设置关
键帧动画,让它沿我们给出的路径运动。再然后复制该层,修改内容、颜色、关键帧、出入点等属性,得到一个新的“粒子”,然后再复制,再修改,直到拥有足够的粒子为止。使用这个方法,应该是可以实现这个效果的,而且其实一点难度都没有,不需要什么高级的操作。但是复制调节几十个层也许还只是比较累人,如果要调节几百个层呢?万一调节完了需要改动呢?看问题来了把?这就需要表达式出手了。但是到这里,我们也从中得到了灵感,就是我们将这些调整的工作交给表达式去做,中间给他赋予一些规则,让他按照这些规则完成我们的工作,而我们甚至可以随时修改某些规则,从而改变最终的结果。
良夜
明白了这些思路,我们得出了以下结论:
我们要对文字层的几个属性加入表达式,让计算机再合适的范围内,随机为属性选择数值,而所有层选择的规则又可以受一些统一的控件的控制。下面让我们进入实际的操作。之后为了在这个教程中显示这种做法带来的好处,我们将先建立一个3D的灯箱,然后让我们的文字流围绕这个灯箱,呈螺旋形运动。alia
1、制作一个3D的灯箱。(因为本教程的重点不是3D层的合成,这一段会比较简略。)
首先启动AE,建立一个新的comp,大小设置为400×400,命名为Cubeface。打开这个comp,创建一个400×400的solid层,颜色设置灰色,修改透明度值为50%,这层将成为灯箱半透明的玻璃部位。复制该层,设置透明度为100%,颜色改为白色,为图层添加一个矩形mask,设置maskshape为substract,mask expansion为-17,得到了一个白色的框框,这个将成为灯箱的框。最后导入一个你喜欢的图片,放在最上层。这样灯箱的一面就做好了。效果如图:
2、新建一个comp命名为cube,倒入刚才制作的cubeface,复制为4个,转化为3D层,设置他们的position和orientation属性分别为下图,组成一个方盒子(没有底和顶)。
3、新建一个comp命名为main,长度设置为30秒,导入刚才制作的cube, 打开层塌陷开关,复制改层,
把盒子堆叠成柱状,并用类似的方法制作一个文字框,组成一个灯箱,添加旋转关键桢,让灯箱的不同部件转动起来。为了让场景更加美观,我们用两个solid层制作了地面和背景墙壁,并添加了几盏灯光,让场景更加有质感。
最终整个场景的效果如图:
忙了这么半天,你可不要以为已经接近成功了,我们还只是为我们的效果搭了一个舞台,真正的好戏才刚要开场呢。
首先我们要制作一个“向导”,这个向导将沿螺旋形轨道,从下往上围绕我们的灯箱旋转,之后我们的所有文字层都将跟随他运动,最
英语学习初级入门终产生一个“文字流”。
这里我们要新建一个20×20的solid层。之所以选择solid层而不选择null层是因为,我们可以通过它观察场景中的灯光对它的影响,得知最终灯光将对文字造成的影响,这样会给我们带来一些小小的便利,而null层由于不会被渲染出来,没有这个功能,所以我们不采用。完成以后把这个层转化为3D图层,准备给他的position属性加入关键桢动画。这个时候,我们发现我们遇到了第一个难题:怎么让一个物体沿一个3D螺旋形轨道运动?在一些三维动画软件中,这个效果是非常简单的:制作一个螺旋形曲线,
然后以它为路径,让一个物体沿曲线运动。但是Aftereffects虽然可以粘贴路径给物体的位移属性,但是没有办法粘贴一个三维路径。怎么办呢?其实这是后最快捷的方法也就是表达式动画。这个表达式怎么写呢?
首先我们需要观察一下到底我们需要的路径是什么样的。以下是在3DMAX中绘制的一条螺旋线的三视图。
leifeng从这张图的顶视图,我们不难发现,其实螺旋线的轨迹,在x-z平面上作的是圆周运动和一个向外的匀速运动,这两个运动导致它的轨迹呈现螺旋形。而他的角度变化可以认为是个匀速变化的过程。索赔的英文
通过前视图,我们也不难发现,在y轴方向,他做的是个匀速(或者变速)直线运动。这里我们把它暂定为一个匀速运动。这样,明白了整个过程以后,我们就可以得到一个大致的思路:给运动定义三个变量,其中vel1(velocity1的简称)即运动在x-z平面上单位时间内转过的角度(单位是弧度/秒);vel2,即物体在x-z平面上那个向外的速率;vel3,即物体在y方向上的速率;然后利用这三个变量,我们将计算出任何时刻物体的坐标。同时,我们规定起初时候圆周的半径是个常量,命名为radius。有了这些数值,我们可以得到以下结果:
某个时刻(time)物体圆周运动的半径是:
radtemp=radius+vel3*time
(小学算术,不难理解把?)
这个时刻,它和初始位置的夹角是:
angertemp=vel2*time
这个时刻在顶视图他的位置可以用下图形容:
其中的a角就是angertemp
ari
那么它的x-z坐标通过最基本的三角函数不难获得,应该是:
x=-cosa*radtemp
z=sina*radtemp
而此时物体的y轴坐标更简单,应该是:
y=-vel3*time,注意,ae中坐标轴的方向和我们平时用的不太一样, y轴正方向是向下的。
通过以上步骤的计算,我们就得到了物体的坐标,把这些改写成表达式如下:webquest
vel1=20; //旋转速度
vel2=40; //向外速度
vel3=50; //y方向速度
radius=30;
//定义初始的半径值
dibaradtemp=radius+vel2*time; //定义任意时刻半径的算法
angertemp=vel1*time; //定义任意是刻角度的算法
a=-s(vel1*time)* radtemp; //定义物体x坐标的算法
b=-vel3*time; //定义物体y坐标的算法
c=Math.sin(vel1*time)* radtemp; //定义物体的z坐标的算法
[a,b,c] //最终输出物体坐标
选择guide层,打开position属性,通过菜单:
animation/add expression给position属性加入表达式,并把以上的内容写入。
现在看看guide层的运动,怎么样,看到螺旋形的轨迹了把!
但是你大概也发现了一个问题:怎么运动是从屏幕的左上角开始的?不是从中央的地面开始的呢?因为我们刚才的表达式是假定运动的中心点是在坐标(0,0,0)而设置的。实际上,(0,0,0)这个点的位置正是屏幕左上角。这个问题怎么解决呢?下面新建一个null层,命名为center并将之转换为3D层,把它放到灯箱的下方中央。然后打开guide层的position属性的表达式,把最后一行改为:[a,b,c]+thisComp.layer("center").position,即把这各点的坐标和center的相加,获得了当center层为螺旋线底部中央点的时候物体的坐标。好了,现在试着调整center层的位置,看到guide层轨迹随之改变了没有?开始感觉到AE表达式的强大了吧!
这时候,我要说一些题外话。上面的表达式中“//”后面的是注解,实际对AE的运行没有作用,对于最终的结果也没有直接作用,因此可以不写。另外,这个表达式分10行表达函数值,其实可以用一行写完。即:[-s(20*time)*(30+40*time),-50*time,Math.sin(20*time)*(30+40*time)]。这个表达式其实就是把上面的诸多变量、数值代入得到的。看起来似乎要比我之前写的简单很多。但是,实际工作中,我不推荐这样的写法。因为,这样写出来的表达式有几个缺点:
1、由于单个表达式比上面的复杂很多,容易写错,只要漏了哪怕1个“(”,最终也会导致AE报错罢工的。
2、没有注解,也就意味着别人将很难理解你写的表达式,在团队合作中这是很不好的习惯。更糟糕的是,时间稍微一长,很可能连你自己都会忘记它的含义,这样在修改和调试的过程中就容易造成一些错误。
3、把所有不变的数值,直接代入,在调整数值的过程中容易搞混,毕竟要记住几个不断变化的数值到底哪个代表什么,最好的方法就是写下来。
题外话说完,现在回到主题。我们已经写好了表达式,预览一下动画效果,看到你的guide层螺旋上升了吧?看看他的速度是否符合要求,如果不符合,比如上升太快或者太慢可以修改翻译官张京个人介绍
相应的变量数值,直到最终对所做的效果满意。最终让guide层在10秒左右飞出屏幕。这时候,可以把表达式转换为关键帧,因为之后我们并不需要不断调整guide的路径。点击guide的position属性,选择菜单animation/keyframe assistant/convert expression to keyframes。把表达式值转换为关键帧(为了让这个路径更加简单,也可以使用smooth工具对其进行简化)。这时候表达式已经没用了,把它删除吧。同时打开position属性,删除10秒后的所有关键帧。现在我们可以看到,guide层在0秒时候从底部出发,沿一个螺旋轨道上升,最终在10秒左右出画。我们可以让他在1秒后不断重复这样的
运动,因此我们现在再次给position属性加入表达式:loopOut(type = "cycle", numKeyframes = 0),这段表达式可以让该层10秒后回到第一帧的位置,重新开始运动,并且不断循环。
到了这里,我们终于完成了向导层的设置,其实主要的部分才刚刚要开始。但是只不过这简简单单的几下,已经让我们领略到了表达式的强大与便利。相信应该能让许多本来对数字头痛的朋友对表达式有点兴趣了吧?
下面我们需要做的就是如何创造我们的粒子系统,并对其进行方便有效的控制。
我们的思路其实很简单,就是制作一个文字层,让表达是控制它模仿之前的guide层,但是在复制的过程中,不同的层拥有一些不一样的属性:包括大小、位置、方向、速度、路径内容、颜色等等。
首先创建一个文字层,输入文字内容“title”(其实输入什么并不重要,反正内容将受表达式控制,但是输入“title”或者“文字”总比输入个“asr465”这样的名字好理解吧?),把这层转化为3D图层。
然后,我们要给它的position属性加入表达式。让它模仿guide的运动。试着添加以下的表达式:
thisComp.layer("guide").position.valueAtTime(time)
这个表达式将让文字层拥有和guide每个时刻都对应的坐标,也就是位移动画完全和guide一样。
按下小键盘“0”键,看看效果,不错,下面就是让它“犯错误”了。
1、首先我们要让它拥有随机的速度
这里我们可以引入几个表示速度的变量,但是问题是,那样会把问题搞的稍微复杂一些,而实际上,在我们的表达式中,速度并没有直接出现,这就意味着我们可以完全不必加入速度变量。假定我们的guide层花费了original time完成了一段运动,而我们的title层花费了new time的时间完成了同样的路程,这时候,我们引入一个变量:timerate。
那么,如果现在的时间是time,那么title层的位置在哪里呢?或者说,它现在处的位置相当于什么时刻guide层的位置呢?我们设定这个时刻为变量when,