メインコンテンツ

アニメーション手法

MATLAB® でアニメーションを作成するには、4 つの基本的な手法を使用できます。

手法説明

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

ループでグラフィックス オブジェクトのプロパティを更新し、その更新分を画面に表示します。この手法は、プロットの大半が同じまま残っている場合のアニメーションを作成するときに有効です。たとえば、Scatter オブジェクトの XData プロパティと YData プロパティをループで設定して、アニメーション効果を作成します。

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

行列変換を適用する。

オブジェクトに変換を適用します。この手法は、オブジェクトのグループの位置と向きを変更する場合に有効です。グラフィックス オブジェクトを 1 つの変換オブジェクトの子としてグループ化します。変換オブジェクトを作成するには、hgtransform 関数を使用します。変換オブジェクトの Matrix プロパティを設定して、変換オブジェクトのすべての子の位置を調整します。

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

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

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

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

ムービーを作成します。

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

ムービーの作成と再生

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

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

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

  • xlimylim、および zlim 関数を使用して各軸の範囲を設定します。範囲を設定すると、軸の範囲の自動計算が無効になります。これにより、フリッカーが発生して、アニメーションのパフォーマンスに影響する可能性があります。

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

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

x = linspace(0,10,500);
y = sin(x);

% Plot a line and 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 つ以上のオブジェクトに変換行列を適用することです。使用できる変換には、並進、回転、スケーリングがあります。独自の変換行列を定義することもできます。

任意の軸に対して球面を 2π ラジアン回転させるアニメーションを作成します。

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

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

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

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

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

% Create the coordinates of a sphere
figure
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 ファイルのフレームとして取得します。名前と値の引数 Append=true を指定すると、exportgraphics は現在のフレームを取得し、指定した 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;
    exportgraphics(gca,"parabola.gif",Append=true)
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

参考

関数

トピック