Synfigメモ

Synfigを使い始めたわけだけど操作性がイマイチ。

いや、OpenToonzにするという手もあるけどね。あっちはイラスト描ける能力があって、タイムスケジュールから背景と作画を起こして撮影(連結と特殊効果)する本格的な人向けだから...

Synfig wikiをgoogle先生に翻訳してもらってなんとか使えてはいるけど、肝心なことが書いてなかったりするんだよね。

というわけで自分用にメモ。

円ツール

正円しかかけないの?

正円しかかけないらしい。

どうしても楕円を書きたい時はグループ化してからグループの編集機能で潰す。というひと手間をかければできるらしい。

円ツールは正円しかかけないので楕円を獲得はグループ化して潰す

矩形ツール関連

長方形しか書けないの?

長方形しか書けません。パラメタが少ない分、クラッシュを起こしにくいのは良い点。背景を塗りつぶす時くらいしか使わないけど。

角を丸くしたい時はスプラインツールを使うこと。

スプラインツール関連

スプラインってなんやねん?って人は「自由に描ける線」だと思えば良いと思う。ただ、鉛筆で線を引く感じではなくて、点と点をつないでいくイメージ。

矩形を描けるのはいいが終了の仕方がわからん

スプラインツールで矩形を書き始めたはいいが、終了のしかたがわからんぞ。ダブルクリックとかEnterでもダメ。クリックする度に頂点がどんどん増えて行くんだが。

→どこか頂点で右クリックして「スプラインをループ」を選ぶか「make spline」ボタンを押せば終了できる。

