Matlab动画制作 系列

来源:互联网 发布:美国旅游知乎 编辑:程序博客网 时间:2024/04/30 06:49

转自http://www.matlabsky.com/forum.php?mod=viewthread&tid=600



电影动画的好处就是,运行一次可以多次播放,甚至可以直接生成avi文件,直接独立与Matlab环境播放。这是其它三种动画制作方法所不具备的。


MATLAB中,创建电影动画的过程分为以下四步:

step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个足够大的矩阵,使之能够容纳基于当前坐标轴大小的一系列指定的图形(此处称为帧)。

step2:调用getframe函数生成每个帧。该函数返回一个列矢量,利用这个矢量,就可以创建一个电影动画矩阵。

getframe函数可以捕捉动画帧,并保存到矩阵中。一般将该函数放到for循环中得到一系列的动画帧。
该函数格式有:
(1)F=gefframe,从当前图形框中得到动画帧
(2)F=gefframe(h),从图形句柄h中得到动画帧
(3)F=getframe(h,rect),从图形句柄h的指定区域rec中得到动画帧

step3:调用movie函数按照指定的速度和次数运行该电影动画。

当创建了一系列的动画帧后,可以利用movie函数播放这些动画帧。
该函数的主要格式有:
(1)movie(M),将矩阵M中的动画帧播放一次
(2)movie(M,n),将矩阵M中的动画帧播放n次
(3)movie(M,n,fps),将矩阵M中的动画帧以每秒fps帧的速度播放n次

step4:调用movie2avi函数可以将矩阵中的一系列动画帧转换成视频文件avi文件。这样,即使脱离了matlab环境都可以播放动画。

具体参见:

该方法的经典格式是:
  1. %录制电影动画
  2.        for j=1:n
  3.           %
  4.           %这里输入我们的绘图命令
  5.           %
  6.           M(j) = getframe;
  7.        end
  8.        movie(M)
  9. %单帧显示方法
  10.        f = getframe(gcf);
  11.        colormap(f.colormap);
  12.        image(f.cdata);
复制代码
此外,利用immovie函数,我们可以从多帧图像阵列中创建MATALB 电影动画。

需要注意的是:该函数只能应用于索引图象,所以,如果用户希望其他类型的图像阵列转换为电影动画,则首先将该图像类型转换为索引类型。

电影动画演示实例(一)

untitled.jpg


  1. %by dynamic
  2. %see also http://www.matlabsky.com
  3. %2008.7.12

  4. close all
  5. figure('toolbar','none','menubar','none','NumberTitle','off','name','电影动画录制——Matlabsky');
  6. axis equal
  7. m=moviein(20,gcf);%在当前窗口下,截取20帧



使用Matlab的绘图函数不断重复绘制图形对象,重绘过程中递增式地改变图形对象位置将产生动画效果。在重绘对象的过程中之所以能产生动画效果是由于对原来的图形对象进行了擦除处理。

MATLAB中,创建擦除重绘动画的过程分为以下三步:

step1:设置重绘对象的擦除模式'EraseMode'模式

Matlab的图形绘制函数允许采用不同的擦除模式来擦除原来的对象,不同的擦除模式将产生不同的动画效果。擦除模式是通过没置“EraseMode”属性来完成的,一共有三种擦除模式:

none:重新绘制图形对象时不擦除原来的对象,这种模式可动态演示图形的生成过程,如曲线和旋转曲砸的生成过程
background:在重新绘制图形对象之前。用背景色重绘对象来达到擦除原来图形对象的目的。该模式会擦除任何对象和它下面的任何图形
Xor:在重新绘制图形对象之前,只擦除原来的对象,不会擦除其他对象或图形。这种模式能产生图形对象移动的效果

step2:在循环语句中使用set更改图形的xdata,ydata和zdata等坐标数据

step3:使用darwnow命令刷新屏幕

该方法的经典格式是:

  1. %擦除重绘模式动画
  2. %选择一个擦除模式
  3. set(h,'erasemode',erasemode)%h是需要执行动画图像的句柄,一般都是由line或者plot创建
  4. %
  5. %需要执行一些图形计算命令
  6. %
  7. %循环语句中更新坐标数据,一般使用for或者while
  8. for i=1:n
  9.     %
  10.     %必要的MATLAB命令
  11.     %
  12.     set(h,'xdata',xdata,'ydta',ydata)%更新图像的坐标数据
  13.     drownnow%刷新屏幕
  14.     %
  15.     %其它Matlab语句
  16.     %
  17. end

Matlab擦除重绘动画实例(一)——运动的小球

