私は個人的にでデフォーカス系はAfterEffectsでもNukeでもFrischluft Lenscareがお気に入りなのですが、NukeでLenscareを使う際に「FL Depth Of Field」で時折相談されるトラブルがあるのでメモ程度に残しておきます。
問題になるのはDepthの設定です。Lenscareには「FL Out Of Focus」と「FL Depth Of Field」という二つのプラグインがあり、「FL Depth Of Field」ではDepthマップによるフォーカスの調整が可能です。DepthマップはRLAフォーマットやOpenEXRで使用可能な被写界深度用のチャンネルです。Nukeの場合はNukeの3Dコンポジットから生成することも可能ですし、グラデーションで作成してしまうことも可能ですが、今回はOpenEXRのDepthを用いることを前提にします。
今回はTheFoundryから入手できるチュートリアルの「NUKE General UI | The Viewer -Viewer Basics」のものを例にしています。(このチュートリアルの内容はあまり関係ありません)
実はこのOpenEXRファイルは、BoundingBoxが設定されていてクロップされています。つまりフォーマット内のデータが存在しない部分を取り除いてメモリを効率的に使用できるようになっています。BoundingBoxはNukeでも設定できますし、ソフトウェアによってはレンダリング時に自動で設定してくれるものもあります。NukeでのBoundingBoxについては「NUKE Workflows | Bounding box」を参照)
「FL Depth Of Field」のノードのDepth Bufferに「Shuffle」ノードで抽出したdepthを接続している状態です。この状態でも一見機能してみえますが、ViewPane上のfocal pointを移動してみると正しくフォーカスがあわないことがわかります。
これは「FL Depth Of Field」がViewPane上の座標を、先のBoundingBoxの座標に変換してしまっているために、実際のViewPane上に表示されている画像と「FL Depth Of Field」がDepthBufferとして取得しているピクセルにズレが生じているためです。
「FL Depth Of Field」の出力をDepth Bufferにしてもこのズレは確認できません。擬似的に合成してみるとこんな感じで取得しているピクセルの値がずれています。
そこで、BoundingBoxを画像のサイズにあわせるためのノードが必要になります。一番手っ取り早いのはCropノードかReformatノード。これでBoundingBoxを画像のサイズに一致させてやれば、ViewPane上のfocal pointを使って正しくDepth Bufferのピクセルを取得できるようになります。
同様のトラブルはAfterEffectsでも起こりえるのですが、AfterEffectsだとそもそもBoundingBoxってあったかな、あったとしてもPhotoshop形式みたいにフッテージごとクロップされそうだなぁ...と思いつつ検証していません。
Frischluft Lenscare http://www.frischluft.com/lenscare/
[関連記事]
NukeのLenscareの話 (2)
レンズボケについて
Peregrine Labs Bokeh