Processing软件在辅助教学中的应用

2017-03-31 19:00蒋寅军邹良浩
软件导刊 2016年8期
关键词:计算机辅助教学运动学动画

蒋寅军+邹良浩

摘 要:Processing软件是一个自由、开源的视觉艺术及视觉化呈现的程序设计平台,是专为艺术家设计的程序语言,尤其适合于由程序控制的动画开发。将Processing软件用于機构运动仿真,辅助《理论力学》课程中运动学部分的教学,比传统运动学仿真程序更简洁高效。该软件对学习其它程序设计语言也有帮助。

关键词关键词:Processing;计算机辅助教学;运动学;机构运动仿真;动画

DOIDOI:10.11907/rjdk.161228

中图分类号:G434

文献标识码:A 文章编号:1672-7800(2016)008-0189-03

作者简介作者简介:蒋寅军(1973-),男,湖南长沙人,武汉大学土木建筑工程学院讲师,研究方向为理论力学、结构力学。

0 引言

Processing语言是由美国MIT(麻省理工学院)的Medialab研究室美学与计算机研究小组于2001年发布使用的用于视觉艺术及视觉化呈现的程序设计平台,其设计初衷是作为一种简单的编程教学语言替代Basic、Logo等编程语言,在电子艺术的环境下介绍程序语言,并将电子艺术的概念介绍给程序设计师[1-2]。

Processing为艺术家和设计师所设计,具有以下特点:①简单:用户可以专注于图形与交互程序的设计,而不需要考虑诸如编译参数、路径、图形环境等任务;②友好:Processing有非常活跃的社区和用户群,容易得到支持,版本更新也很快;③基础性:只考虑静态图案;④活动性:直接形成动画。

Processing源于Java,因此其代码遵守Java语言规范。Processing是绿色、开源的自由软件, Windows系统使用的下载包只有108.32M,解压即可使用,运行界面如图1所示。

《理论力学》课程由静力学、运动学与动力学3部分组成,其中最难掌握的是运动学部分,对机构运动分析不清楚直接导致速度、加速度分析的困难,进而影响动力学基本原理的应用。运动学部分的教学需要直观生动的工具演示机构的运动情况,传统的方法是教师运用C/C++、Fortran、Matlab、Flash等语言或软件编制CAI教学程序,或运用UG、Solidworks等大型机械设计软件进行机构运动仿真,这两种方法的缺点是:自编软件数据结构及算法复杂,动画难以实现;大型机械设计软件操作复杂,价格昂贵;制作的CAI课件很难扩展与改动。笔者在接触到Processing后,认为该软件非常适于辅助理论力学运动学部分教学,简单的几十行代码就可以构造一个机构并使之运动,而且代码的可重用性很好,稍加扩展就可构成诸多常见机构并生成动画,值得推荐给理论力学任课教师使用。

下面以《理论力学》课程中常见的曲柄摇杆机构为例,说明利用processing软件进行机构运动仿真的应用过程,见图2。

1 曲柄摇杆机构运动仿真

一个典型的Processing程序主要由setup()和draw()两个函数组成:在setup()函数中完成图像、动画的设置(如屏幕尺寸、刷新频率等),在draw()函数中实现动画。可以定义其它子程序进行一些必须的参数计算和图形绘制。

1.1 物理模型分析

Processing绘制动画的策略是在屏幕上逐时刻绘制图形图像,因此首先分析机构的物理构成:图2所示曲柄摇杆机构由4类元件构成:杆件(2根——OA、O1B)、基础(在固定铰支座中绘制)、固定铰支座(2个——O、O1)、套筒(1个——A)。理论力学中的平面机构基本都包含这些元件[3],也是机构运动动画图形绘制的元素。

1.2 元件绘制——可重用代码

绘制每个元件的子程序只需两类参数:位置参数(屏幕坐标x、y,方位角angle)、尺寸参数(长、宽、高等)。对于本例涉及的4类元件,其子程序详见程序1。元件的不同组合可以构成不同的机构,因此元件绘制代码是可重用的。

绘制元件有多种方式实现,如杆件可以用两点间的直线表示,但这无助于学生理解刚体的平面运动,若转换为通过端点坐标和杆件与x轴的夹角来绘制,则更便于表示杆件随基点的平动和绕基点的转动。

各子程序中使用了部分绝对尺寸,如固定铰支座及套筒。也可以将这些物理量定义为子程序的参数,由用户在使用时指定,但这无疑会带来程序编制和使用上的复杂性。

程序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); //调用基础绘制函数

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 整体机构绘制——几何约束条件

