アニメーション手法
MATLAB® でアニメーションを作成するには、4 つの基本的な手法を使用できます。
| 手法 | 説明 | 例 |
|---|---|---|
ループでデータを更新する。 | ループでグラフィックス オブジェクトのプロパティを更新し、その更新分を画面に表示します。この手法は、プロットの大半が同じまま残っている場合のアニメーションを作成するときに有効です。たとえば、 | |
行列変換を適用する。 | オブジェクトに変換を適用します。この手法は、オブジェクトのグループの位置と向きを変更する場合に有効です。グラフィックス オブジェクトを 1 つの変換オブジェクトの子としてグループ化します。変換オブジェクトを作成するには、 | |
アニメーション GIF ファイルを作成する。 | ループで | |
ムービーを作成します。 | ループで |
ループでのデータの更新によるアニメーションの作成
ラインに沿って移動するマーカーのアニメーションを作成します。
正弦波をプロットします。次に、マーカーをプロットし、変数
mkrとして保存して、後からそのプロパティにアクセスできるようにします。xlim、ylim、および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

行列変換を使用したアニメーションの作成
プロットをアニメーション化する効率的な方法は、すべてのポイントを反復処理するのではなく、1 つ以上のオブジェクトに変換行列を適用することです。使用できる変換には、並進、回転、スケーリングがあります。独自の変換行列を定義することもできます。
任意の軸に対して球面を 2π ラジアン回転させるアニメーションを作成します。
sphere関数を使用して球面の座標を作成します。grpという名前のTransformオブジェクトを作成します。次に、surf関数を呼び出して親オブジェクトをgrpとして指定し、球面をSurfaceオブジェクトとしてプロットします。座標軸のグリッド ラインを表示し、3 次元ビューでプロット ボックスを表示します。
0 から 2π までの 300 個の等間隔の角度値を順に設定し、反復ごとに球面を小さな角度分回転させる
forループを作成します。makehgtform関数を使用して、それぞれの小さな回転角度の変換行列を作成します。次に、grpのMatrixプロパティを設定して回転を実行します。各ループ反復の最後に
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

アニメーション 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

ムービーの作成と再生
ループで 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)

参考
関数
hgtransform|makehgtform|exportgraphics|getframe|movie|writeVideo