直線を書きたいだけの場合は「スプラインをループ」を使えない。(使ってもよいが平らな三角形として扱われるようなので、「make spline」ボタンを使う必要がある。

スプラインツールの終了は make splineボタンで

頂点を動かそうとしたら黄色いボタンが出てきて曲線の編集になってビビるんだが

最初にビビるのはこれ。しかもデフォルトでは接線の編集しかできないのでなんじゃこりゃになる。

接線の編集しかできないのは赤色の頂点の部分で右クリックして「接線の分割」を選択することでベジェエ曲線に変更できる。

接線を分割するとベジェエ曲線で編集できるようになる

頂点を移動させたい時は黄色い丸を非表示にして赤い丸を触れるようにするとやりやすい。黄色い丸は「接線ハンドル」、赤い丸は「頂点ハンドル」と呼ぶらしい。

ハンドルの表示/非表示はキャンパスの上にあるボタンで変更できる

ハンドルを有効/無効にして頂点を自由に編集する

せっかく書いた図形を移動できないんすけれど

移動させる時は緑色の丸(位置ハンドル)をつまんで移動させる。

緑のちっこいやつが「位置ハンドル」

拡大ツールも回転ツールも無反応なんすけど

拡大ツールで頂点ハンドルをつまんで引っ張ると、頂点だけ引き伸ばされてしまう。OfficeのノリでCtlを押しながら頂点を動かしてもダメ。最初はこれにハマる。

ここでsynfigの必須スキル「Ctl + A」が必要。

図形を選択して「Ctl+A」を押すと、全てのハンドルがピンク色に変わる。この状態で頂点をドラッグすれば拡大/縮小できる。

回転も同じ要領で。

頂点を追加すると形が崩れんすけど

知る人のみぞ知る「Insert Item & Keep Share」を使う。

曲線の上で右クリックして「アイテムを挿入」で頂点を追加すると、無神経に接線で頂点が追加されて形が崩れる。けっこうムカつく。

そんな時は「アイテムを挿入」の上にある「Insert Item & Keep Shape」で追加すると良い。形が崩れないように気を利かせながら頂点が追加される。

タイムマシンが発明されたら18歳で上京して本厚木で空振りしていた自分に教えてあげたい。大人の階段を登りたいならまず落ち着け。Keep Shapeだ。その後の関係を崩さないようにケアしながら食事に誘い、デートに誘うのだ。"アイテム"の挿入はその先なのだ。と。

地味に嬉しい Insert Item & Keep Share

長方形の角を丸くしたいんすけど

synfigには「結合」的な機能は無いのでスプラインでお絵描きするしかない。

まあ丸めたい半径で頂点を作って、その半分の距離でベジェエ曲線描けばいんじゃね?と理系の授業で製図を習っていた私は思うのだがあまり知られていないらしい。

公式のWikiを見ると「矩形の頂点で円を描いて Insert Item & Keep Shareで頂点を追加して角を取れ」的な説明が記載されているが

矩形に Insert Item & Keep Shareは無い。

というわけで正しいやり方を説明。矩形ではなくスプラインを使うのが正解。

角を丸めるにはひと工夫必要

ポイントは円と長方形の交点に頂点を追加する際、「アイテムの挿入」ではなく「Insert Item & Keep Shape」を使うこと。するとコーナーからの半分の距離でベジェエ曲線の制御ポイントを作ってくれる。

テキストツール関連

フォントをドロップダウンリストで選択できんのかい?

できないらしい。

Linuxでフォント名を正確に入力するにはfc-listの結果を使えばいい。

$ fc-list
/home/mylinux/.fonts/TanukiMagic.ttf: たぬき油性マジック,Tanuki Permanent Marker:style=Regular

"Tanuki Permanent Marker" を指定すればいいわけやね。

ただ、Goffix-Outlineはこの方法で指定できなかった。いろいろ試した結果、フォントのパス(/home/mylinux/.fonts/TanukiMagic.ttf)を直接入力すれば使えるらしい。

フォントの縁取りはできんのかい?

できないらしい。

アウトラインフォントを使うしか無い。ただ、ほとんどのアウトラインフォントは文字の部分が透明。つまり、"白い文字の周りを黒で縁取りする"ことはできない。これ、地味に困るんですけど。

スケルトン関連

スケルトンはボーンと呼ばれる骨組みに合わせて絵を動かすアレ。

絵の制御点をボーンに合わせて動かす方法と、画像をボーンに合わせて歪ませる方法がある。

制御点をボーンに合わせて動かす方法

ボーンを動かすと絵も動く(制御点が動く)

いわゆるマッチ棒で人を作って動かす場合によく使われる。

やり方は以下の3ステップ。

本体とスケルトンを作って、リンクさせて、重ねる

リンクのさせ方やスケルトンのボーンの重ね方に癖があるので以下の手順で慎重に。

まず本体を作成してグループ化し、グループ内にスケルトンを作成する。

本体とスケルトンを作成する

スケルトンはグループ内で右クリックして「新しいレイヤーを作成」- 「その他」-「スケルトン」で作成できる。

スケルトンは最初は1本のボーンしか無いので、赤丸の部分で右クリックして「子ボーンを作成」での骨を追加していく。

「子ボーンを作成」で骨を追加する
本体とそっくりなスケルトンが完成

次にスケルトンを微調整する。

ボーンは両端に赤丸があり、角度を青丸、回転する際の原点は緑で表示されているので、下図の様に原点と端の赤丸を重ねる必要がある。

こうしないと腕を動かした時に原点を中心に動くので、体から変に離れてしまうことがある。

端点(赤)に原点(緑)を重ねる

スケルトンが出来たら次は本体とスケルトンをリンクさせる。

スケルトンの赤丸を選択してShiftを押しながら本体の赤丸を選択し、右クリックあら「ボーンにリンク」を選択する。「リンク」では無いことに注意。

これをボーンの全ての点で行う。

本体とスケルトンをリンクさせる。

画面上部のボタンを使って原点(緑)や角度(青)のマークを非表示にすると作業がしやすい。

原点と角度を非表示にすると作業しやすい

最後に本体をボーンに重ねれば作業終了。以降、ボーンの角度(青い丸)を動かすとそれに合わせて本体も動くようになる。

本体をケルトンに重ねる

慣れれば本体の上に直接スケルトンを配置して編集できるが最初はこのやり方の方が覚えやすい。

レイヤー関連

スケルトン付きのレイヤーを"別のオブジェクトとして"コピーできんのかい?

できないらしい

何の話かと言うと、まずスケルトン(ボーン)付のレイヤーグループをコピーする。普通、これで別のレイヤーグループができたと思うやんか?

スケルトン(ボーン) 付のレイヤグループをコピーする

で、左側のボーンをいじると、右側も一緒に動くwwwwwww

左側のボーンをいじると右側も一緒に動く

これじゃ作った動画が全部バッハの旋律を夜に聴いた感じになっちゃうじゃんw

このシャツオシャレだな ちうか一郎さんかっこええ

なぜこんなことが起こるかと言うと、仕様だから。

ボーンにはGUIDというIDが割り当てられているだが、レイヤーグループをコピーするとGUIDもまるごとコピーされてしまう。このためコピー元とコピー先の区別ができなくなってしまうのだ。

ダメだろw

guidがまるごとコピーされるとかいう謎仕様

この"仕様"には他のユーザーも頭を悩ませている。海外のサイトを見ていると

sifzはgzipで圧縮したXMLファイルなので手動で編集できる。テキストエディターでGUIDをユニークなIDに変更すといいよ!。

…などと書いている人がいる。しかし実際にやってみると

二度とファイルを開けなくなるという罠にハマるので良い子はやっちゃダメ!

現在最も安定した方法はコピーした後のスケルトンのプロパティを開き、ボーンの名前を一つづつ変更する方法。

ボーンの名前をを1本1本修正していくのだ!(時間の無駄)

ボーン名を変更すると自動的にguidが振り直される仕様のようだ。直接接続されている子ボーンとの連結も自動で修正される。

この要領で全てのボーンを直せば元のレイヤーグループとは完全に独立したレイヤーグループを作ることができる。

ちなみにボーンの名前を変更すると、XML上はbone名(1)みたいな名前のボーンがあちこちに作られる。どうもバックアップ的な位置づけらしく、guidもそのままコピーされてしまっている。

画面には表示されないので気付かないが、これがいろいろな矛盾を引き起こして不安定になる。これを直すにはボーン名を修正した後sifzファイルを開いて手動でXMLの削除を...

めんどくせぇ... そろそろOpenToonzにしようかな...

アニメーション関連

スプラインに沿って動作させたいんじゃい

まっすぐ動かすだけでなく、ちょっとカーブに沿って動かしたくなるときがある。そんなときはこの小技。

公式のマニュアルは古いバージョンの説明なのでリージョンやら回転レイヤを追加しろやら無駄な説明が出てきてよくわからん。突然グループ化しろとかやめれ。ちゃんと説明しろや。

30分くらい格闘したところ、要するに「動かしたい画像の中心点を選択して、動かしたいスプラインの線の上で右クリックしてリンクしろや」あと、「回転させたいんやったら動かしたい画像をグループ化しとくとええで。」

ということらしい。だったらそう書けや。

とうことで、矢印というかブーメランみたいな線をRっぽいスプラインに沿って動かす例。

とりあえず矢印をRに沿って動かすやりかた
  1. 左側の矢印を選択。
  2. 緑の丸(中心点)を選択
  3. CTLを押しながらRを選択して、線上で右クリック
  4. 「スプラインにリンク」を選択

これで矢印の中心点がRの線の上だけで移動できる様になる。

とりあえず動くだけ

はいはい、コレジャナイよね。矢印をRをに沿って動かしたいよね。

やりたいのはこれだよね

そんな時は矢印をグループ化するだけで手順は同じ。

スプラインにリンクをした際、矢印が回転することがある。あと、スプラインの先端で90度回ったりする。

仕様なので我慢して手動で直すこと。

その他

CLIで使いたいんじゃい

とにかくSynfig studioはよく落ちる。リアルタイムにレンダリングしているのが良くないと思う。

CLIを使って.sifzから直接mp4を作ればいんじゃね?というわけでSynfig-coreというCLI版のSynfigをインストールする。

Synfig-coreのdebパッケージは提供されていないのでソースコードをコンパイルするしか無い。以下、公開されている手順書を参考にGithubからソースコードを入手してコンパイルしてみた

## githubから作業フォルダにダウンロード(クローン)
$ git clone https://github.com/synfig/synfig.git ./synfig.git

## ビルドの準備
$ cd ./synfig.git
$ ./1-setup-linux-native.sh

## ビルド
$ ./2-build-production.sh core full

## できた実行ファイルを/usr/binへコピー
$ sudo chmod 755 _production/build/bin/synfig
$ sudo cp -p _production/build/bin/synfig /usr/bin

## モジュールリストもコピー
$ mkdir ~/.local/share/synfig
$ cp -p _production/build/etc/synfig_modules.cfg ~/.local/share/synfig

## レンダリングしてみる
$ synfig -i test.sifz -o -o test.mp4 test.mp4 -t ffmpeg --video-codec=libx264 --video-bitrate=2000

解像度とかオプションはこのへんで調べて微調整する。

GPUを使いたいんじゃい

レンダリング中にtopを見てみると、CPUが100%になってる。NVIDIA X Server SettingでGPU Utilization を見ると0%。

せっかくGT730を増設してるのに、synfigってデフォルトではGPUを使ってくれないのね...

というわけでsynfig-coreがGPUを使ってエンコードするようにカスタマイズする。

まあぶっちゃけ今回の方法でエンコードが早くなるわけじゃないけどね。

.sifzからPNGを作る処理と、PNGをつなぎ合わせてmp4にする処理があって、前者をSynfig(CPU)、後者をffmpeg(GPU)に振り分けてるだけなので。

ただ安定感は改善されるはず。あと、ffmpegからGPUを使えるようになるので今後の動画編集で役にも立つかと。

やるべきことは以下の2つ。

  • ffmpegがGPUを使える様にエンコーダオプション(h264_nvenc)を追加する
  • Synfig-coreがffmpegへlibx264でエンコードを指示した際に、h264-nvencオプションを使用する様に変更する。

ffmpegがGPUを使えるようにh264_nvencオプションを追加する

apt installでインストールしたffmepgはh264_nvencを使えない。グラフィックボードを持っていない人もいるので当然といえば当然だが

$ ffmpeg -codecs | grep h264
DEV.LS h264    H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_cuvid ) (encoders: h264 h264_v4l2m2m h264_vaapi )

