takeda_san’s blog

KotlinとVRを頑張っていく方向。

BlenderとMMDでマッチムーブ(実写合成)動画を作ろう

まずは完成したものをどうぞ

youtu.be

(できればサイト側で1080p60fpsで見てほしい…)

きっかけ

以前、マッチムーブの記事を書いたのですが、カメラがほぼ固定でカメラの回り込みに対応してなかったんですね。

takeda-san.hatenablog.com

そんなある日、こちらの動画を発見。
かわいい、すごい!

youtu.be

今回つかったもの

背景動画の各種設定

マッチムーブ合成をするには、動画のカメラの動きとBlender上のカメラの動きを同期させる必要があります。
そのために動画上の特徴点をマーキングして、それをトラッキングさせてあげる必要があります。

動画の読み込み

Blenderを起動してVFXを選択してファイルを新規作成します。

f:id:takeda_san:20200906113404p:plain

中央のOpenボタンから背景に設定したい動画を読み込みます。
今回はiPhoneで撮影した動画を使います。

f:id:takeda_san:20200906115236p:plain

マーカーの設定とトラッキング

  1. 下のMovie Clip EditorのCurrent Frameを0にする
    青いバーを左にドラッグまたは、右下の1のところを0に変えるでもOK。
  2. 左のTrackタブからSet Scene Framesを押してPrefetchボタンを押す
    処理が始まるので終わるまで待ちます。
  3. Detect Featuresを押す
    自動で特徴点が設定されます。
    後ほど、これをもとに調整をしていきます。

f:id:takeda_san:20200906121005p:plain

ここまでで、こんな画面になっていると思います。

f:id:takeda_san:20200906120357p:plain

黄色いマーカーが選択状態になっていない場合は、Aキーで選択しておいてください。
動画下のTrack Markersボタンを押してトラッキングを開始します。
すると動画が再生されると同時にマーカーの軌跡が表示されると思います。

ラッキング終了時点。

f:id:takeda_san:20200906120709p:plain

下のMovie Clip Editorに何やら赤と緑の波形が出ましたね。
これが、トラッキングの結果です。
といわれても訳が分かりませんね、結果が良いのか悪いのか確認しましょう。

ラッキング精度を確認する

左側のSolveタブから、Solve Camera Motionボタンを押します。

f:id:takeda_san:20200906121251p:plain

処理が終わると動画部分の右上にSolve errorが表示されます。
これがおおむね2以下なら、カメラの位置がおおよそ同期されているように見えるらしい。

それで今回は…

f:id:takeda_san:20200906121436p:plain

驚異の72.935。
かなり結果は悪いようです。

ラッキング精度を上げる

Solve errorを少なくするには、変なトラッキングの仕方をしているマーカーを削除していく必要があります。
Movie Clip Editorに何やら赤と緑の波形を参考に削除していきます。

丸で囲ったあたりがメインの波形と大きくずれてスパイクになっています。
これがあるとよろしくないので、ひとつひとつ丁寧に削除していきます。
波形を選択 -> Deleteキーで削除できます。
(青い線は今は気にしなくてOK)

f:id:takeda_san:20200906123429p:plain

削除後の波形がこんな感じ。

f:id:takeda_san:20200906124008p:plain

改めてもう一度、Solve Camera Motionボタンを押して、Solve errorを確認します。

f:id:takeda_san:20200906124132p:plain

0.7496。2以下になったので、カメラ位置のトラッキングは、これでよさそうです。

マーカーの数を8個以上にする

ここまでで、最後のフレーム時点で黄色で残っているマーカー数が8個以上あるか確認しましょう。
今回はギリギリ8個残っています。

f:id:takeda_san:20200906121849p:plain

もし、これが7個以下だった場合は手動でマーカーを追加して最後のフレームに残るようにします。
マーカーを付けるにもコツがあるらしいのですが、よくわからんのでトライアンドエラーになると思います。
(動画の最初から最後まで映っていて、周りと色が違うところにつけるといいのかな…)

マーカーは、動画上でCtrl+左クリックで付けられます。
マーカー足した後は、またマーカーを全選択してTrack Markersボタンを押してトラッキングします。

シーンへの追加と床、原点の追加

左のSolveタブからSet as BackgroudとSetup Tracking Sceneボタンを押します。

f:id:takeda_san:20200906124744p:plain

右上の3D view portに動画とPanelとCubeが追加されたと思います。
ですが、まだ動画と各種オブジェクトの位置があっていません。
これに地面と基準点を設定して位置を合わせていきます。

地面の位置についているトラッカーを3つ選択して、左のSolveタグのFloorボタンを押します。

f:id:takeda_san:20200906134015p:plain

同じように中心付近のマーカーを選択して、左のSolveタグのSet Originボタンを押します。

f:id:takeda_san:20200906134805p:plain

アニメーションを再生してみて、動きを確認してみましょう。
すると、右上の3D view portのオブジェクトが動画となじんだと思います。
ここまでで、背景動画の設定は終了です。

f:id:takeda_san:20200906135020p:plain

f:id:takeda_san:20200906135500g:plain

MMDモデルとモーションのインポート

ここからは、MMDモデルの合成作業に入っていきます。

