Matlab中动画的实现、制作和保存

本帖由Matlab技术论坛原创,原帖参见 http://www.matlabsky.com/thread-592-1-1.html


光学夫朗和费衍射现象模拟Matlab源代码 http://www.matlabsky.com/thread-363-1-1.html
Matlab中动画制作和实现 http://www.matlabsky.com/thread-592-1-3.html
牛顿环动画演示Matlab源代码 http://www.matlabsky.com/thread-402-1-3.html
使用MATLAB绘制原子轨道和电子云图形 http://www.matlabsky.com/thread-571-1-1.html
振动摆MATLAB动画源代码 http://www.matlabsky.com/thread-570-1-1.html

Matlab的确是一个很优秀的工程计算软件,除了强大的矩阵运算,仿真分析外,绘图功能也是相当的强大。

但是由于Matlab本身的多线程编程缺陷(所谓多线程,就是MATLAB没法同时执行多个回调,只能排队一个一个的按顺序运行,Timer对象除外,它是MATLAB中唯一能够执行多线程的方法),想要动态的画图,并且能够很好的在GUI中得到控制,还不是一件很容易的事情。

但是动画具有生动形象直观的好处,对我的教学、研究等都有不小的作用。那好,我在这里勉为其难的介绍下Matlab中是如何制作动画的。

一、动画的制作

Matlab中动画实现的方法主要有下面三种

1.电影动画:从不同的视角拍下一系列对象的图形,并保存到变量中,然后按照一定的顺序像电影一样播放。
http://www.matlabsky.com/thread-593-1-1.html
2.擦除动画:画在图形窗口中按照一定的算法连续擦除和重绘图形对象,表现为动画,这个也是MATLAB中使用最多的方法。
http://www.matlabsky.com/thread-240-1-1.html
3.质点动画:用comet()等函数绘制彗星图,它能演示一个质点的运动
http://www.matlabsky.com/thread-594-1-1.html


二、动画的保存

下面再讲述下生成的动画如何保存。动画保存,只有对电影动画而言才有意义,其他两种谈不上保存,因为他们都是实时的,眨眼就过的
http://www.matlabsky.com/thread-595-1-1.html

三、有关动画制作的实验报告

http://www.matlabsky.com/thread-600-1-1.html

四、更多动画实例

更多的MATLAB实例等着大家自己去开发,我们这里提供了一些,大家可以依葫芦画瓢一样学习下,希望起一个抛砖引玉的作用
http://www.matlabsky.com/thread-596-1-1.html
 
 
 
 
Matlab动画制作(一)——电影动画
电影动画的好处就是,一次可以多次播放,甚至可以直接生成avi,直接独立与环境播放。这是其它三种动画制作方法所不具备的。

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 电影动画。

需要注意的是:该函数只能于索引图象,所以,如果用户希望其他类型的图像阵列转换为电影动画,则首先将该图像类型转换为索引类型。
 
Matlab动画制作(二)——擦除动画
使用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动画制作(三)——质点动画

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

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

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

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

step2:使用comet或者comet3直接绘制动点
 
 
Matlab动画制作(四)——动画的保存
MATLAB动画保存只对电影动画有意义,因为其他两种都是实时动画,一眨眼过去了,而电影动画是先将动画一帧一帧的保存下来,在使用movie播放。它的好处是,一次MATLAB就可以播放无数次,只要你的帧还在。

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


2Re:如何保存matlab的动画?
前几天刚答辩完,给你贴上。
function avimake
warning off;
load data
[M,N,K]=size(data);
data=data/(max(abs(data(:))));
aviobj = avifile('mymovie.avi','fps',10);
for kk=1:10:K   
    imagesc(data(:,:,kk));   
    set(gca,'clim',[-1 1]);
    colormap(hsv(128))   
    frame = getframe(gca);
    aviobj = addframe(aviobj,frame);
end
aviobj = close(aviobj);


3直接保存gif动画
m(:,k)=getframe;
    %%%构造gif的帧,
    nn(:,:,:)=getframe;
    %%转换为可以直接的格式(这会是图像丢失)
    %如果要制作彩色的图像,你只能把生成的彩色图像单独制作(使用其他)
    nn1=nn.cdata;
    nn1=rgb2gray(nn1);
    imwrite(nn1,'out.gif','gif','WriteMode','append')

你可能感兴趣的:(动画)