があらんどう

伽藍洞です。

3DプロットのGIFアニメ作り方@MATLAB photoshop

グラフに出力した結果を動画やアニメーションにしたいことは時々でてくる。
今回は簡単なGIFアニメの作り方を備忘録的にメモ。


特に3Dのグラフのアニメーションの作り方についてMATLABでデータ処理してグラフを作って生成。
生成したグラフの画像をphotoshopでGIFアニメにする。
グラフ描画ソフトとしてはigorを用いることが多いのだが、3Dのプロットはいまいちなので今回はMATLABにて。
2D編をigorで別の機会に紹介したい。

まずは今回プロットする例は3次元の調和振動子の軌道を用いる。
途中経過の軌道を残したまま3次元的な軌跡が少しずつ追えるようにアニメにすることを想定する。
途中経過を消していく場合もあると思うが、今回は履歴を残していくことを前提にする。

まずはなんらかの方法で3次元的な軌道を計算してcsv形式などで保存する。

この結果はx軸y軸z軸それぞれの位置を示している。後ろの数値に行くにしたがって時間が経過した後の質点の位置になる。
これを試しに3Dプロットしてみる。
MATLABワークスペースをファイルでドラック&ドロップ。

上のようなップアップがでてきたら、列ベクトルに変更して読み込み。
以下のプログラムを実行してみると

%programを実行する前にdataをロードすること
plot3(x,z,y)
pbaspect([1 1 1])

set(gca,'FontSize',14)%フォントサイズ
xlim([-4E-9 4E-9])
ylim([-4E-9 4E-9])
zlim([-4E-9 4E-9])
xlabel('x');
ylabel('y');
zlabel('z');

ポップアップが表示されて以下のようなプロットがされる。

これだとプロットがごちゃごちゃしすぎてよくわからないので、すこしづつ表示することで軌道の変化が分かりやすいアニメーションとしてしていく。

以下のプログラムを実行するとコマ送りの画像が順次保存されていく。
この保存したグラフを後でphotoshop上でGIFアニメにしていく。

一点づつプロットするのはずつプロットするとまどろっこしすぎるのでサクサク動くアニメーションにするために
変数stepで一コマ当たりに表示する点数を定義している。
stepの数を大きくするとざっくりとした動きになるし、小さくすれば細やかな動きになる。
変数komaは配列の要素数をstepで割った値なので生成されるコマ数になる。
今回のプログラムはかなり適当なので読みこ込んだ配列の要素数がstepの倍数になっていないと余りの点は無視される形になっている。

%programを実行する前にdataをロードすること
i = 1;
motosize = numel(x);%元の配列の要素数を返す
step = 10;%1コマあたりの点数
koma = round(motosize/step);%stepは元データの点数の因数ではない場合は最後までプロットされないプログラムになっておるので注意

zstep = cell(step,1);%tのcellをつくる
xstep = cell(step,1);
ystep = cell(step,1);

for i =1:koma
    zstep = z(1:step*i);
    xstep = x(1:step*i);
    ystep = y(1:step*i);
    
    plot3(xstep,zstep,ystep);
    pbaspect([1 1 1]);
    set(gca,'FontSize',14);%フォントサイズ
    xlim([-40 40]);
    ylim([-40 40]);
    zlim([-40 40]);
    xlabel('x');
    ylabel('z');
    zlabel('y');

    filename = ['orbit',num2str(i),'.png'];
    exportgraphics(gca,filename,'Resolution',300);
end

三次元のプロットを行うコマンドが

plot3(xのベクトル、yベクトル、zベクトル);

の部分。
また、表示の範囲を変えるために

xlim([-40 40]);
ylim([-40 40]); 
zlim([-40 40]);

を使用している。

xlabel('x');

は各軸にラベルを付けるコマンド。

3Dプロットの視点の変え方がいまいちわかっていないので今回は保留。

画像保存の部分が

 exportgraphics(gca,filename,'Resolution',300);

に相当。今回はpngで保存。

ここまで画像の準備できたのでphotoshopを使ってGIFを作っていく。

photoshopを開いて最初のコマ、今回だとorbit1.pngをインポートする。
メニューバー>ウィンドウ>タイムライン をクリックする。
すると以下画像の赤く四角囲ったのようなウィンドウがあらわれる。ウィンドウ内の赤丸で囲った「フレームアニメーションを作成」をクリックする。

するとタイムライン上にインポートした画像があらわれる。
次にorbit2.png以降の画像をすべてドラッグ&ドロップ。
インポートするためには下画像の赤矢印で示した丸を画像の枚数回押す。(これが地味にしんどい、コマンド的にインクルードできたら・・・)

次に上の画像の青矢印で示した箇所をクリックして「レイヤーからフレームを作成」を選択。
これによってレイヤーが読み込まれる。

画像の下にあるv字の部分をクリックするとフレームごとのディレイが指定できる。
まとめて変更したいときはフレームをsfiftやctrlでまとめて選択したうえで変更する。
試しに動画を動かしてみたいときは再生の▶をクリックすればよい。

満足いく動きができたら、保存する。
メニューバーのファイル>書き出し>Web用に保存 を選択。
形式をGIFにして、下の方にあるアニメーションのループオプションを無限にしておき、保存する。
今回できた画像はこちら。