邵永錄
摘要:本文從機(jī)械設(shè)計課程教學(xué)的實(shí)際出發(fā),結(jié)合FLASH動畫技術(shù)的應(yīng)用,研究了機(jī)械設(shè)計課程當(dāng)中曲柄搖桿機(jī)構(gòu)中難以理解的結(jié)構(gòu)與運(yùn)動關(guān)系,并分析了具體的動畫制作過程。
關(guān)鍵詞:腳本語言? 動畫制作? 曲柄搖桿機(jī)構(gòu)? 運(yùn)動分析
1 基礎(chǔ)知識認(rèn)知
1.1 素材獲取
用于制作縮放的圖片文件應(yīng)該是矢量圖,文件可以使用矢量圖軟件制作而獲取,常用FALSH自身所具備的繪圖工具就可以完成相關(guān)的素材獲取,將獲取的圖形對象修改為影片剪輯。
1.2 腳本語言基礎(chǔ)
本次研究以Flash Action Script3.0為語言基礎(chǔ)。先介紹相關(guān)圖形對象的屬性。
.x——相對于父級影片剪輯的本地坐標(biāo)的x坐標(biāo)。如果影片剪輯在主時間軸中,則其坐標(biāo)系統(tǒng)將舞臺的左上角指定為(0,0)。
.y——相對于父級影片剪輯的本地坐標(biāo)的y坐標(biāo)。如果影片剪輯在主時間軸中,則其坐標(biāo)系統(tǒng)將舞臺的左上角指定為(0,0)。
.rotation——確定影片剪輯從注冊點(diǎn)開始的影片剪輯旋轉(zhuǎn)的角度。
Math.sin()——正弦三角函數(shù),單位為弧度。
Math.asin()——反正弦三角函數(shù),單位為角度。
Maht.pow()——此函數(shù)為求一個數(shù)a的b次冪,如:Maht.pow(a,b)。
Graphics.moveTo(x,y)——繪制直線的起點(diǎn)。
Graphics.lineTo(x,y)——繪制直線的停止點(diǎn)。
Graphics.lineStyle (6,0x00ffff,1,true,"")——指定一種線條樣式以用于隨后對直線或圓等繪制時的線寬、顏色等。
Graphics.clear()——清除直線、圓等圖形;本文中用于清除上一次創(chuàng)建的直線圖形對象。
SetTimeout(myclear,20)——用于延時功能的函數(shù)。
setInterval()——setInterval函數(shù)的作用是在播放動畫的時候,每隔一定時間就調(diào)用一次參數(shù)。
ClearInterval(sh)——用于清除setInterval()函數(shù)的調(diào)用循環(huán)。
1.3 四桿機(jī)構(gòu)中曲柄、連桿與搖桿間的角度關(guān)系
使用平面幾何三角圖形中的余弦定理與反余弦函數(shù),則可建立機(jī)構(gòu)運(yùn)動中的各個角度關(guān)系。
c2=a2+b2-2abcosC
C=arccos[(a2+b2-c2)/2ab]
2 動畫制作過程研究
2.1 初始化舞臺環(huán)境
首先,設(shè)置舞臺尺寸為550×400像素,然后聲明四個桿件的長度與四個桿件各自注冊點(diǎn)(坐標(biāo)參考點(diǎn))的坐標(biāo);即分別為37.5,125,200,
235.75,且將四個桿的注冊點(diǎn)坐標(biāo)設(shè)置為“ax,ay”,“bx,by”,“cx,cy”,“dx,dy”,再設(shè)置b與c桿鉸接點(diǎn)坐標(biāo)為“cx2,cy2”。
參照原四桿機(jī)構(gòu)固定支點(diǎn)位置,設(shè)置初始兩點(diǎn)坐標(biāo)。如設(shè)計曲柄注冊點(diǎn)(回轉(zhuǎn)中心為“200,100”),則搖桿回轉(zhuǎn)支點(diǎn)坐標(biāo)為(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桿注冊點(diǎn)x坐標(biāo);
ay:Number = 150; //定義a桿注冊點(diǎn)y坐標(biāo);
bx:Number; //定義b桿注冊點(diǎn)x坐標(biāo);
by:Number; //定義b桿注冊點(diǎn)y坐標(biāo);
cx:Number = 375; //定義c桿注冊點(diǎn)x坐標(biāo);
cy:Number = 350; //定義c桿注冊點(diǎn)y坐標(biāo);
cx2:Number ; //定義b與c桿鉸接點(diǎn)x坐標(biāo);
cy2:Number;? //定義b與c桿鉸接點(diǎn)y坐標(biāo);s
曲柄的定角轉(zhuǎn)動程序如下:
var jd:Number = 0
function aa()
{
jd = jd +5;
jd %=? 360;
……
}
setInterval(aa,10);
2.2 求取各注冊點(diǎn)坐標(biāo)公式
曲柄a的注冊點(diǎn)采取給定方式,根據(jù)舞臺大小,自行確定其坐標(biāo)。
ax=150
ay=150
連桿b的注冊點(diǎn)位置由曲柄的與連桿連接端決定,角度通過余弦定理與反余弦求解而出,程序如下:
bx= ax+a*Math.cos(jd*Math.PI/180);
by =ay-a*Math.sin(jd*Math.PI/180);
搖桿c的注冊點(diǎn)位置由連架桿的固定端點(diǎn)決定,程序如下:
cx=ax+d;
cy=ay;
連架桿d的注冊點(diǎn)與曲柄a的注冊點(diǎn)重合,所以坐標(biāo)與a曲柄的注冊點(diǎn)坐標(biāo)相同。
ax=dx=150
ay=dy=150
要求取b與c兩桿的交點(diǎn)坐標(biāo),就必須使用余弦定理與反三角函數(shù),推動過程較復(fù)雜,此處僅列出相應(yīng)的代碼程序。
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桿的轉(zhuǎn)角還是會發(fā)生錯誤的。原因在于當(dāng)曲柄旋轉(zhuǎn)時,會造成與連架桿的夾角時而為正,時而為負(fù)。
腳本制作中,采用IF()語句來分別判斷曲柄旋轉(zhuǎn)過程中對連桿b與水平正向的夾角受到連桿與BD連線夾角KJ,以及AD與BD夾角WJ的不同影響關(guān)系。
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 繪制曲柄搖桿機(jī)構(gòu)圖形
此曲柄搖桿機(jī)構(gòu)采用Action Script 3的Graphics繪制圖形命令來進(jìn)行,具體繪制四桿程序如下:
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個注冊點(diǎn)(也稱鉸接點(diǎn))。
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 動態(tài)曲柄搖桿機(jī)構(gòu)的獲取
延時清除與使用setInterval()每隔一定時間調(diào)用一次自定義函數(shù)aa(),注意將setTimeout()的時間與setInterval()的時間設(shè)置成相同值,從而保證桿件轉(zhuǎn)動效果的連貫性。
setTimeout(myclear,20);//延時函數(shù)
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();
}
}//以上程序內(nèi)容全部在自定義函數(shù)aa()當(dāng)中。
接下來便是使用setInterval()函數(shù)來按時調(diào)用aa()自定義函數(shù),程序設(shè)置如下。
sh = setInterval(aa,20);
2.5 影片輸出與應(yīng)用
將Flash文件導(dǎo)出生成.swf格式動畫文件,然后就可以在PowerPoint軟件下的控制工具箱中的Shockware Flash Object將此動畫文件導(dǎo)入到PPT中。播放PPT,就可以更好地為課堂教學(xué)服務(wù)了。
3 總結(jié)
利用Flash Action Script3.0強(qiáng)大的腳本語言工具,結(jié)合相關(guān)的機(jī)械設(shè)計原理知識,全部使用腳本代碼程序,可以制作出清晰、精彩的機(jī)械機(jī)構(gòu)動畫文件。
參考文獻(xiàn):
[1]陳志民.Adobe創(chuàng)意大學(xué)Flash CS6標(biāo)準(zhǔn)教材[M].北京希望電子出版社,2013.4.
[2]張佳麗.Flash CS6中文版動畫制作標(biāo)準(zhǔn)教程[M].中國青年出版社,2013.7.
[3]嚴(yán)嚴(yán).Flash CS6中文版完全學(xué)習(xí)手冊[M].人民郵電出版社,2013.3.