C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

OpenSCAD でアニメーションを作成 -> 連番PNG -> ffmpeg で apng/mp4(h.264) にする方法のメモ

1. OpenSCAD でアニメーションを作る

use <../../../utility/color/HSL.scad>

$fn = 6;

for ( L = [ 0 : 1 / 6: 1 ] )
  for ( S = [ 0 : 1 / 5: 1 ] )
    for ( H = [ 0 : 30 : S > 0 ? 360 - 1 : 0 ] )
      translate( [ S * cos( H ), S * sin( H ), L - 0.5 ] )
        color( to_RGB_from_HSL( [ H, S, L ] ) )
          rotate( [ $t * 720, 0, $t * 360 ] ) // 👈 ここの $t スペシャル変数がアニメーション用
            scale( 1 - S )
              cylinder( d = 0.1, h = 0.075, center = true );

ふつーに .scad を書いて、アニメーションを $t (sec) で導入するだけでした。かんたん。

2. OpenSCAD でアニメーションをプレビュー&連番PNG出力する

OpenSCAD でアニメーションをプレビューしたい場合は:

f:id:USAGI-WRP:20200224102007p:plain

  1. ↑ View -> Animate を on 状態にする

f:id:USAGI-WRP:20200224102415p:plain

  1. ↑ プレビューとコンソールの間にアニメーション設定が出現するので FPSSteps を設定 (TimeFPSStepsを設定すると自動的に回りはじめます。この値がソースの $t へ入りアニメーションします)

この状態で Export / PNG すると連番PNGが出てきそうな予感がしますが、 Export / PNG しても Export / PNG した瞬間の $t の1枚だけが出力されます。そうじゃない動作になります。

f:id:USAGI-WRP:20200224102959p:plain

  1. Dump Pictures を on にします

Dump Pictures を on にするとプレビューのアニメーションのフレームが描画されると同時に frame00000.png, frame00001.png, ... の連番PNGがしれっと .scad と同じディレクトリーへ出力され始めます。 OpenSCAD に設定した FPSSteps を構成するすべての Time の .png の出力が終わると Dump Pictures のチェックが自動的に外れます。

3. 連番 PNGffmpeg で apng / mp4 へ変換する

ffmepg の他にも手段はたくさんあります。ウェブアプリで連番画像から apng を作れる EZGIF.COM/APNG maker もあります。しかし、 OpenSCAD を実用できる状態でおそらく手元にあるであろう PC に比べると手間と時間がかかります。Windows用のアプリとかいろいろあるみたいですが、今回のメモの作成では汎用性と可搬性がとても高い ffmpeg を WSL の Arch 環境から使いました。

# frame00000.png, frame00001.png, ... から apng ( animation png ) を ffmpeg で作成
ffmpeg -framerate 24 -i frame%05d.png -r 60 -plays 0 out.apng
# frame00000.png, frame00001.png, ... から mp4 ( h.264 ) を ffmpeg で作成
ffmpeg -framerate 24 -i frame%05d.png -r 60 -pix_fmt yuv420p -vcodec h264 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4

連番 .png --/ffmpeg/--> .apng --/ffmpeg/--> .mp4 ( h.264 ) も可能。(今回はわざわざそのルートで逐次変換する必要はないので .apng も .mp4 も直接生成)

ちなみに、 TwitterFacebook も apng は投稿してもアニメーション削除されます。悲しい。😥

Imgur だと apng 期待動作のまま置いて貰えます。嬉しい。😃

https://imgur.com/pSZbsJ3

Imgur

↑ imgur に置いた画像を markdown で直接参照しています。

はてなブログ(はてなフォトライフ)は Twitter, Facebook と同様でアニメーション勝手に削除されます。悲しい😥

参考

  1. How do I use ffmpeg apng encoder? : ffmpeg
  2. Using ffmpeg to convert a set of images into a video
  3. ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~ - Qiita
  4. Information about ffmpeg command line options - Super User