そこで、ffmpegをソースからコンパイルすることにする。ffmpegにはNVencのコードは含まれていないので、コンパイルする前にNVIDIAのサイトからダウンロードしておく必要がある。

さらにNVIDIAのドライバも最新化しないといけない。CUDAもインストールしなきゃ前提の前提を遡るこの面倒くささ。そういうとこやぞUbuntu.

## NVIDIAのドライバを更新 
## # NVIDIAのppaを追加してパッケージリストを最新化
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt list --upgradable

## # 最適なドライバを調べる 
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001287sv000010DEsd00001081bc03sc00i00
vendor   : NVIDIA Corporation
model    : GK208B [GeForce GT 730]
driver   : nvidia-driver-415 - third-party free
driver   : nvidia-340 - distro non-free
driver   : nvidia-driver-390 - third-party free
driver   : nvidia-driver-430 - third-party free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

## # 一番安定してそうな vidia-driver-390 をインストール ...したら ffmpegでエンコードする際に
## # >Driver does not support the required nvenc API version. Required: 9.0 Found: 8.1
## # >The minimum required Nvidia driver for nvenc is 418.30 or newer
## # って怒られたのでvidia-driver-430にする
$ sudo apt install nvidia-driver-430

## CUDAも必要なのでインストールする
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.2.89-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804_10.2.89-1_amd64.deb
$ sudo apt update
$ sudo apt install cuda cuda-drivers

