蔣寅軍+鄒良浩
摘 要:Processing軟件是一個自由、開源的視覺藝術及視覺化呈現(xiàn)的程序設計平臺,是專為藝術家設計的程序語言,尤其適合于由程序控制的動畫開發(fā)。將Processing軟件用于機構運動仿真,輔助《理論力學》課程中運動學部分的教學,比傳統(tǒng)運動學仿真程序更簡潔高效。該軟件對學習其它程序設計語言也有幫助。
關鍵詞關鍵詞:Processing;計算機輔助教學;運動學;機構運動仿真;動畫
DOIDOI:10.11907/rjdk.161228
中圖分類號:G434
文獻標識碼:A 文章編號:1672-7800(2016)008-0189-03
作者簡介作者簡介:蔣寅軍(1973-),男,湖南長沙人,武漢大學土木建筑工程學院講師,研究方向為理論力學、結構力學。
0 引言
Processing語言是由美國MIT(麻省理工學院)的Medialab研究室美學與計算機研究小組于2001年發(fā)布使用的用于視覺藝術及視覺化呈現(xiàn)的程序設計平臺,其設計初衷是作為一種簡單的編程教學語言替代Basic、Logo等編程語言,在電子藝術的環(huán)境下介紹程序語言,并將電子藝術的概念介紹給程序設計師[1-2]。
Processing為藝術家和設計師所設計,具有以下特點:①簡單:用戶可以專注于圖形與交互程序的設計,而不需要考慮諸如編譯參數(shù)、路徑、圖形環(huán)境等任務;②友好:Processing有非?;钴S的社區(qū)和用戶群,容易得到支持,版本更新也很快;③基礎性:只考慮靜態(tài)圖案;④活動性:直接形成動畫。
Processing源于Java,因此其代碼遵守Java語言規(guī)范。Processing是綠色、開源的自由軟件, Windows系統(tǒng)使用的下載包只有108.32M,解壓即可使用,運行界面如圖1所示。
《理論力學》課程由靜力學、運動學與動力學3部分組成,其中最難掌握的是運動學部分,對機構運動分析不清楚直接導致速度、加速度分析的困難,進而影響動力學基本原理的應用。運動學部分的教學需要直觀生動的工具演示機構的運動情況,傳統(tǒng)的方法是教師運用C/C++、Fortran、Matlab、Flash等語言或軟件編制CAI教學程序,或運用UG、Solidworks等大型機械設計軟件進行機構運動仿真,這兩種方法的缺點是:自編軟件數(shù)據(jù)結構及算法復雜,動畫難以實現(xiàn);大型機械設計軟件操作復雜,價格昂貴;制作的CAI課件很難擴展與改動。筆者在接觸到Processing后,認為該軟件非常適于輔助理論力學運動學部分教學,簡單的幾十行代碼就可以構造一個機構并使之運動,而且代碼的可重用性很好,稍加擴展就可構成諸多常見機構并生成動畫,值得推薦給理論力學任課教師使用。
下面以《理論力學》課程中常見的曲柄搖桿機構為例,說明利用processing軟件進行機構運動仿真的應用過程,見圖2。
1 曲柄搖桿機構運動仿真
一個典型的Processing程序主要由setup()和draw()兩個函數(shù)組成:在setup()函數(shù)中完成圖像、動畫的設置(如屏幕尺寸、刷新頻率等),在draw()函數(shù)中實現(xiàn)動畫。可以定義其它子程序進行一些必須的參數(shù)計算和圖形繪制。
1.1 物理模型分析
Processing繪制動畫的策略是在屏幕上逐時刻繪制圖形圖像,因此首先分析機構的物理構成:圖2所示曲柄搖桿機構由4類元件構成:桿件(2根——OA、O1B)、基礎(在固定鉸支座中繪制)、固定鉸支座(2個——O、O1)、套筒(1個——A)。理論力學中的平面機構基本都包含這些元件[3],也是機構運動動畫圖形繪制的元素。
1.2 元件繪制——可重用代碼
繪制每個元件的子程序只需兩類參數(shù):位置參數(shù)(屏幕坐標x、y,方位角angle)、尺寸參數(shù)(長、寬、高等)。對于本例涉及的4類元件,其子程序詳見程序1。元件的不同組合可以構成不同的機構,因此元件繪制代碼是可重用的。
繪制元件有多種方式實現(xiàn),如桿件可以用兩點間的直線表示,但這無助于學生理解剛體的平面運動,若轉換為通過端點坐標和桿件與x軸的夾角來繪制,則更便于表示桿件隨基點的平動和繞基點的轉動。
各子程序中使用了部分絕對尺寸,如固定鉸支座及套筒。也可以將這些物理量定義為子程序的參數(shù),由用戶在使用時指定,但這無疑會帶來程序編制和使用上的復雜性。
程序1:components.pde——元件庫
void bar(float x,float y,float leng,float angle){ //繪制桿件
pushMatrix(); translate(x,y); rotate(radians(angle));
line(0,0,leng,0);
popMatrix();}
void baseSupport(float x,float y,float leng,float angle){ //繪制基礎
pushMatrix(); translate(x,y); rotate(radians(angle));
line(-leng/2,0,leng/2,0);
int n=int(leng/10);
for (int i=0;i line(-leng/2+(i+1)*10,0,-leng/2+i*10,10); } popMatrix();} void fixHingeSupport(float x,float y,float angle){ //繪制固定鉸支座 pushMatrix(); translate(x,y); rotate(radians(angle));
this.baseSupport(0,20,40,0); //調用基礎繪制函數(shù)
line(10,20,0,0);
line(-10,20,0,0);
ellipseMode(CENTER);
ellipse(0,0,10,10);
popMatrix(); }
void sleeve(float x,float y,float angle){ //繪制套筒
pushMatrix(); translate(x,y); rotate(radians(angle));
rectMode(CENTER);
rect(0,0,20,15);
ellipseMode(CENTER);
ellipse(0,0,10,10);
popMatrix(); }
1.3 整體機構繪制——幾何約束條件
一個機構事實上是一系列受約束的點和剛體的集合,各元件必須滿足幾何約束條件(也可稱為幾何相容條件、幾何協(xié)調條件)。
對于圖2所示的曲柄搖桿機構,根據(jù)幾何關系及已知條件可知:
xO = const,yO = const,xO1 = const,yO1 = constxA = lOA cosθOA ,yA = lOA sinθOA ωOA = f(t),θOA = θOA t = 0 + ∫t0f(t)dtθO1 B = arctanlOA cosθOA dOO1 -lOA sinθOA -π2
其中:xO、yO、xO1、yO1、xA、yA分別為O、O1、A點的x、y坐標;lOA為OA桿的長度;θOA、θO1B分別為OA、O1B桿與x軸的夾角;ωOA為OA桿的角速度,其隨時間變化的規(guī)律f(t)通常是已知的;θOA t = 0 為OA桿在t=0時刻與x軸的夾角;dOO1為O、O1兩支座間的距離。
考慮上述幾何約束條件,利用之前構建的可重用元件代碼,即可寫出繪制整個曲柄搖桿機構的子程序crank_rocker()(見程序2)。該子程序主要包含3個部分:①已知參數(shù)賦值,如各桿長度、支座間距等;②與時間有關的參數(shù)計算,如搖桿角度、套筒位置等,其中搖桿角度ang1的計算是實現(xiàn)幾何相容的關鍵;③繪制元件;④更新位置,如在曲柄的轉角上疊加一個增量。
程序2:crank_rocker.pde——繪制曲柄搖桿機構
void crank_rocker (float x0,float y0,float angle){ //繪制曲柄搖桿機構
pushMatrix(); translate(x0,y0); rotate(radians(angle));
float len0=100; //已知參數(shù)賦值
float len1=300;
float dis12=150;
float ang1=-90+degrees(atan(len0*(cos(radians(ang0)))/(dis12-len0*sin(radians(ang0)))));
//參數(shù)計算
float xs=len0*cos(radians(ang0));
float ys=len0*sin(radians(ang0));
fixHingeSupport(0,0,0); //繪制元件
fixHingeSupport(0,dis12,0);
bar(0,0,len0,ang0);
bar(0,dis12,len1,ang1);
sleeve(xs,ys,ang1);
ang0=ang0+omega0; //更新位置
popMatrix(); }
1.4 動畫實現(xiàn)
在draw()函數(shù)中調用函數(shù)crank_rocker()即可產(chǎn)生動畫(見程序3)。曲柄初始角度(ang0)、屏幕刷新率(framerate)以及曲柄的角速度(omega0)則作為全局變量指定。需要將main.pde、crank_rocker.pde、main.pde置于同一文件夾下,或者將它們合并為一個文件。
程序3:main.pde——主程序
float ang0=0; //曲柄初始角度
int framerate=30; //屏幕刷新率(Hz)
float omega0=30./float(framerate); //角速度(度/秒)/屏幕刷新率
void setup() {
size(800,600); //屏幕尺寸
frameRate(framerate); /*屏幕刷新率(Hz)*/ }
void draw() {
background(255); //背景顏色
crank_rocker (400,350,0); /*繪制機構*/ }
2 Processing程序簡潔性
整個機構運動過程的模擬,只需要定義setup()、draw()和5個構件繪制子程序(其中4個為可重用元件代碼,在編制其它機構仿真程序時還可以使用),思路明確、代碼結構清晰。元件庫代碼由教師給出,學生練習時把重點放在具體的機構繪制子程序上,代碼量小,可即學即用。各元件運動學參數(shù)的幾何相容是實現(xiàn)機構運動仿真的關鍵,對于學生理解和掌握點和剛體的運動尤其重要。在掌握Processing程序的基本結構和語法后,幾個小時就可以寫出一個運行良好的機構運動仿真程序,非常高效。
用Processing進行平面機構運動仿真簡潔高效的原因是其封裝了坐標變換函數(shù),能方便地實現(xiàn)動畫。《理論力學》課程的運動學部分主要包括點的運動學和剛體的運動學,其中剛體的運動包含了點的運動,剛體的平面運動是其中最復雜、最難以理解和想象的內容。剛體的平面運動可以分解為隨基點的平動和繞基點定軸轉動的合成,Processing中的translate()函數(shù)和rotate()函數(shù)對應著這兩種運動。配對使用pushMatrix()和popMatrix()函數(shù)則構造了一個局部坐標系,利用pushMatrix()和popMatrix()函數(shù)可以在屏幕任意區(qū)域繪圖而不用考慮坐標系的轉換。在使用C/C++、Fortran、Matlab、Flash等語言編程時,坐標變換和對時間積分是最繁瑣的部分,Processing通過封裝函數(shù)非常巧妙而簡單地實現(xiàn)了這兩個功能,本文中的子程序都是利用這4個函數(shù)實現(xiàn)的。
需要注意的是:①Processing默認的坐標原點在屏幕左上角,x軸以向右為正,y軸以向下為正,轉角以順時針方向為正,參見圖2,需要注意編程時選取的元件繪圖參數(shù)是否適當;②各元件的位置直接由運動方程顯式給出。當運動方程復雜時,可能需要編寫求解程序或引入數(shù)學工具包進行求解,這時就必須引入MATLAB等數(shù)學軟件[4];③要給出各元件位置變化的迭代公式(如crank_rocker()函數(shù)中的ang0=ang0+omega0),否則無法實現(xiàn)動畫;④程序中角度值默認使用弧度為單位,如果需要按度計算,可通過degrees()和radians()這兩個函數(shù)進行轉換;⑤為了展示簡潔性,本文中的代碼對繪圖沒有進行任何美化。實際應用中,通過控制色彩、畫筆和渲染引擎,可將機構繪制得更美觀,甚至實現(xiàn)三維動畫仿真。
3 結語
運動學是理論力學課程的重點與難點,機構運動學仿真是實現(xiàn)理論力學CAI教學的關鍵。開源、自由軟件Processing的使用,可快速實現(xiàn)機構運動學仿真與可視化,簡單高效。Processing簡單、形象、有趣,一些基本的編程訓練對于力學、機械、土木類各專業(yè)后續(xù)計算機語言的學習和編程能力的提高都大有裨益。結合Processing和一些物理函數(shù)庫,還可擴展到理論力學課程教學各環(huán)節(jié)。
參考文獻:
[1] 苗彬,候燕.基于Moodle云的C語言輔助教學平臺設計[J].軟件導刊,2014(5):7-9.
[2] 列阿斯.愛上Processing[M].第2版.北京:人民郵電出版社,2014.
[3] 王鐸.理論力學 [M].第7版.北京:高等教育出版社,2009.
[4] 敖文剛,李勤,王歆.基于Matlab的理論力學計算機輔助教學[J].力學與實踐,2013,35(1):83-86.
(責任編輯:杜能鋼)