Synfigを使い始めたわけだけど操作性がイマイチ。
いや、OpenToonzにするという手もあるけどね。あっちはイラスト描ける能力があって、タイムスケジュールから背景と作画を起こして撮影(連結と特殊効果)する本格的な人向けだから...
Synfig wikiをgoogle先生に翻訳してもらってなんとか使えてはいるけど、肝心なことが書いてなかったりするんだよね。
というわけで自分用にメモ。
円ツール
正円しかかけないの?
正円しかかけないらしい。
どうしても楕円を書きたい時はグループ化してからグループの編集機能で潰す。というひと手間をかければできるらしい。
矩形ツール関連
長方形しか書けないの?
長方形しか書けません。パラメタが少ない分、クラッシュを起こしにくいのは良い点。背景を塗りつぶす時くらいしか使わないけど。
角を丸くしたい時はスプラインツールを使うこと。
スプラインツール関連
スプラインってなんやねん?って人は「自由に描ける線」だと思えば良いと思う。ただ、鉛筆で線を引く感じではなくて、点と点をつないでいくイメージ。
矩形を描けるのはいいが終了の仕方がわからん
スプラインツールで矩形を書き始めたはいいが、終了のしかたがわからんぞ。ダブルクリックとかEnterでもダメ。クリックする度に頂点がどんどん増えて行くんだが。
→どこか頂点で右クリックして「スプラインをループ」を選ぶか「make spline」ボタンを押せば終了できる。
直線を書きたいだけの場合は「スプラインをループ」を使えない。(使ってもよいが平らな三角形として扱われるようなので、「make spline」ボタンを使う必要がある。
頂点を動かそうとしたら黄色いボタンが出てきて曲線の編集になってビビるんだが
最初にビビるのはこれ。しかもデフォルトでは接線の編集しかできないのでなんじゃこりゃになる。
接線の編集しかできないのは赤色の頂点の部分で右クリックして「接線の分割」を選択することでベジェエ曲線に変更できる。
頂点を移動させたい時は黄色い丸を非表示にして赤い丸を触れるようにするとやりやすい。黄色い丸は「接線ハンドル」、赤い丸は「頂点ハンドル」と呼ぶらしい。
ハンドルの表示/非表示はキャンパスの上にあるボタンで変更できる
せっかく書いた図形を移動できないんすけれど
移動させる時は緑色の丸(位置ハンドル)をつまんで移動させる。
拡大ツールも回転ツールも無反応なんすけど
拡大ツールで頂点ハンドルをつまんで引っ張ると、頂点だけ引き伸ばされてしまう。OfficeのノリでCtlを押しながら頂点を動かしてもダメ。最初はこれにハマる。
ここでsynfigの必須スキル「Ctl + A」が必要。
図形を選択して「Ctl+A」を押すと、全てのハンドルがピンク色に変わる。この状態で頂点をドラッグすれば拡大/縮小できる。
回転も同じ要領で。
頂点を追加すると形が崩れんすけど
知る人のみぞ知る「Insert Item & Keep Share」を使う。
曲線の上で右クリックして「アイテムを挿入」で頂点を追加すると、無神経に接線で頂点が追加されて形が崩れる。けっこうムカつく。
そんな時は「アイテムを挿入」の上にある「Insert Item & Keep Shape」で追加すると良い。形が崩れないように気を利かせながら頂点が追加される。
タイムマシンが発明されたら18歳で上京して本厚木で空振りしていた自分に教えてあげたい。大人の階段を登りたいならまず落ち着け。Keep Shapeだ。その後の関係を崩さないようにケアしながら食事に誘い、デートに誘うのだ。"アイテム"の挿入はその先なのだ。と。
長方形の角を丸くしたいんすけど
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
この"仕様"には他のユーザーも頭を悩ませている。海外のサイトを見ていると
sifzはgzipで圧縮したXMLファイルなので手動で編集できる。テキストエディターでGUIDをユニークなIDに変更すといいよ!。
…などと書いている人がいる。しかし実際にやってみると
二度とファイルを開けなくなるという罠にハマるので良い子はやっちゃダメ!
現在最も安定した方法はコピーした後のスケルトンのプロパティを開き、ボーンの名前を一つづつ変更する方法。
ボーン名を変更すると自動的にguidが振り直される仕様のようだ。直接接続されている子ボーンとの連結も自動で修正される。
この要領で全てのボーンを直せば元のレイヤーグループとは完全に独立したレイヤーグループを作ることができる。
ちなみにボーンの名前を変更すると、XML上はbone名(1)みたいな名前のボーンがあちこちに作られる。どうもバックアップ的な位置づけらしく、guidもそのままコピーされてしまっている。
画面には表示されないので気付かないが、これがいろいろな矛盾を引き起こして不安定になる。これを直すにはボーン名を修正した後sifzファイルを開いて手動でXMLの削除を...
めんどくせぇ... そろそろOpenToonzにしようかな...
アニメーション関連
スプラインに沿って動作させたいんじゃい
まっすぐ動かすだけでなく、ちょっとカーブに沿って動かしたくなるときがある。そんなときはこの小技。
公式のマニュアルは古いバージョンの説明なのでリージョンやら回転レイヤを追加しろやら無駄な説明が出てきてよくわからん。突然グループ化しろとかやめれ。ちゃんと説明しろや。
30分くらい格闘したところ、要するに「動かしたい画像の中心点を選択して、動かしたいスプラインの線の上で右クリックしてリンクしろや」あと、「回転させたいんやったら動かしたい画像をグループ化しとくとええで。」
ということらしい。だったらそう書けや。
とうことで、矢印というかブーメランみたいな線をRっぽいスプラインに沿って動かす例。
- 左側の矢印を選択。
- 緑の丸(中心点)を選択
- CTLを押しながらRを選択して、線上で右クリック
- 「スプラインにリンク」を選択
これで矢印の中心点が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。