应用数学和力学
    主页 > 期刊导读 >

命令在力学教学动画演示中的应用

1 引言

动画演示在教学中具有直观清晰、丰富多彩、生动有趣、激发学生学习兴趣的作用。随着计算机图形技术(以下简称“CG”)的发展,越来越多的行业开始应用或者开发三维动画技术,在众多CG 领域中特别是动画电影制作拍摄和游戏制作及开发中,三维动画技术的应用更是屡见不鲜[1]。

本文仅以Matlab 软件中的drawnow 命令在动画制作中的应用为例,将其应用于力学教学中。这种动画制作方法简单实用、易操作、演示效果好,但却往往被很多人忽略,在教学中应用的并不普遍。

2 Matlab 软件drawnow 命令的二维动画仿真应用

Matlab 是由美国Mathworks 公司研发的主要面对科学计算、可视化和交互式程序设计的高科技计算环境。Matlab拥有大量的库函数,也允许用户自定义函数[2]。它将数值分析、矩阵计算、科学数据可视化与非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,具有方便的数据可视化功能,可以将向量和矩阵用图形表现出来,并对图形进行标注和打印。新版Matlab 软件增加了高层次的作图功能,包括二维和三维的可视化、图象处理、动画和函数作图[3]。

2.1 动画制作基础:直线运动动画

用drawnow 命令作动画的基本功是直线的运动动画,画直线的命令为h_L=plot([x1x2],[y1y2]),作动画一定是要循环的,这是第一个关键点,第二个关键点是改变对象的什么属性,有的是’xdata’、’ydata’,有的是改变’position’,直线需要改变的属性是’xdata’、’ydata’,程序如下(以下increment 简写为inc):

for i=1:n

set(h_L,’xdata’,[x1+i*inc1,x2+i*inc2],’ydata’,...

[y1+i*inc3,y2+i*inc4]);

drawnow;pause(value1);

end

横坐标和纵坐标的增量值若不同的话,直线除了移动还会带有缩放,要注意x、y的坐标显示范围必须在正确的位置给定,否则可能出现直线不动,坐标系移动的现象。

2.2 制作字母(以F 为例)或数字的运动动画

字母的显示命令格式为:h_t=text(x,y,’F’),但作动画时不是用的’xdata’,而是用的’position’,在循环中的语句格式为:

set(h_t,"position",[x1+i*inc1y1+i*inc2]),后面的 drawnow 命令是可有可无的。

根据以上知识,就能够作出一个力(并带有字母F)移动时的动画了,力的移动在力学中是常见的,箭头可以用三条直线表示,一条长线两条短线,有了以上知识,如果能做出矩形缩放的话,杆件拉伸或压缩的动画就可做出了。

2.3 制作矩形缩放动画

矩形画法:h_r=rectangle(gca,"position",[x0y0 w h]),矩形缩放指令:for i=1:200

set(h_r,"position",...

[x0+i*inc1y0+i*inc2 w+i*2*inc1 h+i*2*inc2]);

drawnow;pause(0.01);

end

3 “曲线”轨迹的应用

3.1 用一个标记点带画出任意曲线

此功能十分实用,可以像一支笔一样,画出任意曲线。以画出圆曲线为例,首先要画出标记点:

h_mb=line("marker","o","xdata",1,"ydata",0);

for i=0:200

set(h_mb,"xdata",cos(i*pi/100),

"ydata",sin(i*pi/100));

drawnow,pause(0.015);

j=i-1:i;

line(cos(j*pi/100),sin(j*pi/100),...

"color",[0.8 0.1 0.3],"linewidth",2);

end

注意标记点的起始位置与正弦和余弦的初相位角必须协调一致,相位角为零时对应的起始位置为(1,0),当角度为正时,逆时针画曲线,角度为负时,顺时针画曲线。

3.2 直线弯曲成为曲线

假设开始的直线为x轴上2~5,向下弯曲成抛物线,顶点在(3.5,y0),x轴上的截距为2 和5,截距中点x坐标为xm 截距的一半为a,抛物线方程为:(x-xm)^2=-a^2/y0*(y-y0);即:y=y0*(1-(x-xm).^2/a^2);

y0=0;

x=linspace(2,5,50);y=y0*(1-(x-3.5).^2/2.25);

h_Lwq=plot(x,y,"color",[0.8 0.4 0.3],"linewidth",5);

axis([0 6-0.5 0.2]);

for i=0:40

y0=-i*0.005;

set(h_Lwq,"ydata",y0*(1-(x-3.5).^2/2.25));

drawnow;pause(0.05);

end

由直线变为曲线的动画演示如图1 所示。

图1 由直线变为曲线的动画演示图