らくさん

2011-11-16

RadeonでMMDのAVI出力を超高速にするツールを作りました

ダウンロードはこちら→ http://kuramo.ch/mmd/


インストール方法

MikuMikuDance.exeと同じフォルダに d3d9.dll をコピーしてください。

MikuMikuEffectと共に使用する場合は、先にMikuMikuEffectの d3d9.dll を d3d9_mme.dll という名前に変更してください。


使い方

通常どおりにAVIファイルの出力を行ってください。

2011-09-01

Voodoo Camera Tracker + Javie + MMD でお手軽マッチムーブ 後編


だいぶ間があいてしまいましたが、前回の続きです。前回は練習用の映像をMMDで作成し、そのカメラワークをトラッキングしてJaive上でテキストや平面を合成しました。今回は実写映像を使用します。Voodoo Camera Tracker で実写映像のカメラをトラッキング、Javieを経由しVMD形式に書き出してMMDに読み込ませます。そして、最終的にはMMDレンダリングした映像と元の映像をJavie上で合成します。


こんな感じのものができあがります。実写映像は http://www.nicovideo.jp/watch/sm15066519 の 2:47 付近から使用させていただきました。


レンズ補正

実写映像の場合、(特に広角で撮影した場合には)映像が歪曲して映ってしまいます。精度の高いトラッキングを行うために、まずはこの歪みを補正します。左の画像が歪みのある状態、その歪みを補正したものが右の画像です。画像下部に映っている水路が、左はかなり曲がっていますが右はほぼ直線になっています。

f:id:butyricacid:20110831214557j:image:h150 f:id:butyricacid:20110831214556j:image:h150

Javieでこの処理を行うには「レンズ補正」エフェクトを使用します*1。「レンズディストーションを反転」をオンにし「量」を調整します。

f:id:butyricacid:20110831220507p:image


本来ならこちらに書かれているように、方眼紙などを撮影してレンズ補正の量の適正な値を調べるべきですが、今回は自分で撮影した映像ではないので見た目で適当に補正しました。


シャープ化、高コントラスト化

トラッキングを行う映像は、シャープ化と高コントラスト化をすることでより多くの特徴点を拾うことができるようになります。シャープ化には「シャープ」または「アンシャープマスク」エフェクトを、高コントラスト化には「輝度&コントラスト」エフェクトを使用します。

f:id:butyricacid:20110831214559p:image:h150 f:id:butyricacid:20110831214600p:image:h150


Voodoo Camera Tracker でトラッキング

Voodoo Camera Tracker でのトラッキング手順は前回と同じですが、ひとつ補足しておきます。

焦点距離がわからない場合は正しい焦点距離を推測するために何度もトラッキングしてみる必要があります。

と前回書きました。では、そのトラッキングは具体的にどのように試行すればよいのかということがわかりにくかったかと思います。

試行を繰り返す際、焦点距離の値をどれくらいずつ変化させたらよいのかというのがわかりにくいですが、焦点距離は視野角から計算できるということを思い出してください*2。視野角であれば、例えば最初は5°単位で変化させて試行し、トラッキング結果が良くなってきたら1°ずつ変えて試行する、という具合にできるでしょう。

今回の動画では 30→20→25→30→35→32→33→32.5 と視野角を変化させて(焦点距離を計算し)試行を繰り返しました。


Voodoo Camera Tracker 上で四角形を作る

前回はMMDステージのスクリーンに四角形を合わせましたが、今回はスクリーンに相当するような物体は映っていないので、地面の適当な位置に四角形を合わせます。

f:id:butyricacid:20110901100945p:image:h150


カメラデータをJavieで読み込む

前回、カメラデータをJavieで読み込む手順の中で次のように書きました。

次に、ヌルオブジェクトを作成します。ヌルオブジェクトを3Dレイヤー化し、位置を 0.0, 0.0, 0.0 にしてください。アンカーポイントに先ほどの四角形の位置を100倍した値を入力します。四角形の回転角を全て正負逆にして回転に入力します。このヌルオブジェクトをカメラレイヤーの親にします。