一个机构事实上是一系列受约束的点和刚体的集合,各元件必须满足几何约束条件(也可称为几何相容条件、几何协调条件)。

对于图2所示的曲柄摇杆机构,根据几何关系及已知条件可知:

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杆的角速度,其随时间变化的规律f(t)通常是已知的;θOA t = 0 为OA杆在t=0时刻与x轴的夹角;dOO1为O、O1两支座间的距离。

考虑上述几何约束条件,利用之前构建的可重用元件代码,即可写出绘制整个曲柄摇杆机构的子程序crank_rocker()(见程序2)。该子程序主要包含3个部分:①已知参数赋值,如各杆长度、支座间距等;②与时间有关的参数计算,如摇杆角度、套筒位置等,其中摇杆角度ang1的计算是实现几何相容的关键;③绘制元件;④更新位置,如在曲柄的转角上叠加一个增量。

程序2:crank_rocker.pde——绘制曲柄摇杆机构

void crank_rocker (float x0,float y0,float angle){ //绘制曲柄摇杆机构

pushMatrix(); translate(x0,y0); rotate(radians(angle));

float len0=100; //已知参数赋值

float len1=300;

float dis12=150;

float ang1=-90+degrees(atan(len0*(cos(radians(ang0)))/(dis12-len0*sin(radians(ang0)))));

//参数计算

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 动画实现

在draw()函数中调用函数crank_rocker()即可产生动画(见程序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个为可重用元件代码,在编制其它机构仿真程序时还可以使用),思路明确、代码结构清晰。元件库代码由教师给出,学生练习时把重点放在具体的机构绘制子程序上,代码量小,可即学即用。各元件运动学参数的几何相容是实现机构运动仿真的关键,对于学生理解和掌握点和刚体的运动尤其重要。在掌握Processing程序的基本结构和语法后,几个小时就可以写出一个运行良好的机构运动仿真程序,非常高效。

用Processing进行平面机构运动仿真简洁高效的原因是其封装了坐标变换函数,能方便地實现动画。《理论力学》课程的运动学部分主要包括点的运动学和刚体的运动学,其中刚体的运动包含了点的运动,刚体的平面运动是其中最复杂、最难以理解和想象的内容。刚体的平面运动可以分解为随基点的平动和绕基点定轴转动的合成,Processing中的translate()函数和rotate()函数对应着这两种运动。配对使用pushMatrix()和popMatrix()函数则构造了一个局部坐标系,利用pushMatrix()和popMatrix()函数可以在屏幕任意区域绘图而不用考虑坐标系的转换。在使用C/C++、Fortran、Matlab、Flash等语言编程时,坐标变换和对时间积分是最繁琐的部分,Processing通过封装函数非常巧妙而简单地实现了这两个功能,本文中的子程序都是利用这4个函数实现的。

需要注意的是:①Processing默认的坐标原点在屏幕左上角,x轴以向右为正,y轴以向下为正,转角以顺时针方向为正,参见图2,需要注意编程时选取的元件绘图参数是否适当;②各元件的位置直接由运动方程显式给出。当运动方程复杂时,可能需要编写求解程序或引入数学工具包进行求解,这时就必须引入MATLAB等数学软件[4];③要给出各元件位置变化的迭代公式(如crank_rocker()函数中的ang0=ang0+omega0),否则无法实现动画;④程序中角度值默认使用弧度为单位,如果需要按度计算,可通过degrees()和radians()这两个函数进行转换;⑤为了展示简洁性,本文中的代码对绘图没有进行任何美化。实际应用中,通过控制色彩、画笔和渲染引擎,可将机构绘制得更美观,甚至实现三维动画仿真。

3 结语

运动学是理论力学课程的重点与难点,机构运动学仿真是实现理论力学CAI教学的关键。开源、自由软件Processing的使用,可快速实现机构运动学仿真与可视化,简单高效。Processing简单、形象、有趣,一些基本的编程训练对于力学、机械、土木类各专业后续计算机语言的学习和编程能力的提高都大有裨益。结合Processing和一些物理函数库,还可扩展到理论力学课程教学各环节。

参考文献:

[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.

(责任编辑:杜能钢)

猜你喜欢
计算机辅助教学运动学动画
做个动画给你看
动画发展史
基于MATLAB的6R机器人逆运动学求解分析
基于D-H法的5-DOF串并联机床运动学分析
计算机辅助教学在中学美术教学中的应用
我是动画迷
基于运动学原理的LBI解模糊算法
双足机器人运动学分析与仿真