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

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

アニメーション GIF ファイルの作成
放物線に沿って移動するマーカーのアニメーション GIF ファイルを作成します。
放物線と 1 つのマーカーをプロットします。
反復ごとにマーカーの位置を変更する
forループを作成します。各ループ反復の最後に、
exportgraphics関数を使用して、Figure をアニメーション 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コマンドを使用して 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)

アニメーション化されたラインの作成
関数 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

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