f:id:butyricacid:20110621222253j:image:h150

このヌルオブジェクトの設定を行うことで、四角形に対して(今回の場合ならMMDステージのスクリーンに対して)コンポジションの座標軸が正対し、3Dレイヤーは初期状態でスクリーンに対して並行になります。このヌルオブジェクトの設定を行わないと座標軸が傾いたままとなるため、3Dレイヤーの配置が難しくなります。

しかし、実はこれだけだと座標軸が±90°あるいは180°回転している場合があります。前回のようにJavie上での作業だけであればこれはさほど問題ではありませんが、VMDを書き出してMMDに読み込ませる場合は地面の向きが上下逆になったり横向きになったりしてしまい、そのままでは使い物になりません。そこで、次のようにして座標軸を完全に一致させます。

まず、一旦VMDを書き出して(書き出し方は次の項目で説明しています)MMDに読み込ませてみます。地面の向きがおかしい場合、Javieに戻ってヌルオブジェクトの「方向」プロパティを設定します。

f:id:butyricacid:20110901213328p:image:h150

設定すべき値は 0, 90, 180, 270 の組み合わせで、例えば (90, 0, 0) かもしれないし (270, 0, 180) かもしれません。3Dに慣れた人なら、正しくない地面の向きから方向プロパティに設定すべき値の組がすぐにわかるかもしれませんが、そうでない場合は適当に設定してみてください。方向プロパティを設定したら再びVMDを書き出してMMDに読み込ませ、地面の向きを確認します。


JavieからVMD形式で書き出す

メニューから「File→書き出し→MMDカメラデータ(.vmdファイル)」と選択してください。このメニュー項目は、タイムラインパネルがアクティブになっていないと選択できないので注意してください。

f:id:butyricacid:20110901104721p:image:h150

Javieの座標系とMMDの座標系はスケールがずいぶん異なるので、「スケール」には2%とか5%くらいの値を入れると良いと思います。なお、スケールは「小さな値を入れるほどMMD上でモデルの表示が大きく」なります。

「位置の基準」は、Javie上のどの点をMMD上での原点にするかの指定です。xとzの値はある程度適当でもMMD上でモデルの位置を動かせばよいのですが、yの値は正確に合わせないとMMDの地面と実写映像の地面が合わなくなるので注意してください。

VMDファイル上で視野角の値は整数値しか取ることができないため、VMDに書き出す際には四捨五入/切り捨て/切り上げのどれかを行うことになります。「視野角の丸め」はその指定です。丸め方法が不適切だと視野角の値が不規則に+1または-1変化してしまい、MMD上で再生すると画面がぶるぶると揺れた映像になることがあります。


VMDファイルをMMDで読み込む

これは特に問題ないでしょう。VMDファイルを読み込み、MMD上での作業を終えたらAVIに書き出してください。


MMDから書き出したAVIと元の映像をJavie上で合成する

これも普通に重ねるだけですので大きな問題はないかと思いますが、いくつか注意事項があります。MMDから書き出したAVIファイルをJavieのプロジェクトパネルに読み込んだら、右クリックして「メディアオプション」を選択してください。そして「乗算済みアルファ」を選択し、カラーマットの色をMMDの背景色と同じ色にします。*3

f:id:butyricacid:20110901105328p:image:h150


合成には「レンズ補正した」実写映像を使用してください。補正前のオリジナル映像に合成してしまうと、歪みが大きい部分ではMMDの映像と合わなくなってしまいます。


まとめ

なんかもうめんどくさくなってきたwので一番大事なことだけ書きます。

  焦点距離超重要

正確な焦点距離を推測できていれば Voodoo Camera Tracker のトラッキングはかなりの精度が出ます。これがうまくできてないと他のことは何をやっても無駄です。正確な焦点距離を推測するために何度も試行するのは面倒ですが頑張りましょう。

*1:AEのレンズ補正エフェクトと大体同じですが、パラメーターがいくつか異なります。

*2:計算式は前回の記事をご覧ください。

*3MMDから書き出したAVIって、乗算済みアルファで書き出されてますよね?

2011-07-19

