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

Matlab 中动画的实现、制作和保存
http://www.matlabsky.com/thread-592-1-1.html
Matlab 的确是一个很优秀的工程计算软件,除了强大的矩阵运算,仿真分析外,绘图功能也是相当
的强大。
但是由于 Matlab 本身的多线程编程缺陷(所谓多线程,就是 MATLAB 没法同时执行多个回调,只能
排队一个一个的按顺序运行,Timer 对象除外,它是 MATLAB 中唯一能够执行多线程的方法),想要动态
的画图,并且能够很好的在 GUI 中得到控制,还不是一件很容易的事情。
但是动画具有生动形象直观的好处,对我的教学、研究等都有不小的作用。那好,我在这里勉为其
难的介绍下 Matlab 中是如何制作动画的。
1 动画的制作
Matlab 中动画实现的方法主要有下面三种
1.1 电影动画
帖子地址:http://www.matlabsky.com/thread-593-1-1.html
从不同的视角拍下一系列对象的图形,并保存到变量中,然后按照一定的顺序像电影一样播放。
电影动画的好处就是,运行一次可以多次播放,甚至可以直接生成 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 环境都可以播放动画。
该方法的经典格式是:
% 录制电影动画
for j=1:n
%
% 这里输入我们的绘图命令
%
M(j) = getframe;
end
movie(M)
% 单帧显示方法
f = getframe(gcf);
colormap(f.colormap);
image(f.cdata);
1.1.1 电影动画演示实例(一)——千变万化的线条
%by dynamic
%see also http://www.matlabsky.com
%2008.7.12
close all
figure('toolbar','none','menubar','none','NumberTitle',...
'off','name',' 电影动画录制—— Matlabsky');
axis equal
m=moviein(20,gcf);% 在当前窗口下,截取 20 帧
set(gca,'nextplot','replacechildren','box','off','color','b','xgrid','on')
title(' 截图当前窗口的 20 帧动画 ')
for j=1:20
plot(fft(eye(j+16)))
m(:,j)=getframe(gcf); % 截取动画帧,保存到 m 变量中
end
hh=figure('toolbar','none','menubar','none','NumberTitle',...
'off','name',' 电影动画播放—— Matlabsky');
title(' 将截取的动画播放 5 遍 ')
set(gca,{'xtick','ytick','xticklabel','yticklabel'},{[],[],[],[]})
movie(hh,m,5)
1.1.2 电影动画演示实例(二)——跳动的红心
帖子地址:http://www.matlabsky.com/viewthread.php?tid=9489
% by xiezhh
x = linspace(-2,2,100);
[X,Y,Z] = meshgrid(x,x,x);
I1 = (X.^2+9/4*Y.^2+Z.^2-1).^3-X.^2.*Z.^3-9/80*Y.^2.*Z.^3;
p = patch(isosurface(X,Y,Z,I1,0));
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
view(3);
axis equal ;
axis off;
light('Posi',[0 -2 3]); % 在 (0,-2,3) 点处建立一个光源
lighting phong
set(gca,'nextplot','replacechildren');
% 记录电影
XX = get(p,'XData');
YY = get(p,'YData');
ZZ = get(p,'ZData');
for j = 1:20
bili = sin(pi*j/20);
set(p,'XData',bili*XX,'YData',bili*YY,'ZData',bili*ZZ)
F(j) = getframe;
end
% 放映 10 次
movie(F,10)
Tags:  matlab动画

延伸阅读

最新评论

发表评论