资源描述
,按一下以編輯母片標題樣式,按一下以編輯母片,第二層,第三層,第四層,第五層,*,MATLAB,程式設計入門篇:動畫製作,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,MATLAB,程式設計入門篇:動畫製作,MATLAB,程序设计入门篇动画制作,张智星 清大资工系,补充内容:方炜 台大生机系,1,6-1,MATLAB,动画简介,6-2 以电影方式产生动画,(,a).,电影动画之范例一,(b).,电影动画之范例,二,(c).,电影动画之范例,三,6-3以对象方式产生动画,(a).,曲线的动画,(b).,曲线的,EraseMode,(c).,对象动画之范例,2,6-1,MATLAB,动画简介,MATLAB,产生动画的方式有两种:,电影方式:,以影像的方式预存多个画面,再将这些画面快速的呈现在屏幕上,就可以得到动画的效果。此种方式类似于电影的原理,可以产生很缤纷亮丽的动画,但是其缺点为每个画面都必需事先备妥,无法进行及时成像(,Real-time Rendering),,而且每个画面,以至于整套动画,都必需占用相当大的内存空间。,物件方式:,在,MATLAB,的握把式图形(,Handle Graphics,,详见本书第七章)概念下,所有的曲线或曲面均可被视为一个对象,,MATLAB,可以很快的抹去旧曲线,并产生相似但不同的新曲线,此时就可以看到曲线随时间而变化的效果。使用对象方式(即握把式图形)所产生的动画,可以呈现实时的变化,也不需要太高的内存需求,但其缺点是较难产生太复杂的动画。,3,6-2 以电影方式产生动画,以电影方式来产生动画,可由下列两个步骤来达成:,使用,getframe,指令来抓取图形做为电影的画面,每个画面都是以一个行向量的方式,置放于整个代表电影的矩阵。,使用,movie,指令来播放电影,并可指定播放的重复次数及每秒播放的画面数目。,4,电影动画之范例一,在下例中,我们将以不同的角度来显示,peaks,函数,并将其结果以电影的方式来呈现动画。,范例6-1:,movie01.m,clear M%,清除电影资料矩阵,M,n=50;%,抓取 50 个画面,peaks;,fprintf(,抓取画面中.,n);,for i=1:n,view(-37.5+i*360/n,30);%,改变观测角度,M(i)=getframe;%,抓取画面,并存入电影资料矩阵,M,end,fprintf(,播放电影中.,n);,movie(M,3);%,播放电影三次,5,电影动画之范例一,最后一个,frame,的画面,6,电影动画之范例二,将,peaks,函数画在圆盘上,然后再变换此函数的高度,以动画呈现,范例6-2:,movie02.m,clear M%,清除电影资料矩阵,M,r=linspace(0,4,30);%,圆盘的半径,t=linspace(0,2*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:n,surf(xx,yy,zz*scale(i);%,画图,axis(-inf inf-inf inf-8.5 8.5);%,固定图轴的范围,box on,M(i)=getframe;%,抓取画面,并存入电影资料矩阵,M,end,fprintf(,播放电影中.,n);,movie(M,5);%,播放电影 5 次,7,电影动画之范例二,最后一个,frame,的画面,8,电影动画之范例三,改变影像的色盘矩阵,让影像出现从正片变到负片的效果,范例6-3:,movie03.m,clear M%,清除电影资料矩阵,M,load clown.mat,image(X);colormap(map);%,画出小丑脸,n=30;%,抓取 30 个画面,scale=cos(linspace(0,2*pi,n);,fprintf(,抓取画面中.,n);,for i=1:n,colormap(i-1)*(1-map)+(n-i)*map)/n);%,改变色盘矩阵,M(i)=getframe;%,抓取画面,并存入电影资料矩阵,M,end,fprintf(,播放电影中.,n);,movie(M,-5);%,播放电影 5 次(含正向与逆向播放),9,电影动画之范例三,在上述范例中,正片(如下张投影片图左)的色盘矩阵是,map,,而 1-,map,则是负片(如下张投影片图右)的色盘矩阵,因此我们在抓影片时,让色盘矩阵进行渐进式的变化,因此呈现的电影就有从正片变到负片的效果。,另外,,movie(M,-5),代表电影将播放 5 次,但由于第二个参数是负数,所以每次播放会包含一次正向播放及一次逆向播放。,10,电影动画之范例三,正片,色盘矩阵是,map,负片,色盘矩阵是 1-,map,11,电影动画的其他范例,MATLAB,的,demo,程序中亦包含了数个与电影方式相关的动画,读者可以在指令窗口输入下列任一指令:,xpmovie vibes,xpmovie logospin,xpmovie crulspin,12,6-3以对象方式产生动画,以电影方式产生动画可以说是暴力法,因为此方法占掉了许多内存空间。另一个技巧性较高的方法则是以对象方式产生动画,此种方法不需要大量的内存,而且可以产生实时(,Real-time),或交互式(,Interactive),的动画。,MATLAB,的所有图形组件(曲线、曲面、图轴等)都是对象,您可以控制这些对象的各种性质,此种特性称为握把式图形(,Handle Graphics),,可详见第七章。握把式图形包含的层面很广,但牵涉到动画部份的基本概念并不复杂,以下我们以曲线的动画来说明。,13,曲线的动画,我们可以快速地改变图形对象的性质(如颜色、坐标等),就可以达到动画的效果,每一条曲线都有下列三种性质:,xdata:,此为一向量,代表曲线的,x,坐标值,ydata:,此为一向量,代表曲线的,y,坐标值,EraseMode:,此为一字符串,代表曲线被抹除的方式,亦即当,xdata,或,ydata,被改变时,对于旧曲线的处理方式。,14,曲线的,EraseMode,EraseMode,对于动画的呈现相当重要,此字符串可是下列几种选择:,normal:,重画整个画面。,xor:,将旧曲线的点以,xor,的方式还原。,background:,将旧曲线的点改成背景颜色。,none:,保留旧曲线的点,不做任何处理。,在上述四种,EraseMode,中,耗费时间的次序是,normal xor background none,xor,和,background,很接近,但是,background,会抹去其他旧曲线所扫过的其他对象(如图轴、网格线、另一条曲线等),所以较少用到,所以一般在产生动画时,最常用到的,EraseMode,就是,xor。,15,曲线的动画,有了这些概念后,产生曲线的动画就很容易了!其主要步骤有两点:,产生一条曲线,其,EraseMode,为,xor,background,,或,none。,在,for-loop,之中,改变此曲线的,xdata,或,ydata(,或两者)。,我们产生一条随,x,而衰减的正弦曲线,并让,k,随时间而便大(即改变正弦波的相角),使整条曲线产生舞动的效果。,16,对象动画之范例一,我们产生一条衰减的正弦曲线,让,k,随时间而便大(即改变正弦波的相角),使整条曲线产生舞动的效果。,范例6-1:,movie04.m,x=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:5000,y=sin(x+i/50).*exp(-x/5);,set(h,ydata,y);%,设定新的,y,坐标,drawnow%,立即作图,end,17,对象动画之范例一,我们产生一条衰减的正弦曲线,让,k,随时间而便大(即改变正弦波的相角),使整条曲线产生舞动的效果。,范例6-1:,movie04.m,x=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:5000,y=sin(x+i/50).*exp(-x/5);,set(h,ydata,y);%,设定新的,y,坐标,drawnow%,立即作图,end,18,对象动画之范例一,最后一个,frame,的画面,19,对象动画之范例一,在上例中,我们使用,set,指令,总共改变曲线的,y,坐标 5000 次,并以,xor,的方式抹掉旧曲线。,drawnow,的作用是使,MATLAB,立刻处理,set,指令,若无,drawnow,MATLAB,会累积,set,指令,直到,for-loop,结束时再一并处理图形的变化,这时就不会看到动画的效果。,如果您将上例的,EraseMode,改成,background,,则会发现曲线会,“,抹掉,”,图形中的网格线及代表图轴的直线。,如果您将上例的,EraseMode,改成,none,,则旧的曲线会被保留下来,产生不同的效果。,20,对象动画之范例:,MATLAB,MATLAB,有很多对象动画之范例:,lorenz:,以3,D,动画呈现的,Lorenz,混沌方程式(,Chaotic Equation),,好像慧星在运行。,truss:,一座桥梁在地震时的震动方式,共有 12 种喔!,travel:,显示如何以杂乱搜寻(,Random Search),的方式来解,Traveling Salesperson Problem.,fitdemo:,显示如何以,Downhill Simplex Search,来解决非线性曲线拟合(,Nonlinear Curve Fitting),的问题。,spinner:,常见的屏幕保护程序。,xphide:,试试您的眼力,。,21,对象动画之范例:,Simulink,若您有安装,Simulink,,可试试下列动态系统仿真加上动画呈现:,onecart:,传统的弹簧加上砝码的动态系统。,dblcart1:,一条弹簧加上两个砝码的动态系统。,simppend:,简单的单摆系统。,dblpend1:,两截的摆动系统。,dblpend2:,更复杂的摆动系统。,penddemo:,倒单摆系统。,22,对象动画之范例:模糊工具箱,如果您有安装,Fuzzy Logic Toolbox,,可以试试由张老师开发的各项模拟及动画展示:,fcmdemo:Fuzzy C-means Clustering。,juggler:,用板子接皮球。,invkine:,两截机器手臂的,Inverse Kinematics。,slcp1:,倒单摆,杆子长度随时间而变,您可以控制所欲到达的位置。,slcpp1:,双倒单摆,其中一个杆子的长度随时间而变,您可以控制所欲到达的位置。,slbb:,跷跷板加上滚球系统,您可以控制球的最后位置。,sltbu:,倒车入库系统,23,以对象方式产生动画,呈现一个小圆(半径为,1,)在一个大圆(半径为,3,)的圆周外部滚动的动画。,f,unction mymovie02,close all,theta=0:0.1:2*pi;,r1=3;,x1=r1*cos(theta);,y1=r1*sin(theta);,plot(x1,y1),axis image%,大圆,r2=1;,center=(r1+r2)*1,0;,x2=r2*cos(theta);,y2=r2*sin(theta);,h=line(center(1)+x2,center(2)+y2,EraseMode,xor,color,r);,%,小圆,axis(-5 5-5 5);%,设定图轴的范围,n=5;%,转,5,圈,theta1=0:0.005:n*2*pi;,for i=1:length(theta1);,center=(r1+r2)*cos(theta1(i),sin(theta1(i);,set(h,xdata,center(1)+x2,ydata,center(2)+y2);,%,设定小圆的,x,y,坐标,drawnow,%,立即作图,end,24,f,unction mymovie02_2,close all,theta=0:0.1:2*pi;,r1=3;,circle1=r1*exp(sqrt(-1)*theta);%,大圆,plot(circle1),axis image,r2=1;,circle2=r2*exp(sqrt(-1)*theta);%,小圆,center=r1+r2;,h=line(real(center+circle2),imag(center+circle2),EraseMode,xor,color,r);,axis(-5 5-5 5);%,设定图轴的范围,n=5;%,转,5,圈,theta1=0:0.005:n*2*pi;,for i=1:length(theta1);,center=(r1+r2)*exp(sqrt(-1)*(theta1(i);,set(h,xdata,real(center+circle2),ydata,imag(center+circle2);,%,设定小圆的,x,y,坐标,drawnow%,立即作图,end,25,以对象方式产生动画,呈现一个圆圈(半径为,1,)由画面左边滚到右边,圆周上的任一点所拉出的一条摆线。,f,unction,cycloid01,%,摆线的动画,x=0:0.01:5*pi;,theta=linspace(0,2*pi);,r=1;,circle=j+r*exp(sqrt(-1)*theta);,subplot(2,1,1);,circleH=plot(circle);axis image,set(circleH,erase,xor);,axis(min(x)-r,max(x)+r,-0.5,2*r+0.5);,dot1H=line(0,0,marker,o,color,k,erase,xor);,dot2H=line(0,0,marker,.,color,r,erase,none);,for i=1:length(x),set(circleH,xdata,x(i)+real(circle);,angle=-pi/2-x(i);,set(dot1H,xdata,x(i)+cos(angle),ydata,r+sin(angle);,set(dot2H,xdata,x(i)+cos(angle),ydata,r+sin(angle);,%line(xdata,x(i)+cos(angle),ydata,r+sin(angle),color,r,marker,.);,drawnow,end,26,以对象的方式产生动画,呈现下列方程式:,y=cos,2,(x+k)*exp(-x/5),让,k,随时间而变大,来显示此方程式的动画。,fu,nction mymovie06,x=0:0.1:8*pi;,k=0;,h=plot(x,cos(x+k).*cos(x+k).*exp(-x/5),EraseMode,xor);,axis(-inf inf-1 1);%,设定图轴的范围,grid on%,画出网格线,for k=1:0.01:50,y=cos(x+k).*cos(x+k).*exp(-x/5);,set(h,ydata,y);%,设定新的,y,坐标,drawnow%,立即作图,end,27,
展开阅读全文