STEP 2:空舞台の作成〜カメラプロジェクション+Expression
ここまでくれば、あともう一息。最初の説明でも述べたように、横切る人物で隠れた部分を別のフレームから補っていく。そのためにはまず、別フレームの画から現在のフレームの画に合ったパースを得るため、カメラプロジェクションを用いる。
CameraTracker でトラッキングしたものと同じノード(歪み補正をかけたモノ)を用いて、それに [Project3D] ノードを繋ぐ。また、[Project3D] ノードは [Camera] ノードをコネクトするパイプを持っているので、そこに、CameraTracker から生成されたカメラを複製し繋ぐ。さらにプリミティブのジオメトリノードである Sphere ノードにマッピング画像として繋ごう。

詳しくは後述するが、カメラを複製した理由は、現在のフレームとは異なるフレームから投影するためである
ここで Expression を利用して、映っている人物が、自身の幅を横切る時間(フレーム)の分だけ、ずらして投影することにする。実は CameraTracker ノードによって生成された Camera は、「link output」 にチェックが入っていれば、既に 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 を利用してノードを組む。こうしておけば、TimeOffest ノードの数値さえ手直しすれば、自動的に投影アングルを調整してくれる
ちなみに Expression での表記方法が分からない場合は、適当なノードのプロパティに、表記の知りたいプロパティから [Ctrl] キーを押しながらドラッグ&ドロップすると Expression を貼ることができるので便利だ(下)。また、その上で子のノードのプロパティの Expression 表記を見れば、表記方法が確認できる仕様となっている。

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


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



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

上手と下手で「ずらす」フレーム数を変更して常に人物の背後の画を作り出せるように調整した
人物を乗せるためのマスクの境界は色が馴染まないので、最後は根気よく Grade ノードで色を合わせていく。


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