## .bashrcも編集
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
## # ここでubuntuを再起動

## コンパイル用フォルダを作成する
$ mkdir compile
$ cd compile

## githubからNVencのヘッダを入手してインストールする
$ git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers
$ cd nv-codec-headers
$ sudo make install
$ cd ..

## githubからffmpegのソースをダウンロードする
$ git clone https://git.ffmpeg.org/ffmpeg.git

## コンパイルオプションを決める
## 今回はGPUを使う画像エンコーダのnvencと、音声を高品質で扱える音声エンコーダのlameを使えるようにします。
## さらに、最近はYoutubeでもAV1やh265が使えるようになってきているのでそれらのエンコードもできるようにします。ついでにfreetype(あまり使わないけど)も。
$ cd ffmpeg
$ sudo apt install libaom-dev libx265-dev
$ ./configure --disable-x86asm  --enable-nvenc --enable-libmp3lame --enable-libaom --enable-gpl --enable-libx265 --enable-libfreetype --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64

## コンパイル前に今のバージョンやオプションを確認しておく
$ ffmpeg -version
ffmpeg version N-95881-g59d264b0a1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9 (Ubuntu 9.2.1-9ubuntu2)
configuration: --disable-x86asm --enable-nvenc --enable-libmp3lame
libavutil      56. 36.100 / 56. 36.100
libavcodec     58. 62.100 / 58. 62.100
libavformat    58. 35.100 / 58. 35.100
libavdevice    58.  9.101 / 58.  9.101
libavfilter     7. 67.100 /  7. 67.100
libswscale      5.  6.100 /  5.  6.100
libswresample   3.  6.100 /  3.  6.100