AEのカメラをMMDのVMDファイルに書き出すスクリプト

http://kuramo.ch/AE2MMD/

同様のものを作ってる方が他にもいらっしゃるのですが、そちらはまだ回転が未対応のようなので、JavieのVMD書き出しのコードを元にして適当に作ってみました。

使い方は、スクリプト内の冒頭に書いてあるコメント文を読んでください。あと、あまりテストしてないのでうまく動かない場合があるかも。


動作報告など一言いただけると嬉しいです。

2011-06-21

Voodoo Camera Tracker + Javie + MMD でお手軽マッチムーブ 前編

はじめに

Javie 0.5.5 に Voodoo Camera Tracker のカメラデータを読み込む機能とJavieのカメラデータをVMDで書き出す機能を付けたので、こんなことができるようになりました。



これらはアイマス素材のカメラの動きをトラッキングし、テキストやMMDモデルなどを合成したものですが、実写素材でも同様のことができます。というかマッチムーブは普通、実写素材に対して行うものですね。マッチムーブと言えばニコニコ動画では「厳島神社の人」が有名ですが、あの方がやってることの超劣化版ということになるでしょうか。

そんなわけで、今回から2回にわけて「Voodoo Camera Tracker + Javie + MMD でお手軽マッチムーブ」という記事を書いていきます。今回は、Voodoo Camera Tracker の使い方(というか練習)と Voodoo Camera Tracker から書き出したカメラデータを Javie で読み込むところまで解説します。

ちなみに、僕はマッチムーブについては素人で、見よう見まねで適当にやってます。間違ったことを書いてたら指摘していただけるとありがたいです。あと、照明を合わせたりとかグレインマッチングとかその辺のことについては触れません。「お手軽マッチムーブ」という趣旨なので、その辺はご容赦ください。


Voodoo Camera Tracker について

Voodoo Camera Tracker は無料で利用できる*1マッチムーブソフトです。次の場所からダウンロードできます。

http://www.digilab.uni-hannover.de/download.html


基本的な使い方は次の記事がわかりやすかったので、これらも参考にしてください。

CGcompo Voodoo で始める!初めてのマッチムーブ

CGcompo マッチムーブのクオリティをアップさせよう!

no title


なお、Voodoo Camera Tracker に期待し過ぎないでください。焦点距離が変化している(ズームを使用している)素材は正確にトラッキングできません。ズームを固定していても、その焦点距離がわからない場合は正しい焦点距離を推測するために何度もトラッキングしてみる必要があります*2。また、Voodoo Camera Tracker は一度に処理できるフレーム数が200〜400程度*3ですので、長いシーンをトラッキングするのも簡単ではありません。


練習用の素材を作成する

練習用の素材をMMDで作ります。ビデオカメラを持っている人はそのカメラで撮影した素材を使ってもいいのですが、焦点距離を調べたりするのが面倒だと思うので、最初はMMDで練習用の素材を作るのが良いでしょう。MMDで作った素材なら視野角から簡単に焦点距離を計算できます。

練習用の素材を作る手順は次のとおりです。

  • MMDで付属のステージを読み込みます。モデルは読み込みません。
  • 視野角は初期値の45°のままにし、適当にカメラワークを付けます。
    • カメラの初期位置と回転角を適当に弄っておきます。カメラの初期状態がステージに対して完全に正対していると後の作業が楽なのですが、実際にマッチムーブを行う素材がそのような状態で撮影されていることはまず無いと思いますので、練習でもカメラの初期状態を弄っておきます。
    • 練習用としては、最終フレームのカメラが最初のフレームのカメラに一致するように、つまりループ素材になるように作るのが良いです。そのように作ることで、Voodoo Camera Trackerでのトラッキングが正確に出来ていればトラッキングしたカメラの軌道も最初の位置に正確に戻ってきますし、トラッキングが不正確な場合はズレてしまうのですぐにわかります。
  • フレーム数は200程度にしておきます。
  • 出力サイズは512x384にしてください。
    • どんなサイズでもいいのですが、出力サイズが異なると後で計算する焦点距離の値も変わってきますので、練習ではこのサイズで出力しておいてください。