1.jpg

  1. function f=anim_ball(K,ki)
  2. %
  3. %演示红色小球沿一条封闭旋螺线运动的实时动画
  4. % 仅演示实时动画的调用格式为 anim_ball(K)
  5. % 既演示实时动画又拍摄照片的调用格式为 f=anim_ball(K,ki)
  6. % K 红球运动的循环数(不小于 1 )
  7. % ki 指定拍摄照片的瞬间,取 1 到 1034 间的任意整数
  8. % f 存储拍摄的照片数据,可用 image(f.cdata) 观察照片
  9. % 产生封闭的运动轨线
  10. %
  11. %
  12. %by dynamic
  13. %all rights reserved by http://www.4math.cn
  14. %2007.10.26
  15. %

Matlab擦除重绘动画实例(二)——单摆横梁

截图2.jpg

  1. %挂摆横梁
  2. %by dynamic
  3. %see also http://www.matlabsky.com
  4. %2008.6.9
  5. %
  6. h=figure('numbertitle','off','name','擦除动画演示(挂摆横梁)——Matlabsky')
  7. %绘制横梁
  8. plot([-0.2;0.2],[0;0],'-k','linewidth',20);
  9. %画初始位置的单摆
  10. g=0.98;%重力加速度,可以调节摆的摆速
  11. l=1;%摆长

Matlab擦除重绘动画实例(三)——时钟演示

clock.jpg

  1. %将下列命令保存到M文件中,直接运行
  2. %Matlab时钟动画演示
  3. %rewrite by dynamic
  4. %more information please go to http://www.matlabsky.cn
  5. try
  6. close all
  7. hfig=figure('NumberTitle','off','name','Clock Animation Demo--by MatlabSky','MenuBar','none');
  8. theta=linspace(0,6.3,1000);
  9. x1=8*cos(theta);y1=8*sin(theta);
  10. plot(x1,y1,'b','linewidth',1.4)%绘制外表盘
  11. hold on
  12. axis equal
  13. x2=7*cos(theta);y2=7*sin(theta);
  14. plot(x2,y2,'y','linewidth',3.5)%绘制内表盘
  15. fill(0.4*cos(theta),0.4*sin(theta),'r');%绘制指针转轴

Matlab擦除重绘动画实例(四)——小球绕跑道运动

1.jpg


  1. %小球绕跑道运动
  2. %rewrite by dynamic
  3. %more information please go to http://www.matlabsky.cn
  4. %
  5. figure('numbertitle','off','name','Matlab Animation Demo--by matlabsky','MenuBar','none')
  6. prompt={'请输入速度v:','请输入长度L:','请输入半径r:'};
  7. default={'5','10','2'};
  8. v=5;L=10;r=2;
  9. p=inputdlg(prompt,'输入参数',1,default);
  10. v=str2double(p(1));
  11. L=str2double(p(2));
  12. r=str2double(p(3));





质点运动轨迹动画方式是最简单的动画产生方式,顾名思义,就是产生一个顺着曲线轨迹运动的质点来操作。
Matlab中提供了comet和comet3命令来实现质点运动轨迹动画的绘制,其常用格式为:

  1. comet(xdata,ydata,p)

  2. p是指彗星的尾巴的长度,可以是常数或者size(x)大小的向量
复制代码
其他具体格式大家可以参考doc comet帮助系统

该方法的使用一般使用步骤如下:

step1:求解出质点完整的运动轨迹坐标x,y和z

step2:使用comet或者comet3直接绘制动点


质点动画演示(一)

untitled.jpg

  1. %by dynamic
  2. %see also http://www.matlabsky.com
  3. %2008.6.23
  4. %
  5. t=0:pi/50:10*pi;
  6. x=30*sin(t);
  7. y=30*cos(t);
  8. z=t;
  9. plot3(x,y,z);
  10. hold on
  11. %axis equal
  12. comet3(x,y,z,0.5)


质点动画演示(二)——平跑运动

untitled.jpg


  1. %by dynamic
  2. %see also http://www.matlabsky.com
  3. %2008.6.23
  4. %
  5. vx = 40;
  6. t = 0:0.01:10;
  7. x = vx*t;
  8. y = -9.8*t.^2/2;
  9. comet(x,y)

质点动画演示(三)——导弹发射

untitled.jpg

  1. %by dynamic
  2. %see also http://www.matlabsky.com
  3. %2008.6.13
  4. %
  5. vx = 100*cos(1/4*pi);
  6. vy = 100*sin(1/4*pi);
  7. t = 0:0.001:15;
  8. x = vx*t;
  9. y = vy*t-9.8*t.^2/2;
  10. comet(x,y)