MMDアドオンの設定

今回はBlender内でMMDモデルとモーションを扱うので、アドオンをあらかじめ設定しておきます。
手順はこちらを参照してください。
(丸投げ)

3dcgmodel-info.com

MMDモデルのインポート

今回はアリシアちゃんを使います。
pmxとvmdファイルがセットで入っているので、お試しにはめちゃくちゃ便利。
しかもかわいい。

ニコニ立体ちゃん特設サイト - ニコニ立体

モデルのインポート
ツールバーのFile -> Import ->MikuMikuDance Model

f:id:takeda_san:20200906143404p:plain

背景との合成

右側のカメラアイコン(Render Property)タブを選択して、Render EngineをCyclesを設定。
Film -> Transparent のチェックを付けます。
これで背景が透過されて表示されます。

f:id:takeda_san:20200906144756p:plain

F12を押してレンダリングしてみましょう。

f:id:takeda_san:20200906144914p:plain

モデルを置いただけなので、背景から浮いていますが無事合成できていることが確認できました。

モーションのインポート

MMDのモーションをインポートします。
ツールバーのFile -> Import ->MikuMikuDance Motion

f:id:takeda_san:20200906150006p:plain

フレームレートの調整

背景動画はフレームレート60fpsで撮影、MMDのモーションは30fpsで作られているため、ミスマッチが起きています。
このフレームレートを60fpsで統一していきます。

まず、プリンターのアイコンの(Output Properties)タブから、Frame Rateを60fpsに変更します。

f:id:takeda_san:20200906150824p:plain

これでMMDのモーションも60fpsで動くようになります。
なのでこのまま、レンダリングすると2倍速ダンスになります。

f:id:takeda_san:20200906151734g:plain

なので、MMDのモーションは0.5倍速で動いてもらうようにしましょう。
右上のウィンドウのEditor Typeを変更して、Dope Sheetを開きます。
MMDのモーションのタイムラインが表示されると思います。
このタイムラインを2倍に引き伸ばすことで、モーションを0.5倍速にします。

タイムライン上で、aキーを押してすべてを選択。
sキーを押して右方向にマウスカーソル移動させます。
今回のモーションはフレーム数3622なので、7244が二倍なのですが、厳密にやらないで大体で大丈夫です。

f:id:takeda_san:20200906161752p:plain

配置の変更

自分が意図する場所にモデルを移動させたり、背景のスケールに合うように拡大縮小をしましょう。

f:id:takeda_san:20200906150316p:plain

いやぁ、かわいい…

ライトの設定

ライトの設定が出来栄えに影響する一番大事なところなのですが、私自身まだよくわかってなくて雰囲気でやってるので解説はほかの詳しい方に譲ります。
ここでは、私は今回こう設定しましたという内容です。

まず現状確認。

f:id:takeda_san:20200906150316p:plain

今回は夏場の屋外しかも真昼間に動画を撮影したので、照明の強さがちょっと足りてません。
LightをSunにしてStrengthを2にします。

f:id:takeda_san:20200906153802p:plain

もう一度、F12でレンダリング

f:id:takeda_san:20200906153608p:plain

モデル自身はあまり浮かなくなりましたが、影がちょっと後ろの木と比べると濃いですね。
ノードをちょっといじって色を薄くしましょう。

上のCompositingタブからノードを表示します。

f:id:takeda_san:20200906154748p:plain

Alpha OverでBackgroundのビューレイヤー内のGroundにある影をFacの値を0.6にすることで薄く描画します。
また、動画の前にその絵を作っておきたいので若干つなぎ方を変えます。
(見ずらいと思うので拡大してみてください)

変更後

f:id:takeda_san:20200906155041p:plain

F12でレンダリングして、変化を見てみましょう。

f:id:takeda_san:20200906155157p:plain

まだ違和感があるものの、だいぶ背景となじみました。

動画に出力する

f:id:takeda_san:20200906161159p:plain

最後に動画として出力します。
プリンターのアイコンの(Output Properties)タブのFrame Endを動画の尺に合わせます。
(多分MMDのモーションの尺になってると思いますので…)

また、今回は動画で出力したいので、Output -> File Format で、FFmpeg videoを選択しておきます。

f:id:takeda_san:20200906155927p:plain

最低限の設定はこれくらいで、後は解像度や細かいエンコードの設定はお好みでどうぞ。
ツールバーからRender -> Render Animationでレンダリングが始まります。

f:id:takeda_san:20200906160354p:plain

レンダリングには時間がかかるので、事前に60フレーム分ぐらいあらかじめテスト出力してみるのも良いかもしれません。
レンダリングの高速化は、この辺をみつつやってみるのがいいかもしれません。
私もGPU動員してみましたが、あんまり早くはならなかったです。
(CIみたいに別マシンコンテナで立ち上げてブン回したほうがよさそう)

Blender でレンダリング時間を短縮する方法まとめ

さらに夢広がる展開

この記事によると、ばもきゃは無料ことVMCと​EVMC4U​+​UnityVMDRecorderでモーションキャプチャしてvmd形式のモーションを作成できる。

note.com

ということは、blenderにインポートして、マッチムーブ合成ということができちゃいますね。