メインコンテンツ

アニメーション手法

MATLAB® でアニメーションを作成するには、いくつかの手法を使用できます。

手法説明

ループでデータを更新する。

ループでグラフィックス オブジェクトのプロパティを更新し、その更新分を画面に表示します。

この手法は、プロットの大半が同じまま残っている場合のアニメーションを作成するときに有効です。

ループでのデータの更新によるアニメーションの作成

行列変換を適用する。

グラフィックス オブジェクトをグループ化し、グループ全体に変換を適用します。

この手法は、オブジェクトのグループの位置と向きを変更する場合に有効です。

行列変換を使用したアニメーションの作成

アニメーション GIF ファイルを作成する。

ループで exportgraphics 関数を使用して、Figure を更新し、アニメーション GIF ファイルのフレームを取得します。

この手法は、保存して再生するアニメーションを作成する場合に役立ちます。

アニメーション GIF ファイルの作成

ムービーを作成します。

ループで getframe 関数を使用して、Figure を更新し、ムービーのフレームを取得します。

この手法は、リアルタイムですばやく描画されない複雑なアニメーションや、アニメーションを保存して再生する場合に役立ちます。movie 関数を使用してムービーを再生します。

ムービーの作成と再生

アニメーション化されたラインを作成する。

animatedline 関数を使用してデータのライン アニメーションを作成します。

この手法は、ライン アニメーションを最適化するのに役立ちます。

アニメーション化されたラインの作成

特殊なアニメーション関数を使用する。

特殊なアニメーションの場合は、cometcomet3streamparticles などの関数を使用できます。

ストリーム粒子のアニメーションの作成

ループでのデータの更新によるアニメーションの作成

ラインに沿って移動するマーカーのアニメーションを作成します。

  • 正弦波をプロットします。次に、マーカーを作成し、変数 mkr として保存して、後からそのプロパティにアクセスできるようにします。

  • xlimylim、および zlim 関数を使用して各軸の範囲を設定します。範囲を設定すると、軸の範囲の自動計算が無効になります。これにより、アニメーションでフリッカーや速度の低下が生じる可能性があります。

  • マーカーの座標を更新する for ループを作成します。各反復で Scatter オブジェクト (mkr) の XData および YData プロパティを変更して、マーカーをラインに沿って移動します。

  • 各ループ反復の最後に drawnow 関数を呼び出して、Figure の表示を更新します。

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

行列変換を使用したアニメーションの作成

プロットをアニメーション化する効率的な方法は、すべてのポイントを反復処理するのではなく、1 つ以上のオブジェクトに変換行列を適用することです。この手法では、1 つ以上のグラフィックス オブジェクトを Transform オブジェクトの子としてグループ化し、Transform オブジェクトの Matrix プロパティを設定して、そのすべての子の位置を調整します。使用できる変換には、並進、回転、スケーリングがあります。独自の変換行列を定義することもできます。

回転する球面のアニメーションを作成します。

  • sphere 関数を使用して球面の座標を作成します。

  • hgtransform 関数を使用して、grp という名前の Transform オブジェクトを作成します。次に、surf 関数を呼び出して親オブジェクトを grp として指定し、球面を Surface オブジェクトとしてプロットします。

  • 座標軸のグリッド ラインを表示し、3 次元ビューでプロット ボックスを表示します。

  • 0 から 2π までの 300 個の等間隔の角度値を順に設定し、反復ごとに球面を小さな角度分回転させる for ループを作成します。makehgtform 関数を使用して、それぞれの小さな回転角度の変換行列を作成します。次に、grpMatrix プロパティを設定して回転を実行します。

  • 各ループ反復の最後に drawnow 関数を呼び出して、Figure の表示を更新します。

% 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 ファイルを作成します。

  • 放物線と 1 つのマーカーをプロットします。

  • 反復ごとにマーカーの位置を変更する for ループを作成します。

  • 各ループ反復の最後に、exportgraphics 関数を使用して、Figure をアニメーション GIF ファイルのフレームとして取得します。最初のループ反復では、名前と値の引数 Appendfalse に設定して、最初のフレームで新しいファイルを作成します。次に、残りのループ反復では、名前と値の引数 Appendtrue に設定して、現在のフレームを取得し、指定した 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 コマンドを使用して Figure を更新し、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

ムービーを 2 回再生します。

fig = figure;
movie(fig,F,2)

Animation of a surface plot changing shape

アニメーション化されたラインの作成

関数 animatedline により、ラインのアニメーションを最適化できます。この関数は、既存の点を再定義せずにラインに新しい点を追加することができるようにします。

伸びていく 2 本のラインのアニメーションを作成します。

  • 異なる色をもつ、アニメーション化された 2 本のラインを作成します。

  • ループ反復ごとに軸の範囲が再計算されないように、ループが開始する前に軸の範囲を設定します。

  • ラインに点を追加する for ループを作成します。

  • 各ループ反復の最後に drawnow または drawnow limitrate を使用して、Figure の表示を更新します。

% 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

参考

関数

トピック