MATLAB动画保存只对电影动画有意义,因为其他两种都是实时动画,一眨眼过去了,而电影动画是先将动画一帧一帧的保存下来,在使用movie函数播放。它的好处是,运行一次MATLAB程序就可以播放无数次,只要你的帧数据还在。

但是这还是不方便,由于它没法脱离MATLAB环境,很讨厌。还好MATLAB为我们提供了movie2avi函数,它可以把动画直接转换成avi文件,而avi文件则可以脱离Matalb环境而在其他地方运行了。

  1. function avimake
  2. warning off;
  3. load data
  4. [M,N,K]=size(data);
  5. data=data/(max(abs(data(:))));
  6. aviobj = avifile('mymovie.avi','fps',10);
  7. for kk=1:10:K   
  8.     imagesc(data(:,:,kk));   
  9.     set(gca,'clim',[-1 1]);
  10.     colormap(hsv(128))   
  11.     frame = getframe(gca);
  12.     aviobj = addframe(aviobj,frame);
  13. end
  14. aviobj = close(aviobj);
复制代码
另外也可以直接保存gif动画
  1. for i = 1:length(x)
  2.     %  这里是绘图命令
  3.     drawnow; % 刷新屏幕
  4.     pause(0.05)   
  5.     f = getframe(gcf);  
  6.     imind = frame2im(f);
  7.     [imind,cm] = rgb2ind(imind,256);
  8.     if i == 1
  9.         imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
  10.     else
  11.         imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
  12.     end
  13. end




电影动画演示——旋转的山峰

untitled.jpg

  1. %by dynamic
  2. %see also http://www.matlabsky.com
  3. %2008.6.12
  4. %
  5. figure('toolbar','none','NumberTitle','off','name','电影动画(Rotate Peak)——Matlabsky');
  6. [X,Y,Z]=peaks(30);
  7. surfl(X,Y,Z);
  8. axis([-3 3 -3 3 -10 10]);
  9. axis off;
  10. shading interp;
  11. colormap hot;
  12. m=moviein(15);
  13. for i=1:15
  14. view(-37.5+24*(i-1),30);
  15. m(:,i)=getframe;
  16. end
  17. movie(m);


擦除动画实例——卫星绕地球运动(注释很详细)

untitled.jpg

  1. %by dynamic
  2. %see also http://www.matlabsky.com
  3. %2008.12.23
  4. %
  5. h=figure('numbertitle','off','name','卫星绕地球旋转演示动画——Matlabsky');%设置标题名字
  6. s1=0:.01:2*pi;
  7. hold on;
  8. axis equal;%建立坐标系
  9. axis off;%除掉Axes
  10. r1=10;%地球到太阳的平均距离
  11. r2=3;%卫星的轨道半径
  12. w1=1;%设置地球公转角速度
  13. w2=12;%设置卫星绕地球公转角速度
  14. t=0;%初始时刻
  15. pausetime=.002;%设置视觉暂留时间
  16. sita1=0;
  17. sita2=0;%设置开始它们都在水平线上
  18. set(gcf,'doublebuffer','on') %消除抖动

擦除动画实例——太阳|地球|月亮|卫星,绕转演示动画(注释很详细)

untitled.jpg

  1. %by dynamic
  2. %see also http://www.matlabsky.com
  3. %2008.12.6
  4. %
  5. clear; clc;close all

  6. %定义几组变量.分别代表的含义是:
  7. %相对圆心坐标 半径 最近距离  最远距离  周期  角速度  旋转角度
  8. x0=0; y0=0; r0=80; Lmin0=0;  Lmax0=0;  T0=2160;  w0=0*pi/T0; q0=0;
  9. x1=0; y1=0; r1=40; Lmin1=25; Lmax1=30; T1=1080;  w1=pi/T1;  q1=0;
  10. x2=0; y2=0; r2=20; Lmin2=8;  Lmax2=10; T2=180;   w2=pi/T2;  q2=0;
  11. x3=0; y3=0; r3=10; Lmin3=3;  Lmax3=05; T3=30;    w3=pi/T3;  q3=0;

  12. %初始化
  13. hh=figure('numbertitle','off','name','太阳|地球|月亮|卫星,绕转演示动画——Matlabsky');

  14. %设置擦除方式
  15. sun=line(0 ,0 ,'color','r','linestyle','.','erasemode','xor','markersize',r0); %太阳
  16. earth=line(x0,y0,'color','k','linestyle','.','erasemode','xor','markersize',r1); %地球
  17. moon=line(x1,y1,'color','b','linestyle','.','erasemode','xor','markersize',r2); %月亮
  18. satellite=line(x2,y2,'color','g','linestyle','.','erasemode','norm','markersize',r3); %卫星

原创粉丝点击