動画を連番TGAまたは連番PNGに変換できるソフトを入手し、練習用に作った素材を連番ファイルにします。Javieでも連番PNGの書き出しはできますが、かなり遅いです。他のソフトを使用することをお勧めします。僕はTMPGEnc無料版で連番TGAにしました。Voodoo Camera Tracker は連番TGAしか読めないと説明している記事が多いですが、連番PNGも読めます。少し前のバージョンまでは連番TGAのみだったようです。

Voodoo Camera Tracker はファイル名などに日本語が含まれているとダメらしいので、ファイル名と保存場所までの全てのフォルダ名を英数のみにしておいてください。


トラッキングの練習

Voodoo Camera Tracker を起動し、メニューから File -> Open -> Sequence を選びます。出てきたダイアログのBrowseボタンを押して、先ほど書き出した連番ファイルのどれか1つを選択します。Move Type を free move にします。OKボタンを押すと、連番ファイルが読み込まれウインドウ内に表示されます。

f:id:butyricacid:20110621122325j:image:h150 f:id:butyricacid:20110621122326j:image:h150 f:id:butyricacid:20110621122327j:image:h150


メニューから View -> Controls を選びます。出てきたダイアログの左下の方に、FreeMove という項目があります。これを選択すると右側の内容が FreeMove のものに切り替わります。右端にある Focal Length を User Fixed に変更します。

f:id:butyricacid:20110621122321j:image:h150 f:id:butyricacid:20110621122322j:image:h150


メニューから File -> Open -> Initial Camera を選びます。出てきたダイアログ内の Film Back の値を 5.12 と 3.84(素材のサイズの1/100)にします。素材の縦横比と同じであれば何でも構いませんが*4焦点距離の計算にも使いますので、練習ではこの値を入力してください。

f:id:butyricacid:20110621122323j:image:h150 f:id:butyricacid:20110621122324j:image:h150

焦点距離を計算し、Focal Length の欄に入力します。焦点距離の計算は次の式を用います。

焦点距離 = (Film Backの右側に入れた値) / (2 * tan((視野角/2) * (PI/180)))

Film Backの右側に入れた値=3.84, 視野角=45 なので、

焦点距離 = 3.84 / (2 * tan((45/2) * (PI/180))) = 4.63529004

となります。この計算には関数電卓などが必要ですが、グーグルの検索欄に入力すれば計算してくれます。


Initial Camera の設定を終えたらトラッキングを開始します。ウインドウ右下にあるTrackボタンを押してください。終わるまでしばらくかかるので待ちましょう。

f:id:butyricacid:20110621123618j:image:h150 トラッキング中の様子


トラッキングが終わったら、メニューから View -> 3D Scene Viewer を選びます。検出されたカメラの軌道が3D空間に表示されるので、カメラが滑らかに移動し最終フレームで最初の位置に戻ってきていることを確認します(前述したように、素材をそのように作ってある場合)。トラッキングが不正確だと、カメラの軌道がガタガタになったり最終フレームで元に戻ってこなかったりするので、明らかに失敗している場合はこの段階ですぐにわかります。

f:id:butyricacid:20110621151600j:image:h150,left f:id:butyricacid:20110621151601j:image:h150,left
Viewerの画面上でマウスをドラッグして視点を移動したり回転したりできます。"U", "I", "O", "P" の各キーを押すと移動や回転の仕方が変わります。また、右クリックと左クリックでも移動や回転の仕方が異なります。

しかし、正確にトラッキングできているかどうかはまだわかりません。次はその確認のための作業です。メニューから View -> Modeling Tools を選ぶと、ウインドウ左側にボタンが幾つも現れます。四角いアイコンのボタンを押すとトラッキングした3D空間内に四角形が追加されるので、それをMMDステージのスクリーンに合わせます。移動、回転、拡大縮小の各ツールを駆使して合わせてください。3D Scene Viewer 上でも四角形を操作できます。四角形をスクリーンに合わせたら、同様に床にも四角形を合わせます。

f:id:butyricacid:20110621151559j:image:h150 f:id:butyricacid:20110621151602j:image:h150

