基于FLASH AS 3的曲柄摇杆机构动画制作与分析
2015-05-30邵永录
邵永录
摘要:本文从机械设计课程教学的实际出发,结合FLASH动画技术的应用,研究了机械设计课程当中曲柄摇杆机构中难以理解的结构与运动关系,并分析了具体的动画制作过程。
关键词:脚本语言 动画制作 曲柄摇杆机构 运动分析
1 基础知识认知
1.1 素材获取
用于制作缩放的图片文件应该是矢量图,文件可以使用矢量图软件制作而获取,常用FALSH自身所具备的绘图工具就可以完成相关的素材获取,将获取的图形对象修改为影片剪辑。
1.2 脚本语言基础
本次研究以Flash Action Script3.0为语言基础。先介绍相关图形对象的属性。
.x——相对于父级影片剪辑的本地坐标的x坐标。如果影片剪辑在主时间轴中,则其坐标系统将舞台的左上角指定为(0,0)。
.y——相对于父级影片剪辑的本地坐标的y坐标。如果影片剪辑在主时间轴中,则其坐标系统将舞台的左上角指定为(0,0)。
.rotation——确定影片剪辑从注册点开始的影片剪辑旋转的角度。
Math.sin()——正弦三角函数,单位为弧度。
Math.asin()——反正弦三角函数,单位为角度。
Maht.pow()——此函数为求一个数a的b次幂,如:Maht.pow(a,b)。
Graphics.moveTo(x,y)——绘制直线的起点。
Graphics.lineTo(x,y)——绘制直线的停止点。
Graphics.lineStyle (6,0x00ffff,1,true,"")——指定一种线条样式以用于随后对直线或圆等绘制时的线宽、颜色等。
Graphics.clear()——清除直线、圆等图形;本文中用于清除上一次创建的直线图形对象。
SetTimeout(myclear,20)——用于延时功能的函数。
setInterval()——setInterval函数的作用是在播放动画的时候,每隔一定时间就调用一次参数。
ClearInterval(sh)——用于清除setInterval()函数的调用循环。
1.3 四杆机构中曲柄、连杆与摇杆间的角度关系
使用平面几何三角图形中的余弦定理与反余弦函数,则可建立机构运动中的各个角度关系。
c2=a2+b2-2abcosC
C=arccos[(a2+b2-c2)/2ab]
2 动画制作过程研究
2.1 初始化舞台环境
首先,设置舞台尺寸为550×400像素,然后声明四个杆件的长度与四个杆件各自注册点(坐标参考点)的坐标;即分别为37.5,125,200,
235.75,且将四个杆的注册点坐标设置为“ax,ay”,“bx,by”,“cx,cy”,“dx,dy”,再设置b与c杆铰接点坐标为“cx2,cy2”。
参照原四杆机构固定支点位置,设置初始两点坐标。如设计曲柄注册点(回转中心为“200,100”),则摇杆回转支点坐标为(325,300),在时间轴第一帧处写入初始化脚本程序如下:
var a:Number = 37.5;//定义a杆及其长度;
var b :Number = 125; //定义b杆及其长度;
var c:Number = 200; //定义c杆及其长度;
var d :Number = 235.75; //定义d杆及其长度;
ax:Number = 150; //定义a杆注册点x坐标;
ay:Number = 150; //定义a杆注册点y坐标;
bx:Number; //定义b杆注册点x坐标;
by:Number; //定义b杆注册点y坐标;
cx:Number = 375; //定义c杆注册点x坐标;
cy:Number = 350; //定义c杆注册点y坐标;
cx2:Number ; //定义b与c杆铰接点x坐标;
cy2:Number; //定义b与c杆铰接点y坐标;s
曲柄的定角转动程序如下:
var jd:Number = 0
function aa()
{
jd = jd +5;
jd %= 360;
……
}
setInterval(aa,10);
2.2 求取各注册点坐标公式
曲柄a的注冊点采取给定方式,根据舞台大小,自行确定其坐标。
ax=150
ay=150
连杆b的注册点位置由曲柄的与连杆连接端决定,角度通过余弦定理与反余弦求解而出,程序如下:
bx= ax+a*Math.cos(jd*Math.PI/180);
by =ay-a*Math.sin(jd*Math.PI/180);
摇杆c的注册点位置由连架杆的固定端点决定,程序如下:
cx=ax+d;
cy=ay;
连架杆d的注册点与曲柄a的注册点重合,所以坐标与a曲柄的注册点坐标相同。
ax=dx=150
ay=dy=150
要求取b与c两杆的交点坐标,就必须使用余弦定理与反三角函数,推动过程较复杂,此处仅列出相应的代码程序。
e=Math.sqrt(Math.pow(a,2)+Math.pow(d,2)-2*
a*d*Math.cos(jd*Math.PI/180));
wj=Math.acos((Math.pow(e,2)+Math.pow(d,2)-Math.pow(a,2))/(2*e*d))*180/Math.PI;
kj=Math.acos((Math.pow(b,2)+Math.pow(e,2)-Math.pow(c, 2))/(2*b*e))*180/Math.PI;
如果就这样直接获取a杆与c杆的转角还是会发生错误的。原因在于当曲柄旋转时,会造成与连架杆的夹角时而为正,时而为负。
脚本制作中,采用IF()语句来分别判断曲柄旋转过程中对连杆b与水平正向的夹角受到连杆与BD连线夹角KJ,以及AD与BD夹角WJ的不同影响关系。
if (jd<=180){
w = kj- wj;
}else{
w = wj+ kj;
}
cx2 = bx+b * Math.cos(w*Math.PI/180);
cy2 = by-b * Math.sin(w*Math.PI/180);
2.3 绘制曲柄摇杆机构图形
此曲柄搖杆机构采用Action Script 3的Graphics绘制图形命令来进行,具体绘制四杆程序如下:
var lina:Shape=new Shape();
lina.graphics.moveTo(ax,ay);
lina.graphics.lineStyle(6,0x00ffff,1,true,"");
lina.graphics.lineTo(bx,by);
addChild(lina);//曲柄a
var linb:Shape=new Shape();
linb.graphics.moveTo(bx,by);
linb.graphics.lineStyle(6,0xffff00,1,true,"");
linb.graphics.lineTo(cx2,cy2);
addChild(linb);//连杆b
var linc:Shape=new Shape();
linc.graphics.moveTo(cx,cy);
linc.graphics.lineStyle(6,0x00ff00,1,true,"");
linc.graphics.lineTo(cx2,cy2);
addChild(linc);//摇杆c
var lind:Shape=new Shape();
lind.graphics.moveTo(ax,ay);
lind.graphics.lineStyle(6,0xff0000,1,true,"");
lind.graphics.lineTo(dx,dy);
addChild(lind);//连架杆d
接下来绘制4个注册点(也称铰接点)。
var cir1:Shape=new Shape();
cir1.graphics.beginFill(0xff0ff0);
cir1.graphics.drawCircle(ax,ay,6);
cir1.graphics.endFill();
addChild(cir1);//圆a
var cir2:Shape=new Shape();
cir2.graphics.beginFill(0xff0ff0);
cir2.graphics.drawCircle(bx,by,6);
cir2.graphics.endFill();
addChild(cir2);//圆b
var cir3:Shape=new Shape();
cir3.graphics.beginFill(0xff0ff0);
cir3.graphics.drawCircle(cx2,cy2,6);
cir3.graphics.endFill();
addChild(cir3);//圆c
var cir4:Shape=new Shape();
cir4.graphics.beginFill(0xff0ff0);
cir4.graphics.drawCircle(cx,cy,6);
cir4.graphics.endFill();
addChild(cir4);//圆d
2.4 动态曲柄摇杆机构的获取
延时清除与使用setInterval()每隔一定时间调用一次自定义函数aa(),注意将setTimeout()的时间与setInterval()的时间设置成相同值,从而保证杆件转动效果的连贯性。
setTimeout(myclear,20);//延时函数
function myclear()
{//延时清除画线!
lina.graphics.clear();
linb.graphics.clear();
linc.graphics.clear();
lind.graphics.clear();
cir2.graphics.clear();
cir3.graphics.clear();
cir1.graphics.clear();
cir4.graphics.clear();
}
}//以上程序内容全部在自定义函数aa()当中。
接下来便是使用setInterval()函数来按时调用aa()自定义函数,程序设置如下。
sh = setInterval(aa,20);
2.5 影片输出与应用
将Flash文件导出生成.swf格式动画文件,然后就可以在PowerPoint软件下的控制工具箱中的Shockware Flash Object将此动画文件导入到PPT中。播放PPT,就可以更好地为课堂教学服务了。
3 总结
利用Flash Action Script3.0强大的脚本语言工具,结合相关的机械设计原理知识,全部使用脚本代码程序,可以制作出清晰、精彩的机械机构动画文件。
参考文献:
[1]陈志民.Adobe创意大学Flash CS6标准教材[M].北京希望电子出版社,2013.4.
[2]张佳丽.Flash CS6中文版动画制作标准教程[M].中国青年出版社,2013.7.
[3]严严.Flash CS6中文版完全学习手册[M].人民邮电出版社,2013.3.