>   >  NUKE プラクティカル・ガイド:Vol.5:3D トラッキングとカメラプロジェクションを用いたクリーンアップ
Vol.5:3D トラッキングとカメラプロジェクションを用いたクリーンアップ

Vol.5:3D トラッキングとカメラプロジェクションを用いたクリーンアップ

STEP 2:空舞台の作成〜カメラプロジェクション+Expression

ここまでくれば、あともう一息。最初の説明でも述べたように、横切る人物で隠れた部分を別のフレームから補っていく。そのためにはまず、別フレームの画から現在のフレームの画に合ったパースを得るため、カメラプロジェクションを用いる。

CameraTracker でトラッキングしたものと同じノード(歪み補正をかけたモノ)を用いて、それに [Project3D] ノードを繋ぐ。また、[Project3D] ノードは [Camera] ノードをコネクトするパイプを持っているので、そこに、CameraTracker から生成されたカメラを複製し繋ぐ。さらにプリミティブのジオメトリノードである Sphere ノードにマッピング画像として繋ごう。

Expression

詳しくは後述するが、カメラを複製した理由は、現在のフレームとは異なるフレームから投影するためである

ここで Expression を利用して、映っている人物が、自身の幅を横切る時間(フレーム)の分だけ、ずらして投影することにする。実は CameraTracker ノードによって生成された Camera は、「link output」 にチェックが入っていれば、既に Expression が付いている。

Expression Expression Expression

CameraTracker によって生成された Camera ノードには、解析結果から算出された値による Expression が既に張られている。NodeGraph 上に表示される緑色のコネクトと矢印は Expression でリンクが張られていることを意味する

例えば、今回の Camera ノードの translate には

CameraTracker4.camTranslate

という記述が付いている。ここに"(300)"という記述を追加して

CameraTracker4.camTranslate(300)

とすると、このカメラの位置は300フレームの位置で静止し続ける。
さらに、"(frame)"を追加し

CameraTracker4.camTranslate(frame)

とすると、frame は現在フレームを意味し、"(frame)"を追加してないのと同じ結果になる。そして、さらに......

CameraTracker4.camTranslate(frame + 20)

とすると、現在のフレームの20フレーム先と同じ位置になる。要するに、アニメーションを20フレーム後ろにシフトさせたのと同じになるわけだ。

ここで、20フレーム先の画を、そのカメラアングルから Sphere に投影し、現在のフレームのカメラアングルから見る(撮影する)と、最初に説明したように、現在のフレームで人物によって隠れてしまった背景を得ることができる。
その理屈をノードで表現すると、まず、20フレーム先の画を前にずらすことになる。実際には、[Project3D] ノードとその親ノードとの間に [TimeOffset] ノードを繋ぎ、その TimeOffset ノードのプロパティにある 「time offset(frames)」 の値に ー20(=イン点を前に20ずらす)を入力。次に、この TimeOffset ノードの「time offset(frames)」値を Camera ノードに関連付ける。

動画プレートのイン点を "ー20" するということは、Camera ノードからすると 20 フレーム先(+20)の動きになるので......

CameraTracker4.camTranslate(frame - TimeOffset3.time_offset)

となる。

Expressionを利用しノードを組む

現在のフレームからずらした分だけ、ずれたアングルから投影できるよう、Expression を利用してノードを組む。こうしておけば、TimeOffest ノードの数値さえ手直しすれば、自動的に投影アングルを調整してくれる

ちなみに Expression での表記方法が分からない場合は、適当なノードのプロパティに、表記の知りたいプロパティから [Ctrl] キーを押しながらドラッグ&ドロップすると Expression を貼ることができるので便利だ(下)。また、その上で子のノードのプロパティの Expression 表記を見れば、表記方法が確認できる仕様となっている。

Expressionを利用しノードを組む

あとは、この Sphere ノードを撮影するため [ScanlineRender] ノードを作成。[obj/scn] にこの Sphere ノードを繋ぎ、[cam] に CameraTracker から生成された Camera ノードを繋ぐ。[Difference] ノード(Merge)で元の動画プレートとの差分を取って確認してみてもよい。

元の画とパース確認 元の画とパース確認

元の画のパースと合っているかを確認するため Difference ノード(Merge)で合わせてみると、ほぼ合っていることが確認できた。この後は、色合いと微調整を行なっていく

差分を確認してみたところ、少しズレがあることが判った。
トラッキングの精度も疑わしいが、今回の場合はカメラ側で生じた ローリングシャッター現象 による歪みのせいだろう。

この歪みを取り除く(緩和する)プラグイン(上にリンクさせた「RollingShutter」など)もあるが、今回は取り除くというより、[GridWrap] ノードを使って、元の動画プレートに合わせることにする。
ローリングシャッターの歪みは、CMOS センサが上から下に記録するより、画面の動きが早い場合に生じる。要するに、一番上と一番下に記録された画のタイミングが、微妙にずれているからで生じるのだ。速いパンでは、画面の下へ行くに従い、画の流れと同じ方向に画が歪み、平行四辺形のように変形する。詳しい説明は割愛するが、GridWrap ノードを用いて根気よく合わせていこう。

GridWrapノードで合わせる1 GridWrapノードで合わせる2 GridWrapノードで合わせる3

GridWrap ノードを使い、根気よくローリングシャッターの歪みを合わせていく

また、人物がフレームインする時は、空舞台はそれよりも前のフレームで作成するが(イン点を前にずらす)、人物がフレームアウトする時は、空舞台をそれよりも後の画(イン点を後ろにずらす)で作成しなければ、上手い具合に人物の居ない画を作り出すことができない。
したがい、画面を中央で左右に2つに分け、向かって左側(フレームイン側)と右側(フレームアウト側)で画を繋ぎ合わせた。最終的に、[Grade] ノード等で色を調整し、確認しながら元の動画プレートの上から人物部分をマスクして乗せる。

GridWrapノードで合わせる4

上手と下手で「ずらす」フレーム数を変更して常に人物の背後の画を作り出せるように調整した

人物を乗せるためのマスクの境界は色が馴染まないので、最後は根気よく Grade ノードで色を合わせていく。

GridWrapノードで合わせる5 GridWrapノードで合わせる6

色合わせの際は、合わせている Merge ノード(over)のマスクをいったんオフにして、[operation]を 「over」 から 「divide」(割り算)へと変更。境界領域でピッカーを使い色を広めに拾い、Viewer 下部の 「2D image information] で確認する。割り算なので 1 であれば同じ色ということだ。なので、極力 1 に近づくよう Grade ノードの 「gain」 をキーフレームに打ちながら調整する

最後は急ぎ足での解説になってしまったが、要するに 「根気よく丁寧にやる」 だけだ。


クリーンアップを済ませた完成形

その他の連載