BB劇場におけるMMD,3DCGとの合成について【AfterEffects,Element3D,Cinema4D】

 数か月ほどずっと苦心していた作業の流れがようやく上手くまとまったので、同じ道を通ろうとするホモ達のために辿った道のりをここに載せておこうと思います.

 近年のBB劇場の要となりつつある3d表現ですが、基本的に編集ソフトのカメラ制御は表現に限界がある上にクソ重く、やはり適宜3dcgソフトを使えるとずいぶん表現の幅が広がってきます.特にMMDを使うことができれば、MMDを原画とする声優達に関しては自由自在に扱うことができ、さらに2.5MMDを用いれば男優たちですら自由自在に動かすことが可能です.

 しかし、MMDなどから出力した動画でいざ編集をしようとすると面倒なことに気づきます.当然ながら、出力した動画は2dであるため、編集ソフト側で構成した3d要素との前後関係について破綻が発生します.1モデル程度なら1fずつレイヤー順序を調整しても良いですが、多数のモデルや、複雑なカメラワーク、さらには被写界深度やパーティクルシステムによるエフェクトとの前後関係を解決するのは苦業です.特にBB劇場においては様々な2dのBB素材やエフェクト素材を用いることになるので、全てMMD上で作るというわけにもいきません.

 というわけで、この前後関係を機械的に解決する方法を自分が辿って行った順に述べます.基本的にMMDとAfterEffects、最後にCinema4dを用いますが、AviutlやBlenderでも同様の考え方で処理ができると思いますので、ご参考までに.

基本的な考え方

 3dcgから出力した動画が失っているのはZ軸の情報ですので、これを何とかしてレイヤーに渡すことができれば良いわけです.動画にZ軸の情報を持たせる方法として一番単純なのはデプスマップ(Zdepth,Zbufferh,深度マップ)です.RGBやグレースケールにカメラから見たZ軸の情報を載せるものです.

f:id:ggradesticg:20181222010949p:plain

Z軸情報をグレースケールで含んだ画像

 これによってZ軸を白黒上に載せることができているので、あとは3dレイヤーを置きたい位置に対応した白または黒の値で画像を二分し(レベル補正系のエフェクト)、

f:id:ggradesticg:20181222011423p:plain

手前から二番目の草辺りの白レベルで二分した画像

 これをルミナンスキーで抜いたもの(ワールドマット)のアルファチャンネルを3dレイヤーに移せばよいわけです(AEならルミナンスキーマットでOK、Aviutlだと上のオブジェクトでクリッピング)

f:id:ggradesticg:20181222011840p:plain

手前から二番目の草辺りに挿入された2dレイヤー

f:id:ggradesticg:20181222012335p:plain

ルミナンスキーマット C4dレンダラーでは使えないので注意

 この状態で元の3dcg上のカメラと編集ソフトのカメラの動きがあっていれば、他のフレームでしっかりと前後関係が成立します.ただし、デプスマップはあくまでカメラから見た深度を表しているので、絶対座標とグレースケールの関係はカメラが動くと変わります.そこはキーフレームで対応するか、自分で計算のエクスプレッションを書かなければいけません.

 また、アンチエイリアスやモーションブラーを使うとエッジの部分は少し雑くなりがちです.これは割とどうしようもない話ですが、ワールドマットにアルファブラーをかけたりすると違和感は減ると思われます。

Aviutl+MMD

 自分はモデルの複製をやりたかったのであきらめたのですが、MMEにより描画されたものがなければ一応できるはずです.(なので特に困る点としてCloneが使えません)

 Z情報をこの辺りでとってきて

seiga.nicovideo.jp

seiga.nicovideo.jp

カメラを持ってきて

www.nicovideo.jp

デプスマップのレベル補正にキーフレーム(中間点)を打てばそこそこ正しい前後関係にはなると思います.ただしキーフレームを打つのは手間なので、スクリプト制御でそのあたりを計算してあげると良いのかもしれません(Aviutlのスクリプト制御については全く知らないので想像ですが)

 

AfterEffects+MMD+Blenderのみ

 前述の方法でZバッファを取ってきた後,レベル補正(個々の制御)でマットを作ります.

 さて、最大の問題はMMD2AEの配布が停止していることです.ということでMMDBridgeによってAlembicを出力し、Blenderで読み込み、BlenderのアドオンでAEに移します.スクリプトファイルの形で出力されるのでAEで実行すればカメラを取り出せます.