f:id:butyricacid:20110621151603j:image:h150 スクリーンと床に四角形を合わせた

f:id:butyricacid:20110621151604j:image:h150 そのときの 3D Scene Viewer

スクリーンと床に四角形を合わせたら、再生してみます。再生中、四角形がスクリーンや床にきちんと張り付いたままであれば正確にトラッキングできています。トラッキングが不正確だと徐々にずれていってしまいます。完全に一致させるのはなかなか難しいので、ある程度の妥協は必要です。


トラッキングしたカメラデータの書き出し

正確にトラッキングできていることを確認したら、カメラデータをファイルに書き出します。メニューから File -> Save -> Textfile を選んでください。

f:id:butyricacid:20110621152838j:image:h150


四角形の位置と回転角を得る

スクリーンに貼付けた方の四角形は、その位置と回転角が後の作業で必要になります(床の方は不要です)。位置と回転角は次の手順で表示することができます。

  • ウインドウ左の矢印アイコンのボタンを押します
  • 四角形の四隅の点どれかにマウスを合わせて右クリックするとダイアログが表示されます

f:id:butyricacid:20110621214551j:image:h150 f:id:butyricacid:20110621214552j:image:h150

Voodoo Camera Tracker での作業はこれで終わりです。


Voodoo Camera Tracker から書き出したカメラデータをJavieで読み込む

Javieを起動し、メニューから File -> 読み込み -> Voodoo Camera Trackerカメラデータ(Textfile) を選んでください。ファイルを選択した後に表示されるダイアログ内で、フレームレートを練習用素材と同じにしてください。その他の設定は初期値のままで構いません。

f:id:butyricacid:20110621214553j:image:h150 f:id:butyricacid:20110621214554j:image:h150

Finishボタンを押すとコンポジションが作成されます。そのコンポジションにはカメラレイヤーひとつだけが含まれ、トラッキングしたカメラデータの通りにキーフレームが設定されています。

f:id:butyricacid:20110621222254j:image:h150


次に、ヌルオブジェクトを作成します。ヌルオブジェクトを3Dレイヤー化し、位置を 0.0, 0.0, 0.0 にしてください。アンカーポイントに先ほどの四角形の位置を100倍した値を入力します*5。四角形の回転角を全て正負逆にして回転に入力します。このヌルオブジェクトをカメラレイヤーの親にします。

f:id:butyricacid:20110621222253j:image:h150

このヌルオブジェクトの設定を行うことで、四角形に対して(今回の場合ならMMDステージのスクリーンに対して)コンポジションの座標軸が正対し、3Dレイヤーは初期状態でスクリーンに対して並行になります。このヌルオブジェクトの設定を行わないと座標軸が傾いたままとなるため、3Dレイヤーの配置が難しくなります。


これでカメラデータの読み込みは完了です。


練習用の素材とともにテキストや平面を配置してみる

練習用の素材をプロジェクトに読み込み、コンポジションに入れます。そして、テキストや平面を作成し、適当に移動、回転して配置します。再生してみて、MMDのステージ内に存在しているように見えれば成功です!

f:id:butyricacid:20110621231430j:image:h274


次回

次回は、JavieからカメラデータをVMD形式で書き出してMMDに読み込ませます。MMDで作った動画をトラッキングして、そのカメラデータをまたMMDに持っていっても面白くないというか無意味なので、どうしましょうかね。ケータイのカメラだとあまり精度よくトラッキングできないんですよね。


追記:後編書きました

http://d.hatena.ne.jp/butyricacid/20110901/1314883171

*1:商用利用は不可のようです

*2焦点距離を自動判定する機能もありますが、かなり誤差があります。冒頭の動画は焦点距離を手入力し、その値を少しずつ変えて5回くらい試行しました。

*3:僕が試した限り、400フレームでも頻繁にクラッシュしました。

*4:実写素材の場合はカメラの撮像素子のサイズを入力します。

*5Voodoo Camera Tracker の Initial Camera で、素材のサイズの1/100の値を Film Back に設定したため、ここで100倍する必要があります