動きを分かりやすく!アニメーションの作り方3選

michio on 18 Jun 2025 at 0:42 (Edited on 18 Jun 2025 at 0:45)
Latest activity Reply by Jiro Doke on 19 Jun 2025 at 13:40

どの方法を使う事が多いですか?他によく使う方法があれば教えてくださいー。
方法①
Livescript 上で for ループ内で描画を編集させて描いた動画は「アニメーションのエクスポート」から動画ファイルに出力するのが一番簡単ですね。再生速度やら細かい設定ができない点は要注意。
方法②
exportgraphics 関数で "Append" オプション指定で実現できるようになった(R2022a から)のでこれも便利ですね。
下の例では、ループで新規データを追加してアニメーションを作成するのに Animatedlineオブジェクト を使い、データの追加には addpoints を使用。
N = 100;
x = linspace(0,4*pi,N);
y = sin(x);
filename = 'animation_sample.gif'; % Specify the output file name
if exist(filename,'file')
delete(filename)
end
h = animatedline;
axis([0,4*pi,-1,1]) % x軸の表示範囲を固定
for k = 1:length(x)
addpoints(h,x(k),y(k)); % ループでデータを追加
exportgraphics(gca,filename,"Append",true)
end
方法③
R2021b 以前のバージョンだとこんな感じ。
各ループで画面キャプチャして、imwrite で動画ファイルにフレーム追加していくイメージです。"DelayTime" を使って細かい指定ができるので、必要に応じて今でも利用します。
for k = 1:length(x)
addpoints(h,x(k),y(k)); % ループでデータを追加
drawnow % グラフアップデート
frame = getframe(gcf); % Figure 画面をムービーフレーム(構造体)としてキャプチャ
tmp = frame2im(frame); % 画像に変更
[A,map] = rgb2ind(tmp,256); % RGB -> インデックス画像に
if k == 1 % 新規 gif ファイル作成
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.2);
else % 以降、画像をアペンド
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.2);
end
end
Jiro Doke
Jiro Doke on 19 Jun 2025 at 13:40
Animated GIFの作成方法ではないのですが,ふとアニメーションでちょっと遊んだ記事を思い出しました.
交感神経優位なあかべぇ
交感神経優位なあかべぇ on 18 Jun 2025 at 15:50
hgtransformで物体をグループ化、構造化してモーションを作るの重宝してます。下記はcarグループにbackWheelのグループ, frntWheelのグループをくっつけて車をつくってます。
a = axes('XLim',[-1,1],'YLim',[-.2,.5],'DataAspectRatio',[1,1,1],'NextPlot','add');
a.XAxis.Visible = false;
a.YAxis.Visible = false;
r = .05;
car = hgtransform(a, 'Matrix', makehgtform("translate",[-1,0,0]));
patch(car,[-.3,.3,.3,.2,.2,-.2,-.2,-.3],[0,0,.1,.1,.3,.3,.1,.1] + r,[0.9098,0.9098,0.5451]);
x = linspace(0,2*pi,100);
bpos = [-.2,r,0];
fpos = [.2,r,0];
backWheel = hgtransform(car, 'Matrix', makehgtform("translate",bpos));
frntWheel = hgtransform(car, 'Matrix', makehgtform("translate",fpos));
p = patch(backWheel,cos(x).*r,sin(x).*r,[.8,.8,.8]);
p.copy(frntWheel);
p = plot(backWheel,[0,0],[r,-r],[r,-r],[0,0],'Color','black');
p.copy(frntWheel);
filename = 'tmp.gif';
rad = 0;
for i = 1 : 100
f = getframe(a); % ムービーフレーム(構造体)としてキャプチャ
tmp = frame2im(f); % 画像に変更
[A,map] = rgb2ind(tmp,256);
if i == 1 % 新規 gif ファイル作成
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.05);
else % 以降、画像をアペンド
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.05);
end
rad = rad - 0.2;
car.Matrix(1,4) = car.Matrix(1,4) + 0.02; %車の移動
backWheel.Matrix = makehgtform('translate', bpos, 'zrotate',rad); % 後ろタイヤの回転
frntWheel.Matrix = makehgtform('translate', fpos, 'zrotate',rad); % 前タイヤの回転
pause(0.05)
end
Jiro Doke
Jiro Doke on 18 Jun 2025 at 1:54 (Edited on 18 Jun 2025 at 1:57)
Live Scriptのアニメーションエクスポート機能が出来てからは手軽にアニメーションが欲しい場合はそれを使うことが増えました.
ただし,プレゼンや記事に使う時はGIFの速さやループカウントを細かく設定したい事が多いので,そういう時は imwrite を使います.
File Exchangeに imwrite の細かい設定を少しでも楽にしてくれそうなものもありました.