Matlab动画初探
时隔几天,终于把matlab的动画初步弄懂了。再次吐槽数学实验!搞得我头晕脑胀滴。
关于getframe
getframe的功能很强大很给力,但是现在我能用到的只是最最基本的功能:获得当前坐标轴的图像信息。所有的信息将汇集成一个或者是一系列特殊的数据,因此往往需要建立一个特殊的矩阵来存储这些数据。在存储好之后呢,就可以用下来要说到的movie这个函数来“播放”这个特殊的矩阵了。
特殊的矩阵的创建:一般是在循环中新建矩阵,将每一个循环的图片状态存储到矩阵的相应元素中。一般形式如下:
for k=m:n
...%这里是图像绘制部分
frame(k) = getframe;
end
其中的frame就是所谓的特殊矩阵了。
关于movie
movie函数的用法相当简单。一般用法有:
1、movie(frame)
这里的frame就是刚刚所谓的特殊矩阵了。这个的意思是说播放frame。
2、movie(frame,n)
将frame播放n遍。
3、movie(frame,n,fps)
将frame以每秒fps帧的速度播放n遍。
一些常用的动画
先以最简单的正弦函数的生成为例。
新建一个script文件,输入一下内容:
x = -pi:.1:pi;
y = sin(x);
for k=1:size(x,2)
plot(x(1:k),y(1:k))
axis ([-pi pi -1 1])
f(k) = getframe;
end
执行之后会发现在Workspace窗口中出现了f这个特殊矩阵:
然后在Command Window中输入:movie(f,1,24),这样就将刚刚生成的f矩阵以24的帧频播放了一遍。
注意:
在函数生成动画中不要写成:
x = -pi;
for k=1:50
y(k) = sin(x);
plot(x,y(k))
hold on
axis ([-pi pi -1 1])
x = x+2*pi/50;
f(k) = getframe;
end
这样将无法连线。
不过可以在plot中加入’s’参数,会得到很有趣的结果。
再看如下动画:
x = -pi:.1:pi;
y = sin(x);
t = [1:-.1:-1 -1:.1:1];
for k = 1:size(t,2)
plot(x,t(k)*sin(y))
axis ([-pi pi -1 1])
f(k) = getframe;
end
要是感觉不流畅的话可以改成如下形式:
x = -pi:.1:pi;
y = sin(x);
t = 0:.1:2*pi;
for k = 1:size(t,2)
plot(x,cos(t(k))*sin(y))
axis ([-pi pi -1 1])
f(k) = getframe;
end
在来点3D的:
figure('Renderer','zbuffer')
[x,y] = meshgrid(-2*pi:.1:2*pi);
z = sin(x)+cos(y);
t = 0:.1:2*pi;
for k = 1:size(t,2)
mesh(x,y,cos(t(k))*z)
axis ([-2*pi 2*pi -2*pi 2*pi -2 2])
f(k) = getframe;
end
这里说一下第一句,是设置窗口的渲染器(‘Renderer’)为zbuffer(Z深度算法,一种渲染方法),了解一下即可。因为3d动画对渲染要求较高,因此需要设置渲染器。如果不设置的话可能无法正常播放动画。
再说一下另一个常见的动画,旋转。
说到旋转,要用到view这个命令:
view(az, el)
az和el为视角,az为方位角,el为仰角,均以角度为单位。绕z轴旋转的话让az变化即可,速度为负则逆时针旋转。当az=0时,y轴垂直于观察者身体。
于是,旋转马鞍面的程序如下:
figure('Renderer','zbuffer')
[x,y] = meshgrid(-1:.1:1);
z = x.*y;
az = -20;
for k=1:50
mesh(x,y,z)
axis square off
view(az,20)
f(k) = getframe;
az = az+360/50;
end
以上就是常见的动画生成方法了。