动画技术
您可以使用多种方法在 MATLAB® 中创建动画。
| 编程方式 | 描述 | 示例 |
|---|---|---|
使用循环方式更新数据。 | 更新图形对象的属性并使用循环方式在屏幕上显示更新。 这一方法对于在图大部分保持不变的情况下创建动画非常有用。 | |
应用矩阵变换。 | 将图形对象组合在一起,并对整个组应用变换。 当您想要同时更改一组对象的位置和方向时,此方法非常有用。 | |
创建一个动画 GIF 文件。 | 以循环方式使用 此方法对于创建您要存储和回放的动画非常有用。 | |
创建一个影片。 | 以循环方式使用 此方法适用于无法实时快速绘制的复杂动画,或当您要存储并回放动画时。使用 | |
创建一个动画线条。 | 使用 此方法对于优化线条动画非常有用。 | |
使用专用动画函数。 | 要实现更专用的动画,您可以使用诸如 |
通过使用循环方式更新数据来创建动画
创建一个沿直线移动的标记的动画。
x = linspace(0,10,500); y = sin(x); % Plot a line and create a marker plot(x,y) hold on mkr = scatter(NaN,NaN,[],"red","filled"); hold off xlim([0 10]) ylim([-1 1]) zlim([-1 1]) % Move the marker along the line for i = 1:length(x) mkr.XData = x(i); mkr.YData = y(i); drawnow end

使用矩阵变换创建动画
以动画方式显示绘图的一种高效方法是向一个或多个对象应用变换矩阵,而不是对所有点进行迭代。在此方法中,您将一个或多个图形对象作为子对象在 Transform 对象下分组,然后设置 Transform 对象的 Matrix 属性以调整其所有子对象的位置。您可以使用的变换包括平移、旋转和缩放。您还可以定义您自己的变换矩阵。
创建一个旋转球体的动画。
使用
sphere函数创建球体的坐标。通过使用
hgtransform函数创建一个名为grp的Transform对象。然后通过调用surf函数并将父对象指定为grp,将球体绘制为Surface对象。显示坐标区网格线并在三维视图中显示图框。
创建一个
for循环,它逐步遍历从 0 到 2π 的 300 个等间距角度值,在每次迭代中将球体旋转一个小角度。使用makehgtform函数为每个小旋转角度创建变换矩阵。然后设置grp的Matrix属性以执行旋转。在每次循环迭代结束时调用
drawnow函数以更新图窗显示。
% Create the coordinates of a sphere ax = axes; [x,y,z] = sphere(270); % Create transform object and plot the sphere grp = hgtransform(Parent=ax); s = surf(ax,x,y,z,z,Parent=grp,EdgeColor="none"); % Display grid lines and show the plot box in 3-D grid on view(3) axis vis3d axis tight manual % Rotate the sphere by small angles in a loop for ang = linspace(0,2*pi,300) tm = makehgtform("axisrotate",[1,1,1],ang); grp.Matrix = tm; drawnow end

创建动画 GIF 文件
创建一个沿抛物线移动的标记的动画 GIF 文件。
绘制一条带一个标记的抛物线。
创建一个
for循环,它在每次迭代中更改标记的位置。在每次循环迭代结束时,使用
exportgraphics函数将图窗捕获为动画 GIF 文件的帧。对于第一个循环迭代,将Append名称-值参量设置为false以创建一个包含第一帧的新文件。然后,对于其余的循环迭代,将Append名称-值参量设置为true以捕获当前帧并将其追加到指定的 GIF 文件。生成的
parabola.gif文件保存到当前文件夹。
% Plot a parabola and a marker x = -10:0.5:10; y = x.^2; p = plot(x,y,"-o",MarkerFaceColor="red"); % Move the marker along the parabola and capture frames in a loop for i = 1:41 p.MarkerIndices = i; if i == 1 exportgraphics(gca,"parabola.gif",Append=false) else exportgraphics(gca,"parabola.gif",Append=true) end end

创建并播放影片
通过以循环方式使用 getframe 函数创建一个形状不断变化的曲面图的影片。getframe 函数将影片帧捕获到一个结构体数组中,您可以使用 movie 函数播放影片。
使用
surf函数将peaks函数的坐标绘制为曲面,并将Surface对象保存为变量s。使用
axis tight manual命令将图框紧密定位在曲面周围并冻结坐标区范围。创建一个名为
F的由 40 个结构体组成的数组以包含动画帧。创建一个
for循环,它在每次迭代中更改曲面的形状。在每次循环迭代结束时,使用
drawnow命令更新图窗,并使用getframe函数捕获影片帧。生成的影片保存为结构体数组
F。
% Plot a surface Z = peaks; s = surf(Z); axis tight manual % Change the shape of the surface and capture frames loops = 40; F(loops) = struct("cdata",[],"colormap",[]); for j = 1:loops Zframe = sin(j*pi/10)*Z; s.ZData = Zframe; drawnow F(j) = getframe(gcf); end
播放影片两次。
fig = figure; movie(fig,F,2)

创建动画线条
animatedline 函数帮助您优化线条动画。它可以向线条添加新的点而不用重新定义现有点。
创建一个由两条不断变长的线条组成的动画。
创建两条不同颜色的动画线条。
在循环之前设置坐标轴范围,以避免在每个循环迭代中重新计算范围。
创建一个
for循环,用于向线条添加点。在每次循环迭代结束时使用
drawnow或drawnow limitrate以更新图窗显示。
% Create two animated lines of different colors a1 = animatedline(Color=[0 0.7 0.7]); a2 = animatedline(Color=[0 0.5 0.5]); axis([0 20 -1 1]) drawnow x = linspace(0,20,10000); for k = 1:length(x) % Add to first line xk = x(k); ysin = sin(xk); addpoints(a1,xk,ysin); % Add to second line ycos = cos(xk); addpoints(a2,xk,ycos); % Update screen drawnow limitrate end

另请参阅
函数
hgtransform|makehgtform|exportgraphics|getframe|movie|writeVideo