AE表达式
AE 元素之间的关系:
关键帧: 最灵活,最普通的连接,但不利于修改。 合并嵌套:一种将多层素材元素作为单独素材处理设
置的方法。 父子连接:父层级的变化会影响到子层级。 动力学脚本:可以使用动力学脚本令一个图层模拟另
一个图层的位置变化,但只在脚本执行时才会起作用,所以只是暂时性的。
表达式:功能最强大。
解析表达式:
AE 的表达式以Javascript 语言为基础
等号的位置:
AE 的表达式不需要使用等号将其赋予参数,为参数 添加表达式的时候,直接将计算结果赋予参数。
表达式,参数值一一对应:
一个表达式只能控制一个参数。
向量,阵列,维数,索引:
向量:是既有大小又有方向的数字阵列,其运算结
果即要考虑到大小又要考虑到方向
阵列:是一套独立元素的组合,阵列中可包含任何
元素,可以是物体阵列,词汇阵列或是混合阵列
(在AE 中的是数字阵列,其他类型的没用) 索引:从阵列中提取需要的单一元素(使用阵列名
加上包含数字的中括号)如:position[0]
(使用元素调用元素时,须从0开始记数) 建立阵列:
如要建立阵列,将数值以逗号分隔放入中括号中。 如:my_vector=[10,20,30];//将一个三维数组赋予变量
my_vactor.
my_vector[1];//数组中的第二个元素
维数:
阵列中的元素个数(方括号中逗号分隔的个数) (诸如位置属性这样的多维数组或是自定义数组变 量,不需要将他们的名字写在方括号中,AE 会将 其识别为数组)
修改阵列中的一个元素:
可用如下方式书写位置表达式:
[position[0],position[1]];//将位置阵列中的两个参
数分别提出来后,再将他们放入同一阵列中,优点是你可以使用这种结构来修改阵列中的一个元素而不影响另外元素。
(使用这种结构时需注意,如将图层设为3D 图层时,位置与Z 轴都需重新考虑进去,否则将自动设为0)
(注:当使用拾取线时,AE 会自动通过索引向量或重复标量的方式矫正维数的匹配.) 不同参数之间的范围匹配公式:
(目标参数/目标参数范围上限*现在参数范围上限) 如:rotation/360*100 //在范围为100的参数上添加 模拟真实的轮胎行进动画:(在rotation 中添加)
distance=postion[0];//定义位置的X 轴
circumference=width*Math.PI;//以图层的宽度作
为圆的直径,Math.PI 为调用圆周率的函数
distance/ circumference*360
插值方法:线性liner( ), 平滑ease( )
(一套内置的插值算法进行参数间的转换) linear(t,t_min,t_max,value1,value2) ease(t,t_min,t_max,value1,value2) ease_in(„),ease_out(„)
参数解析: t :当前参数;(必选)
t_min,t_max:当前参数的下限和上限(可选)
(如忽略,AE 将范围定在0~1之间)
value1,value2:目标参数的下限和上限;(必选)
(当t ≤t_min时,返回该值;当t ≥t_max时,返回该值)
例:
linear(time,0,5,0,360);//时间的变化范围是0到
5,目标参数的范围是0到360,整个变化过程是线性的。如用在旋转属性上,则是在前5秒钟内旋转360度。
(如是time/5*360则是连续的在5秒内旋转360度) 实例:交互模糊:
//为受控层加入快速模糊;//为模糊程度加表达式; point1=this_layer.position;// 受控层的位置 point2=this_comp.layer(“DragMe ”).position; //控制层的位置
delta=sub(point1,point2); //计算两点间的矢量线段 distance=length(delta);// 计算出该矢量的长度 linear(distance,0,80,40,0);
[DragMe为黄色固态层,(将其显示关掉) 通过调整控制图层的位置来依次交互的影响四个受控图层的模糊程度.]
缓存参考对象:
距离: length()函数
(将其应用到任何维数的矢量中就会返回矢量的长度) //拾取图层
point1=this_comp.layer(“A ”).position; point2=this_comp.layer(“B ”).position;
delta=sub(point1,point2); //计算出两点之间的矢量 length(dalta);//计算矢量长度
(javascript规定全局对象与次级对象之间必须以点号分割) 如:this_comp.layer(“solid ”).rotation;
(写矢量运算表达式时, 将其分开写, 每一句只包含一个运算)
如运算:(a-b)/2为
tamp=sub(a,b);//先定义一个相减后的值
div(temp,2);//运算除法 三角函数:
(在javascript, 三角函数包含在math 对象中, 所有的三角函数的返回值均为数字)
opposite
转换函数:
[AE角度以度(degrees ) 而非弧度(radians ) 来计量] radians_to_degrees(angle)//从弧度转换到度 degrees_to_radians(angle)//从度转换到弧度 例://计算当前图层旋转角度的正弦值
Math.sin(degrees_to_radians(rotation));
圆周排列:
(使用图层的层序号来控制角度的变化, 当图层序号角度增加时, 旋转角度也会随着改变)
center=this_comp.layer(“center ”).position; //为旋转的环绕中心定义一个变量 radius=80;//定义旋转的圆周半径
interval=30;//相邻图层之间的偏差角度
layer_num=index-1;//将图层序号减1,使得图层序号从零开始计数,这样我们得到的第一个图层就位于0度角
angle=degrees_to_radians(layer_num*interval); //将层的序号乘以30,并将得出的角度转换成弧度 x=radius*Math.cos(angle); y=radius*Math.sin(angle);
add(center,[x,y]); //将X,Y 值与旋转中心的坐标进行加法就可以得到圆周上点的坐标 圆周运动:
(用时间来驱动图层的旋转角度动画)
center=this_comp.layer(“center ”).position; //为旋转的环绕中心定义一个变量 radius=120;//定义旋转的圆周半径
angle=time*2;//定义驱动旋转角度的变量-时间 x=radius*Math.cos(angle); y=radius*Math.cos(angle); add(center,[x,y]);
波长,频率,振幅:
波形运动的两个基本特征:波长与振幅
波长:是相邻的波峰之间的距离;指震动的速度。 振幅:从波的基线到波峰之间的高度,指震动的幅度;
波的频率:(另一种描述波速的方式)
频率是描述在给定的时间间隔内(通常是一秒)波峰的数量。[频率=1/波长]
在javascript 中,通过给自变量乘以某个系数来增加波形的频率。
如:Mash.sin(time*6)就是6倍的time 波形频率 调整频率的FM 波段:
调整振幅的AM 波段:
弹簧运动(无衰减):
x=Math.sin(time*3)*100;//x轴(time*3为频率的快慢,100为振幅的大小) y=time*10;//y轴(波长)
rest=position;//定义位置变量
add(rest,[x,y]);// 将X,Y 值与物体位置的坐标进行加法就可以得到波形点的坐标
弹簧运动(衰减):
frequency=linear(time,0,out_point-1,50,0); amplitude=linear(time,0,out_point-1,50,0); //用插值函数来产生衰减,(其中out_point-1表示图层出点的前一秒) [随着时间从零变化到图层出点的前一秒,振幅从50到0]
x=Math.sin(time*frequency)*amplitude;
//x轴(time*frequency为频率的快慢,amplitude 为振幅的大小)
y=time*10;//y轴(波长)
rest=position;//定义位置变量
add(rest,[x,y]);// 将X,Y 值与物体位置的坐标进行加法就可以得到波形点的坐标
实 例:
花瓣彩条动态: ◆ 新建一个solid 层(10*10的) ◆ 给solid 层添加write on 特效 ◆ 给solid 层的位移添加表达式 ◆ 将write on的位移属性连接到层位移上 ◆ solid 层的位移表达式:
r1=60;//定义半径(同心圆的半径)
r2=-11;//定义半径(r1弧线弯曲的半径) o=45;//定义偏移(r2相对于r1的偏移)
v=2;s=2;//v为速度,s 为缩放(r1的缩放值) x=(r1+r2)*Math.cos(time*v)-(r2+o)*Math.cos((r1+r2)*time*v/r2);
y=(r1+r2)*Math.sin(time*v)-(r2+o)*Math.sin((r1+r2)*time*v/r2);
[s*x+this_comp.width/2,s*y+this_comp.height/2];
随机彩条背景: ◆ 新建一个solid 层,细长条 ◆ 给solid 层的位移添加表达式 tmin=0.5;//定义起始时间
tmax=2;//定义完成时间
end=0;start=end;//当前参数的上下限
endval=random()*this_comp.width; //定义目标物体的参数下限
startval=random()*this_comp.width;//定义目标物体的参数上限
x=ease(time,start,end,startval,endval);//用插值函数计算运动 j=0;
while(time>=end){//当„ j++;
seed_random(j,true); end+=random(tmin,tmax); }
seed_random(j-1,true); //多余的??
[x,position[1]];//点的坐标;
Loading..0%的制作:
◆ 新建comp, 然后solid; ◆ 新建一蓝色solid(Blue Solid)
◆ 给solid 加basic text,输入Loading... ◆ 新建一个solid(number Solid) 再加number 特效◆
在Blue Solid的scale 上加表达式,把其连接到number Solid的number 的value 上;
[thisComp.layer("Solid").effect("Numbers")("Value/Offset/RandomMax"),thisComp.layer("Blue Solid").scale[1]]+[0,0]
电视墙教程(解决变量传递方法):
◆ 新建comp ◆ 新建solid, 在scale 上加表达式 step=4;//定义电视墙的块数为4*4
w=this_comp.width;//定义W 为当前comp 的宽度 solid_x=(w/step-5)/w*100;//定义solid_x的尺寸 [solid_x,solid_x]; ◆ 给solid 的position 加表达式 step=4;//定义电视墙的块数为4*4
n=this_layer.index;//以当前层的序号来定义n ; solid_x=this_comp.width/step;//定义层的宽 solid_y=this_comp.height/step;//定义层的高 a=Math.floor((this_layer.index-1)/step);//定义a 的取值为整数,Math.floor 可以使不能够被整除的小数位舍掉. Math.ceil正好相反, 把小数位进一 if(n
position_x=solid_x/2+(n-1)*solid_x; position_y=solid_y/2;
}
else if(n>a*step,n
position_x=solid_x/2+(n-a*step-1)*solid_x; position_y=solid_y/2+a*solid_y;
}
[position_x,position_y]//position的坐标值 ◆ 选中solid 层, 复制15层, 会自动排列为一个电
视墙(step的值可变, 不过要保持position 和scale 中的step 值一致)
很酷的电子线: ◆ 新建一个comp, 建一个10*10的solid 层 ◆ 给solid 的position 加表达式
columns=10;//物体所经过的角点的数量 thold=0.2;//物体停留时间0.2秒 tmin=0.5;//最短运行时间是0.5秒 tmax=1;//最长运行时间是1秒
gap=this_comp.width/columns;//运行范围为comp
网格交点数量
origin=[gap,gap];//起点终点均为角点
xgrid=columns-1;//x轴的运范围为comp 网格数-1 ygrid=columns-2;//y轴的运范围为comp 网格数-2 start=0;end=0;//开始时间为0秒, 结束时间为零 j=1;//从第一点经过十个点后到最后一点的周期 while(time>=end)//当..... { j+=1;
seed_random(j,true); start=end;
end+=random(tmin,tmax);//当时间大于0时, 速度
为随机呈周期性变化
}
targetX=Math.floor(random(0,xgrid));//x轴目标
点为约定范围内的随机x 轴网格内
targetY=Math.floor(random(0,ygrid));// y目标
点为约定范围内的随机y 网格内
seed_random(j-1,true);//速度随机, 不满一周变化 oldX=Math.floor(random(0,xgrid));//x轴停留点
为约定范围内的随机x 轴网格内
oldY=Math.floor(random(0,ygrid));//y停留点为
约定范围内的随机y 网格内
if(targetX==oldX&&targetY==oldY){
Origin+[oldX,oldY]*gap;//如果目标点与停留点重
合那么将把此交点视为新的起点
}
else if(time-start
origin+[oldX,oldY]*gap;//如果开始时间小于停留
时间此交点视为起点 } else{
deltaX=Math.abs(targetX-oldX);//X轴可处理点为
开始点减去停留点
deltaY=Math.abs(targetY-oldY);//X轴可处理点为
开始点减去停留点
Xtime=(end-start-thold)*(deltaX/(deltaX+deltaY));
//X轴时间为(结束时间减去开始时间减去停留时间乘以(X 轴处理运行点除以(X 轴处理点+Y轴运行点))Ytime=(end-start-thold)*(deltaY/(deltaX+deltaY));
//X轴时间为(结束时间减去开始时间减去停留时间)乘以(X 轴处理运行点除以(X 轴处理点+Y轴运行点))if(time
startPos=origin+[oldX,oldY]*gap;
targetPos=origin+[targetX,oldY]*gap; // X轴的点设定
ease_out((time-start-thold)/Xtime,startPos,ta rgetPos); //X轴的动线 }
else{
startPos=origin+[targetX,oldY]*gap; targetPos=origin+[targetX,targetY]*gap; // Y轴的点设定
ease_in((time-start-thold-Xtime)/Ytime,startP os,targetPos); //Y轴的动线 } }