《MATLAB入门简单动画制作.pptx》由会员分享,可在线阅读,更多相关《MATLAB入门简单动画制作.pptx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、会计学1MATLAB入门简单入门简单(jindn)动画制作动画制作第一页,共27页。n n6-1 MATLAB 6-1 MATLAB 动画简介动画简介n n6-2 6-2 以电影方式产生动画以电影方式产生动画n n (a).(a).电影动画之范例一电影动画之范例一n n (b).(b).电影动画之范例二电影动画之范例二n n (c).(c).电影动画之范例三电影动画之范例三n n6-36-3以对象以对象(duxing)(duxing)方式产生动画方式产生动画n n (a).(a).曲线的动画曲线的动画n n (b).(b).曲线的曲线的 EraseMode EraseModen n (c).(
2、c).对象对象(duxing)(duxing)动画之范例动画之范例第1页/共27页第二页,共27页。6-1 MATLAB 动画简介动画简介(jin ji)n nMATLAB MATLAB 产生动画的方式有两种:产生动画的方式有两种:n n电影方式:电影方式:n n以影像的方式预存多个画面,再将这些画面快速的呈现在屏幕上,以影像的方式预存多个画面,再将这些画面快速的呈现在屏幕上,就可以得到动画的效果。此种方式类似于电影的原理就可以得到动画的效果。此种方式类似于电影的原理(yunl(yunl),可以,可以产生很缤纷亮丽的动画,但是其缺点为每个画面都必需事先备妥,产生很缤纷亮丽的动画,但是其缺点为每
3、个画面都必需事先备妥,无法进行及时成像(无法进行及时成像(Real-time RenderingReal-time Rendering),而且每个画面,以至于),而且每个画面,以至于整套动画,都必需占用相当大的内存空间。整套动画,都必需占用相当大的内存空间。n n物件方式:物件方式:n n在在 MATLAB MATLAB 的握把式图形(的握把式图形(Handle GraphicsHandle Graphics,详见本书第七,详见本书第七章)概念下,所有的曲线或曲面均可被视为一个对象,章)概念下,所有的曲线或曲面均可被视为一个对象,MATLAB MATLAB 可以很快的抹去旧曲线,并产生相似但不
4、同的新曲线,此时就可可以很快的抹去旧曲线,并产生相似但不同的新曲线,此时就可以看到曲线随时间而变化的效果。使用对象方式(即握把式图形)以看到曲线随时间而变化的效果。使用对象方式(即握把式图形)所产生的动画,可以呈现实时的变化,也不需要太高的内存需求,所产生的动画,可以呈现实时的变化,也不需要太高的内存需求,但其缺点是较难产生太复杂的动画。但其缺点是较难产生太复杂的动画。第2页/共27页第三页,共27页。6-2 以电影方式以电影方式(fngsh)产生动产生动画画n n以电影方式来产生动画,可由下列两个步骤来达成:n n使用 getframe 指令(zhlng)来抓取图形做为电影的画面,每个画面都
5、是以一个行向量的方式,置放于整个代表电影的矩阵。n n使用 movie 指令(zhlng)来播放电影,并可指定播放的重复次数及每秒播放的画面数目。第3页/共27页第四页,共27页。电影电影(dinyng)动画之范例一动画之范例一n n在下例中,我们将以不同的角度来显示 peaks 函数,并将其结果以电影(dinyng)的方式来呈现动画。n n范例6-1:movie01.mclear M%清除电影资料矩阵 Mn=50;%抓取 50 个画面(humin)peaks;fprintf(抓取画面(humin)中.n);for i=1:nview(-37.5+i*360/n,30);%改变观测角度M(i)
6、=getframe;%抓取画面(humin),并存入电影资料矩阵 Mendfprintf(播放电影中.n);movie(M,3);%播放电影三次第4页/共27页第五页,共27页。电影电影(dinyng)动画之范例一动画之范例一n n最后一个(y)frame 的画面第5页/共27页第六页,共27页。电影电影(dinyng)动画之范例二动画之范例二n n将 peaks 函数画在圆盘上,然后再变换此函数的高度,以动画呈现(chngxin)n n范例6-2:movie02.mclear M%清除电影资料矩阵(j zhn)Mr=linspace(0,4,30);%圆盘的半径t=linspace(0,2*
7、pi,50);%圆盘的极坐标角度rr,tt=meshgrid(r,t);xx=rr.*cos(tt);%产生圆盘上的 x 坐标yy=rr.*sin(tt);%产生圆盘上的 y 坐标zz=peaks(xx,yy);%产生 peaks 在极坐标的数据n=30;%抓取 30 个画面scale=cos(linspace(0,2*pi,n);fprintf(抓取画面中.n);for i=1:nsurf(xx,yy,zz*scale(i);%画图axis(-inf inf-inf inf-8.5 8.5);%固定图轴的范围box onM(i)=getframe;%抓取画面,并存入电影资料矩阵(j zhn)
8、M endfprintf(播放电影中.n);movie(M,5);%播放电影 5 次第6页/共27页第七页,共27页。电影电影(dinyng)动画之范例二动画之范例二n n最后一个(y)frame 的画面第7页/共27页第八页,共27页。电影电影(dinyng)动画之范例三动画之范例三n n改变影像的色盘矩阵(j zhn),让影像出现从正片变到负片的效果n n范例6-3:movie03.mclear M%清除电影资料矩阵 Mload clown.matimage(X);colormap(map);%画出小丑脸n=30;%抓取 30 个画面scale=cos(linspace(0,2*pi,n)
9、;fprintf(抓取画面中.n);for i=1:ncolormap(i-1)*(1-map)+(n-i)*map)/n);%改变色盘矩阵M(i)=getframe;%抓取画面,并存入电影资料矩阵 M endfprintf(播放电影中.n);movie(M,-5);%播放电影 5 次(含正向(zhn xin)与逆向播放)第8页/共27页第九页,共27页。电影电影(dinyng)动画之范例三动画之范例三n n在上述范例中,正片(如下张投影片(yngpin)图左)的色盘矩阵是 map,而 1-map 则是负片(如下张投影片(yngpin)图右)的色盘矩阵,因此我们在抓影片(yngpin)时,让色
10、盘矩阵进行渐进式的变化,因此呈现的电影就有从正片变到负片的效果。n n另外,movie(M,-5)代表电影将播放 5 次,但由于第二个参数是负数,所以每次播放会包含一次正向播放及一次逆向播放。第9页/共27页第十页,共27页。电影电影(dinyng)动画之范例三动画之范例三n n正片正片(zhngpin)(zhngpin)n n色盘矩阵是色盘矩阵是 map mapn n负片负片(fpin)(fpin)n n色盘矩阵是色盘矩阵是 1-map 1-map第10页/共27页第十一页,共27页。电影电影(dinyng)动画的其他范例动画的其他范例n nMATLAB 的 demo 程序中亦包含了数个与电
11、影(dinyng)方式相关的动画,读者可以在指令窗口输入下列任一指令:n nxpmovie vibes n nxpmovie logospinn nxpmovie crulspin第11页/共27页第十二页,共27页。6-3 以对象方式以对象方式(fngsh)产生动产生动画画n n以电影方式产生动画可以说是暴力法,因为此方法占掉了许多内以电影方式产生动画可以说是暴力法,因为此方法占掉了许多内存空间。另一个技巧性较高的方法则是以对象方式产生动画,此种方存空间。另一个技巧性较高的方法则是以对象方式产生动画,此种方法不需要法不需要(xyo)(xyo)大量的内存,而且可以产生实时(大量的内存,而且可以
12、产生实时(Real-timeReal-time)或)或交互式(交互式(InteractiveInteractive)的动画。)的动画。n nMATLAB MATLAB 的所有图形组件(曲线、曲面、图轴等)都是对象,您可以的所有图形组件(曲线、曲面、图轴等)都是对象,您可以控制这些对象的各种性质,此种特性称为握把式图形(控制这些对象的各种性质,此种特性称为握把式图形(Handle Handle GraphicsGraphics),可详见第七章。握把式图形包含的层面很广,但牵涉到),可详见第七章。握把式图形包含的层面很广,但牵涉到动画部份的基本概念并不复杂,以下我们以曲线的动画来说明。动画部份的基
13、本概念并不复杂,以下我们以曲线的动画来说明。第12页/共27页第十三页,共27页。曲线曲线(qxin)的动画的动画n n我们可以快速地改变图形对象的性质(如颜色、坐标等),就可以达到动画的效果n n每一条曲线都有下列(xili)三种性质:n nxdata:此为一向量,代表曲线的 x 坐标值n nydata:此为一向量,代表曲线的 y 坐标值n nEraseMode:此为一字符串,代表曲线被抹除的方式,亦即当 xdata 或 ydata 被改变时,对于旧曲线的处理方式。第13页/共27页第十四页,共27页。曲线曲线(qxin)的的 EraseModen nEraseMode EraseMode
14、对于动画的呈现相当重要对于动画的呈现相当重要(zhngyo)(zhngyo),此字符串可是下列几种,此字符串可是下列几种选择:选择:n nnormalnormal:重画整个画面。:重画整个画面。n nxorxor:将旧曲线的点以:将旧曲线的点以 xor xor 的方式还原。的方式还原。n nbackgroundbackground:将旧曲线的点改成背景颜色。:将旧曲线的点改成背景颜色。n nnonenone:保留旧曲线的点,不做任何处理。:保留旧曲线的点,不做任何处理。n n在上述四种在上述四种 EraseMode EraseMode 中,耗费时间的次序是中,耗费时间的次序是n nnormal
15、 xor background nonenormal xor background nonen nxor xor 和和 background background 很接近,但是很接近,但是 background background 会抹去其他旧曲线所扫过的其会抹去其他旧曲线所扫过的其他对象(如图轴、网格线、另一条曲线等),所以较少用到,所以一般他对象(如图轴、网格线、另一条曲线等),所以较少用到,所以一般在产生动画时,最常用到的在产生动画时,最常用到的 EraseMode EraseMode 就是就是 xor xor。第14页/共27页第十五页,共27页。曲线曲线(qxin)的动画的动画n
16、n有了这些概念后,产生曲线的动画就很容易了!其主要步骤有两点:n n产生一条曲线,其 EraseMode 为 xor,background,或 none。n n在 for-loop 之中,改变此曲线的 xdata 或 ydata(或两者)。n n我们产生一条随 x 而衰减的正弦曲线,并让 k 随时间(shjin)而便大(即改变正弦波的相角),使整条曲线产生舞动的效果。第15页/共27页第十六页,共27页。对象对象(duxing)动画之范例一动画之范例一n n我们产生(chnshng)一条衰减的正弦曲线n n让 k 随时间而便大(即改变正弦波的相角),使整条曲线产生(chnshng)舞动的效果。
17、n n范例6-1:movie04.mx=0:0.1:8*pi;h=plot(x,sin(x).*exp(-x/5),EraseMode,xor);axis(-inf inf-1 1);%设定(sh dn)图轴的范围grid on%画出网格线for i=1:5000y=sin(x+i/50).*exp(-x/5);set(h,ydata,y);%设定(sh dn)新的 y 坐标drawnow%立即作图end第16页/共27页第十七页,共27页。对象对象(duxing)动画之范例一动画之范例一n n我们产生一条衰减的正弦曲线n n让 k 随时间而便大(即改变正弦波的相角(xin jio)),使整条
18、曲线产生舞动的效果。n n范例6-1:movie04.mx=0:0.1:8*pi;h=plot(x,sin(x).*exp(-x/5),EraseMode,xor);axis(-inf inf-1 1);%设定图轴的范围grid on%画出网格线for i=1:5000y=sin(x+i/50).*exp(-x/5);set(h,ydata,y);%设定新的 y 坐标(zubio)drawnow%立即作图end第17页/共27页第十八页,共27页。对象对象(duxing)动画之范例一动画之范例一n n最后一个(y)frame 的画面第18页/共27页第十九页,共27页。对象对象(duxing)
19、动画之范例一动画之范例一n n在上例中,我们使用在上例中,我们使用(sh(sh yng)set yng)set 指令,总共改变曲线的指令,总共改变曲线的 y y 坐标坐标 5000 5000 次,次,并以并以 xor xor 的方式抹掉旧曲线。的方式抹掉旧曲线。n n drawnow drawnow 的作用是使的作用是使 MATLAB MATLAB 立刻处理立刻处理 set set 指令,若无指令,若无 drawnow drawnow,MATLAB MATLAB 会累积会累积 set set 指令,直到指令,直到 for-loop for-loop 结束时再一并处理图形的变化,结束时再一并处理
20、图形的变化,这时就不会看到动画的效果。这时就不会看到动画的效果。n n如果您将上例的如果您将上例的 EraseMode EraseMode 改成改成 background background,则会发现曲线会,则会发现曲线会“抹掉抹掉”图图形中的网格线及代表图轴的直线。形中的网格线及代表图轴的直线。n n如果您将上例的如果您将上例的 EraseMode EraseMode 改成改成 none none,则旧的曲线会被保留下来,产生,则旧的曲线会被保留下来,产生不同的效果。不同的效果。第19页/共27页第二十页,共27页。对象对象(duxing)动画之范例动画之范例:MATLABn nMATLA
21、B MATLAB 有很多对象动画之范例:有很多对象动画之范例:n nlorenzlorenz:以:以3D3D动画呈现的动画呈现的 Lorenz Lorenz 混沌方程式(混沌方程式(Chaotic EquationChaotic Equation),好像慧星),好像慧星在运行。在运行。n ntrusstruss:一座桥梁在地震时的震动:一座桥梁在地震时的震动(zhndng)(zhndng)方式,共有方式,共有 12 12 种喔!种喔!n ntraveltravel:显示如何以杂乱搜寻(:显示如何以杂乱搜寻(Random SearchRandom Search)的方式来解)的方式来解 Trave
22、ling Traveling Salesperson Problem.Salesperson Problem.n nfitdemofitdemo:显示如何以:显示如何以 Downhill Simplex Search Downhill Simplex Search 来解决非线性曲线拟合来解决非线性曲线拟合(Nonlinear Curve FittingNonlinear Curve Fitting)的问题。)的问题。n nspinnerspinner:常见的屏幕保护程序。:常见的屏幕保护程序。n nxphidexphide:试试您的眼力:试试您的眼力。第20页/共27页第二十一页,共27页。对
23、象对象(duxing)动画之范例动画之范例:Simulinkn n若您有安装 Simulink,可试试下列动态(dngti)系统仿真加上动画呈现:n nonecart:传统的弹簧加上砝码的动态(dngti)系统。n ndblcart1:一条弹簧加上两个砝码的动态(dngti)系统。n nsimppend:简单的单摆系统。n ndblpend1:两截的摆动系统。n ndblpend2:更复杂的摆动系统。n npenddemo:倒单摆系统。第21页/共27页第二十二页,共27页。对象对象(duxing)动画之范例动画之范例:模模糊工具箱糊工具箱n n如果您有安装如果您有安装 Fuzzy Logic
24、 Toolbox Fuzzy Logic Toolbox,可以试试由张老师开发的各项模,可以试试由张老师开发的各项模拟及动画展示:拟及动画展示:n nfcmdemofcmdemo:Fuzzy C-means Clustering Fuzzy C-means Clustering。n njugglerjuggler:用板子接皮球。:用板子接皮球。n ninvkineinvkine:两截机器:两截机器(j q)(j q)手臂的手臂的 Inverse Kinematics Inverse Kinematics。n nslcp1slcp1:倒单摆,杆子长度随时间而变,您可以控制所欲到达的位置。:倒单摆
25、,杆子长度随时间而变,您可以控制所欲到达的位置。n nslcpp1slcpp1:双倒单摆,其中一个杆子的长度随时间而变,您可以控制所:双倒单摆,其中一个杆子的长度随时间而变,您可以控制所欲到达的位置。欲到达的位置。n nslbbslbb:跷跷板加上滚球系统,您可以控制球的最后位置。:跷跷板加上滚球系统,您可以控制球的最后位置。n nsltbusltbu:倒车入库系统:倒车入库系统第22页/共27页第二十三页,共27页。以以以以对对对对象象象象方方方方式式式式产产产产生生生生动动动动画画画画,呈呈呈呈现现现现一一一一个个个个小小小小圆圆圆圆(半半半半径径径径为为为为 1 1)在在在在一一一一个个
26、个个大大大大圆圆圆圆(d(d yun)yun)(半半半半径径径径为为为为 3 3)的的的的圆圆圆圆周周周周外外外外部部部部滚动的动画。滚动的动画。滚动的动画。滚动的动画。function mymovie02function mymovie02close allclose alltheta=0:0.1:2*pi;theta=0:0.1:2*pi;r1=3;r1=3;x1=r1*cos(theta);x1=r1*cos(theta);y1=r1*sin(theta);y1=r1*sin(theta);plot(x1,y1),axis imageplot(x1,y1),axis image%大圆大圆
27、(d(d yun)yun)r2=1;r2=1;center=(r1+r2)*1,0;center=(r1+r2)*1,0;x2=r2*cos(theta);x2=r2*cos(theta);y2=r2*sin(theta);y2=r2*sin(theta);h=line(center(1)+x2,center(2)+y2,EraseMode,xor,color,r);h=line(center(1)+x2,center(2)+y2,EraseMode,xor,color,r);%小圆小圆axis(-5 5-5 5);axis(-5 5-5 5);%设定图轴的范围设定图轴的范围n=5;n=5;%
28、转转5 5圈圈theta1=0:0.005:n*2*pi;theta1=0:0.005:n*2*pi;for i=1:length(theta1);for i=1:length(theta1);center=(r1+r2)*cos(theta1(i),sin(theta1(i);center=(r1+r2)*cos(theta1(i),sin(theta1(i);set(h,xdata,center(1)+x2,ydata,center(2)+y2);set(h,xdata,center(1)+x2,ydata,center(2)+y2);%设定小圆的设定小圆的 x,y x,y 坐标坐标dra
29、wnowdrawnow%立即作图立即作图endend第23页/共27页第二十四页,共27页。function mymovie02_2function mymovie02_2close allclose alltheta=0:0.1:2*pi;theta=0:0.1:2*pi;r1=3;r1=3;circle1=r1*exp(sqrt(-1)*theta);circle1=r1*exp(sqrt(-1)*theta);%大圆大圆plot(circle1),axis imageplot(circle1),axis imager2=1;r2=1;circle2=r2*exp(sqrt(-1)*the
30、ta);circle2=r2*exp(sqrt(-1)*theta);%小圆小圆center=r1+r2;center=r1+r2;h=line(real(center+circle2),imag(center+circle2),EraseMode,xor,color,r);h=line(real(center+circle2),imag(center+circle2),EraseMode,xor,color,r);axis(-5 5-5 5);axis(-5 5-5 5);%设定图轴的范围设定图轴的范围n=5;n=5;%转转5 5圈圈theta1=0:0.005:n*2*pi;theta1=
31、0:0.005:n*2*pi;for i=1:length(theta1);for i=1:length(theta1);center=(r1+r2)*exp(sqrt(-1)*(theta1(i);center=(r1+r2)*exp(sqrt(-1)*(theta1(i);set(h,xdata,real(center+circle2),ydata,imag(center+circle2);%set(h,xdata,real(center+circle2),ydata,imag(center+circle2);%设定小圆的设定小圆的 x,y x,y 坐标坐标(zubio)(zubio)dr
32、awnowdrawnow%立即作图立即作图endend第24页/共27页第二十五页,共27页。以以以以对对对对象象象象方方方方式式式式产产产产生生生生(ch(ch nshng)nshng)动动动动画画画画,呈呈呈呈现现现现一一一一个个个个圆圆圆圆圈圈圈圈(半半半半径径径径为为为为 1 1)由由由由画画画画面面面面左左左左边边边边滚滚滚滚到到到到右右右右边,圆周上的任一点所拉出的一条摆线。边,圆周上的任一点所拉出的一条摆线。边,圆周上的任一点所拉出的一条摆线。边,圆周上的任一点所拉出的一条摆线。function cycloid01function cycloid01%摆线摆线(b(b i xin
33、)i xin)的动画的动画,x=0:0.01:5*pi;x=0:0.01:5*pi;theta=linspace(0,2*pi);theta=linspace(0,2*pi);r=1;r=1;circle=j+r*exp(sqrt(-1)*theta);circle=j+r*exp(sqrt(-1)*theta);subplot(2,1,1);subplot(2,1,1);circleH=plot(circle);axis imagecircleH=plot(circle);axis imageset(circleH,erase,xor);set(circleH,erase,xor);axis
34、(min(x)-r,max(x)+r,-0.5,2*r+0.5);axis(min(x)-r,max(x)+r,-0.5,2*r+0.5);dot1H=line(0,0,marker,o,color,k,erase,xor);dot1H=line(0,0,marker,o,color,k,erase,xor);dot2H=line(0,0,marker,.,color,r,erase,none);dot2H=line(0,0,marker,.,color,r,erase,none);for i=1:length(x)for i=1:length(x)set(circleH,xdata,x(i)
35、+real(circle);set(circleH,xdata,x(i)+real(circle);angle=-pi/2-x(i);angle=-pi/2-x(i);set(dot1H,xdata,x(i)+cos(angle),ydata,r+sin(angle);set(dot1H,xdata,x(i)+cos(angle),ydata,r+sin(angle);set(dot2H,xdata,x(i)+cos(angle),ydata,r+sin(angle);set(dot2H,xdata,x(i)+cos(angle),ydata,r+sin(angle);%line(xdata,
36、x(i)+cos(angle),ydata,r+sin(angle),color,r,marker,.);line(xdata,x(i)+cos(angle),ydata,r+sin(angle),color,r,marker,.);drawnowdrawnowendend第25页/共27页第二十六页,共27页。以对象的方式产生动画,呈现下列以对象的方式产生动画,呈现下列以对象的方式产生动画,呈现下列以对象的方式产生动画,呈现下列(xili)(xili)方程式:方程式:方程式:方程式:y=cos2(x+k)*exp(-x/5)y=cos2(x+k)*exp(-x/5)让让让让 k k 随时间而
37、变大,来显示此方程式的动画。随时间而变大,来显示此方程式的动画。随时间而变大,来显示此方程式的动画。随时间而变大,来显示此方程式的动画。function mymovie06function mymovie06x=0:0.1:8*pi;x=0:0.1:8*pi;k=0;k=0;h=plot(x,cos(x+k).*cos(x+k).*exp(-x/5),EraseMode,xor);h=plot(x,cos(x+k).*cos(x+k).*exp(-x/5),EraseMode,xor);axis(-inf inf-1 1);axis(-inf inf-1 1);%设定设定(sh dn(sh dn)图轴的范围图轴的范围grid ongrid on%画出网格线画出网格线for k=1:0.01:50for k=1:0.01:50y=cos(x+k).*cos(x+k).*exp(-x/5);y=cos(x+k).*cos(x+k).*exp(-x/5);set(h,ydata,y);set(h,ydata,y);%设定设定(sh dn(sh dn)新的新的 y y 坐标坐标drawnowdrawnow%立即作图立即作图endend第26页/共27页第二十七页,共27页。