## コンパイルしてインストールする
$ make
$ sudo make install

## シンボリックリンクを作成
## デフォルトだと/usr/local/binにインストールされるので /usr/binに変更したい
## ./configureに--prefix /usr/binって付けてもいいけどあえてコンパイルしてからシンボリックリンクを貼る
$ sudo ln -s /usr/local/bin/ffmpeg /usr/bin/ffmpeg

##バージョンを確認
$ ffmpeg -version
ffmpeg version N-99980-g9208b72a38 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --disable-x86asm --enable-nvenc --enable-libmp3lame
libavutil      56. 60.100 / 56. 60.100
libavcodec     58.112.103 / 58.112.103
libavformat    58. 64.100 / 58. 64.100
libavdevice    58. 11.103 / 58. 11.103
libavfilter     7. 90.100 /  7. 90.100
libswscale      5.  8.100 /  5.  8.100


## h264_nveucを使えるか確認
$ ffmpeg -codecs | grep h264
:
DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_cuvid ) (encoders: h264_nvenc h264_v4l2m2m h264_vaapi nvenc nvenc_h264 )
↑
h264_nvenc、nvenc、nvenc_h264などのvnencシリーズがあること

これでffmpegからGPUが使えるようになったはず。h264-nvencオプションを付けてエンコードしてみると topやNVIDIA X Server SettingのGPU Utilization でCPUがほぼ0になりGPUが使用されていることを確認できる。

Synfig-coreがffmpegへlibx264でエンコードを指示した際に、h264-nvencオプションを使用する様に変更する

本来はSynfig-coreに"h264_nvenc"というオプションを追加したいけど、いろいろ面倒なのでlib264を指定したら"h264_nvenc"と解釈するようにソースコードを直す

これをやるとSynfig studioからmp4のレンダリングができなくなるので自己責任で。

修正ファイル(synfig 1.13.11の場合):
gitディレクトリ/synfig-core/src/modules/mod_ffmpeg/trgt_ffmpeg.cpp
221行あたり
 String video_codec_real;
 if (video_codec == "libx264-lossless")
	video_codec_real="libx264";
 else
	video_codec_real=video_codec;
 if (video_codec == "libx264") ←追加
	video_codec_real="h264_nvenc"; ←追加

ソースの修正が終わったら再度Synfig-coreをビルドする。

## ビルド
$ cd ./synfig.git
$ ./2-build-production.sh core full

## できた実行ファイルを/usr/binへコピー
$ sudo chmod 755 _production/build/bin/synfig
$ sudo cp -p _production/build/bin/synfig /usr/bin

## レンダリングしてみる
$ synfig -i test.sifz -o test.mp4 test.mp4 -t ffmpeg --video-codec=libx264 --video-bitrate=2000

topでCPUの使用率が100%に張り付かず95%程度にとどまり、NVIDIA X Server SettingでGPUが使われていることが確認できるはず。
もしくは ps -ef | grep ffmpeg で-vcodec h264_nvencが指定されていればOK。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です