主要内容

动画技术

您可以使用多种方法在 MATLAB® 中创建动画。

编程方式描述示例

使用循环方式更新数据。

更新图形对象的属性并使用循环方式在屏幕上显示更新。

这一方法对于在图大部分保持不变的情况下创建动画非常有用。

通过使用循环方式更新数据来创建动画

应用矩阵变换。

将图形对象组合在一起,并对整个组应用变换。

当您想要同时更改一组对象的位置和方向时,此方法非常有用。

使用矩阵变换创建动画

创建一个动画 GIF 文件。

以循环方式使用 exportgraphics 函数更新一个图窗并捕获动画 GIF 文件的帧。

此方法对于创建您要存储和回放的动画非常有用。

创建动画 GIF 文件

创建一个影片。

以循环方式使用 getframe 函数更新一个图窗并捕获影片的帧。

此方法适用于无法实时快速绘制的复杂动画,或当您要存储并回放动画时。使用 movie 函数播放影片。

创建并播放影片

创建一个动画线条。

使用 animatedline 函数创建数据的线条动画。

此方法对于优化线条动画非常有用。

创建动画线条

使用专用动画函数。

要实现更专用的动画,您可以使用诸如 cometcomet3streamparticles 之类的函数。

创建流粒子动画

通过使用循环方式更新数据来创建动画

创建一个沿直线移动的标记的动画。

  • 绘制一个正弦波。然后创建一个标记并将其另存为变量 mkr,以便稍后访问其属性。

  • 使用 xlimylimzlim 函数设置每个轴的范围。设置范围会禁用自动坐标轴范围计算,这可能导致动画闪烁并变慢。

  • 创建一个 for 循环,该循环会更新标记的坐标。在每次迭代中更改 Scatter 对象 (mkr) 的 XDataYData 属性,以沿直线移动标记。

  • 在每次循环迭代结束时调用 drawnow 函数以更新图窗显示。

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

Animation of a red marker tracing a line plot of a sine wave

使用矩阵变换创建动画

以动画方式显示绘图的一种高效方法是向一个或多个对象应用变换矩阵,而不是对所有点进行迭代。在此方法中,您将一个或多个图形对象作为子对象在 Transform 对象下分组,然后设置 Transform 对象的 Matrix 属性以调整其所有子对象的位置。您可以使用的变换包括平移、旋转和缩放。您还可以定义您自己的变换矩阵。

创建一个旋转球体的动画。

  • 使用 sphere 函数创建球体的坐标。

  • 通过使用 hgtransform 函数创建一个名为 grpTransform 对象。然后通过调用 surf 函数并将父对象指定为 grp,将球体绘制为 Surface 对象。

  • 显示坐标区网格线并在三维视图中显示图框。

  • 创建一个 for 循环,它逐步遍历从 0 到 2π 的 300 个等间距角度值,在每次迭代中将球体旋转一个小角度。使用 makehgtform 函数为每个小旋转角度创建变换矩阵。然后设置 grpMatrix 属性以执行旋转。

  • 在每次循环迭代结束时调用 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

Animation of a rotating sphere

创建动画 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

Animation of a red marker tracing a line plot of a parabola

创建并播放影片

通过以循环方式使用 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)

Animation of a surface plot changing shape

创建动画线条

animatedline 函数帮助您优化线条动画。它可以向线条添加新的点而不用重新定义现有点。

创建一个由两条不断变长的线条组成的动画。

  • 创建两条不同颜色的动画线条。

  • 在循环之前设置坐标轴范围,以避免在每个循环迭代中重新计算范围。

  • 创建一个 for 循环,用于向线条添加点。

  • 在每次循环迭代结束时使用 drawnowdrawnow 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

Animation of two lines growing as they accumulate data

另请参阅

函数

主题