f:id:ggradesticg:20181222015016p:plain

ユーザー設定からAdobe After Effects(.jsx)をONにし、エクスポートで選択する

 この方法には実は深刻な問題があり、各ソフトのワールド座標系の違いから、最終的にカメラがいるワールド座標がクソデカくなるようで、.出力した動画とAEのワールド座標を合わせるのがかなり至難の業です.AEの座標系では原点が画面の中央ではなく左上にくる上、だいたい40倍ぐらいスケールが変わるっぽいですが、正確な値がちょっとよくわからないので、ヌルやエクスプレッションで微調整するしかないです.

Element3dを経由する

 ということでMMD2AEがない現状、カメラをぴったり合わせるのが難しいため、破綻を避けるには先にMMDの動画を出力することをあきらめて、AE上で描写させるという手を使うことになります.

 AEプラグインのElement3dを使うとObjシーケンスが読み込めるので、多少前述の方法で移行したカメラが元々のMMDのものと異なっても描写は破綻しません.またElement3dにはワールドマットを作成する機能も付いているため、その点での破綻も避けることができます.さらにElement3dはマテリアル設定などの普通の3dcgソフトの機能を有しているので、MMDよりかなりクオリティの高いレンダリングができます.クローナー、デフォーム、環境マップといった機能もあるので、Cloneが使えない問題も解決することができます.しかしながら、Element3dでMMDのObjシーケンスを読み込む際には二点問題があるようです.

 まず、MMDBridgeについているObjシーケンスエクスポーターはMMDの外親登録とモデル読み込み順序の影響を受け、メッシュが大きく破綻することがあります(外親登録の子が親より後に読み込まれていると破綻するっぽい)さらに、Element3dのBakedAnimationの不具合としてワールド座標が破綻することがあります(原点がフレームによって変わったりする)

 この問題については、MMD→MMDBridgeAlembic→Blender→アニメーション付きでObjエクスポート→Element3dと経由することで解決できるようです.

f:id:ggradesticg:20181222022446p:plain

出力先を指定する画面の左下にあるアニメーションにチェックをいれる

 二点目の問題として、Element3dのOBJシーケンス描画はメチャクチャ重いです.正直なところデプスマップをプロキシ出力しておき、それからワールドマットを作るようにしないと重すぎてエフェクトを付けたりするのが厳しくなります.(レイヤーの数だけElement3dが同じ計算を繰り返すことになるので、相当重い)

Cinema4dを経由する

 ということで、MMD2AEに代わるスクリプトを自分で書く技術がない限りは3DCGソフトに頼るしかなさそうです.マテリアル設定やレンダリング設定を覚え、かなりのレンダリング時間に耐えなければなりませんが、これまでの問題は解決しました.

 特にCinema4dはAEとの連携が強いといわれるだけあって、色々できます.MMDBridgeによってAlembicでMMDをC4Dに移すことができるので、アニメーションをMMDで制作した後C4dに写し、マテリアルを整え、マルチパスを付けてレンダリングすればデプスマップもワールドマットも手に入ります.

cubelic3.jp

c4d.motiondesign81.com

 後からワールドマットを作成したくなった時にはデプスマップから作成すれば良いです.

 さらに、AEでC4dファイルを読み込めばそこからカメラとライトの情報も抽出できるのでそのあたりも解決します.

 さらにC4dにおいて、外部コンポジットタグを使うことでオブジェクトの座標をAEで読み込むことすらできます.ただし外部コンポジットタグはキーフレーム座標しか取り出せないため、ヌルにXpressoでMMDAlembicポリゴンの中心座標を渡して、キーフレームにベイクするなどする必要があります.

 Xpressoはこんな感じで組んで

f:id:ggradesticg:20181222025015p:plain

XpressoでMMDオブジェクトの座標をヌルに移す

アニメーションをベイクして外部コンポジットタグを付けてAEでC4dを読み込めばOKです

cubelic3.jp

おそらくこの一連の作業ならCinema 4D Liteでもできる気がします.

 

 

まだまだ各ソフトについて良くわかんないですが、何かあれば@GGradestまでお気軽にどうぞ.