10分で分かるNUKE*4 (ブラー&デフォーカス編)
- 2024/05/26
初心者向けNuke入門。Nuke14あたり。キーボードショートカットはWindowsで記載。
前回からの続きです。今回は、ブラーとデフォーカスをテーマにして解説していきます。

内容:
Blurノード / Defocusノード / Convolveノード / ZDefocusノード / Bokehノード / DirectionalBlur(by Tony Lyons) / iBlur(by Moritz Eiche) / iConvolve(by Adrian Pueyo) / PxF_IDefocus, PxF_ZDefocus("Pixelfudger" by Xavier Bourque)
Blurノードは、Nukeで画像をぼかすときの最も基本となるノードです。

リアルなボケは表現できませんが、わずかに画像をぼかしたいときや、マスクをぼかすときなど、よく活躍します。

Blurノードはブラーの量を垂直、水平を別々に調整できるため、縦方向のブラー、横方向のブラーはつくれます。しかし斜め方向のブラーは、そのままでは不可能です。斜め方向のブラーを適用したいときは、DirectionalBlur(=方向性ブラー)というツールが便利です。Trixterのコンポジターのトニー・ライオンズ(Tony Lyons)が公開しています。残念ながらNukeの標準機能のDirBlurノードは良くないのです。
DirectionalBlurのデモビデオ
https://www.youtube.com/watch?v=BrioyN9YMA8
DirectionalBlurは、トニー・ライオンズがまとめあげて配布している"Nuke Survival Toolkit"というNukeツールのパッケージの中に含まれています。VFX会社で実際に使われている、コンポジターなら道具箱に入れておくべきツールを数百個まとめたそうです。Nuke Survival Toolkitは、Githubからダウンロードできます。
https://github.com/CreativeLyons/NukeSurvivalToolkit_publicRelease/releases/
Nuke Survival Toolkitの紹介動画
https://www.youtube.com/watch?v=c8Jw-Iw2u4g
Defocusノードは、レンズのようなボケをつくります。

Blurノードの結果とは明らかに異なり、玉ボケの表現が可能です。

ところで、ブラーやデフォーカス系のノードでNukeの「maskインプット」を使用することは、基本的にオススメしません。

maskインプットでは、「ノード適用前の画像」と「ノード適用後の画像」という2つの画像をブレンドするだけです。やっていることはKeymixノードと同じです。つまり、maskインプットでは中間の量のブラー、というのは期待できません。

iBlurは、コンポジターのモーリッツ・アイヒェ(Moritz Eiche)による有名なツールです。2015年のテラオカマサヒロ氏によるCGWORLDの連載、NUKE プラクティカル・ガイド Vol. 9:secret for Gizmo(その2)でも紹介されていました。

alphaチャンネルの濃度によって、徐々にボケていくようにできます。前述のmaskインプットではできなかった表現です。

それにしても、いったいどうやったらこんな効果が可能になるのでしょう?Groupノードの中を見てみれば分かります。ボケ加減の違う画像をたくさん生成し、段階的にブレンドすることで実現しています。
iBlurは、Nukepediaからダウンロードすることも可能ですが、前述のNuke Survival Toolkitにも含まれています。
Nukeの標準のCovolveノードは、Defocusノードよりもさらにリアルなボケを表現できるノードです。ちょっとクセがあるのと、他の方法もあるので、実際にはそれほど使われないノードかもしれません。しかし、この後の説明の前提知識として、ここで説明しておきたいと思います。Covolveノードは、filterインプットにボケの形状用の画像を入力して使います。

これにより、実際のカメラで撮影したときのように、絞りの形でボケます。Defocusノードでは正円でボケますが、Convolveノードでは多角形など自由な形でボケをつくれるので、Convolveノードの方がよりリアルな表現が可能であると言えます。

デフォルトでは[filter channel]ノブが "rgba.alpha" になっていますが、その横にある"use input channels"のチェックを入れるとその設定は無視され、RGBカラーがデフォーカス効果に影響を与えるようになります。filterインプットに入力した画像のr, g, b各チャンネルが、r, g, b各チャンネルのデフォーカス効果に利用される仕組みになります。
これにより各チャンネルでボケの量が異なるという「軸上色収差」に似た表現が可能になります。色収差については、[別記事:VFXと色収差] で説明しました。また、この後の説明で登場するカメラ用語なども説明していますので、よろしければぜひご一読ください。
iConvolveは、VFXスーパーバイザーのエイドリアン・プエヨ(Adrian Pueyo)によるツールです。iBlurのConvolveバージョンです。グラデーションを持つalphaを入力し、徐々にボケていくようにできます。
2分で"iConvolve"を理解する(VFXforFilmmakers.comチャンネル)
https://www.youtube.com/watch?v=0jdlkQ9Fl2g
iConvolveも、Nuke Survival Toolkitに含まれています。
ZDefocusノードはNukeの標準のノードで、奥行きに応じてデフォーカス量を変えられるノードです。Defocusノードの発展版です。

通常、ZDefocusノードはCGレンダリング画像に対して使います。たとえば、このようなCGレンダリング画像があるとします。

Zデプスのデータがこちらです。3次元空間の次元軸を表すX, Y, Zのうち、Z軸は一般的に奥行きを表すことが多く、奥行きの情報が保存されたデータは "Zデプス" と呼ばれています。

そして、これがZDefocusノードの効果です。距離に応じて、ボケ具合の違う表現が可能です。

簡単に使い方を説明します。[depth channel]ノブで適切なチャンネルを選びます。ここでは"depth.Z"チャンネルを選びます(ちなみにもしデプスデータがRGBA画像とは別の画像ファイルとして書き出されていたら、ShuffleノードやCopyノードでチャンネルを移し替える必要があるということになります)。

[math]ノブは、デプスデータの形式をNukeに教えてあげるためのドロップダウンです。どうしてこんなにたくさんの設定が選べるようになっているのでしょうか?これには、画像処理の歴史的な経緯があります。

現在はOpenEXR画像ファイルに浮動小数(float)のデータを保存できるので、数値の上限・下限はありません。しかし昔はデジタル画像を8bitや16bitの整数(integer)で保存するのが普通であり、たとえば8bitで言うと下限は0、上限は255と決まっていました。そのためデプスデータは「0~1」の範囲に収める必要がありました(0~1というのは、0~255の8bitで言うと255で割ることで正規化=Normalizeした数値で、これは255を掛けることで元に戻ります)。そこでCGソフトは「Z=1/カメラからの距離」という計算を行い、カメラからの距離が1なら1、10なら0.1、100なら0.01…というふうにして、0~1の範囲にして、つまりある種のデータ圧縮のような計算を行ってから画像データを保存しました。これが "far=0" の形式であり、NukeのScanlineRenderノードやCGレンダラーのRenderManのデフォルトなどがこれにあたります。CGソフトやレンダラーによってさまざまな方式があるため、Nukeは項目をたくさん用意しているわけです。今回、ここで説明に使うデプスデータはカメラの場所を原点として、遠くほど値が大きくなり、上限は決まっていないという形式にしたいと思います。つまり、今回は[math]ノブを "depth" に設定すると良いことになります。
なお、さまざまな方式のデプスデータは、わりとシンプルな計算によって相互に変換可能です。ShizlogチャンネルさんのYoutube動画では、Expressionノードで変換する方法が紹介されています。
[Nuke tips 11] Nukeがdepthをどう書き出してるかのはなし
https://www.youtube.com/watch?v=WzM91G4jt3Q
さて、ZDefocusノードでは、「ピントを合わせる部分」を決める必要があります。ビューア画面上に出てくる "focal_point"という点を動かすことで指定できて、便利です。

ビューア画面上で "focal_point" を動かすと、自動的に [focus plane] と [focal point] の x, y のノブの数値が変わっていきます。項目が2つあって少しややこしいですが、最終的にピントを決定するのは [focus plane]ノブの値です。[focal point] は、[focus plane] を設定するために一時的に利用される値にすぎません。

[output]ノブを "result"(=結果) から "layer setup"(=レイヤー設定)" または "focal plane setup" (=焦点面設定)という出力モードに切り替えます。これらはピントを合わせる範囲の確認用の画面です。

2つのモードは同じようなもので「赤」「緑」「青」で表示しますが、"layer setup" はレイヤーに分割したときの状態を加味して表示します。ここで言うレイヤー(=層)というのは、ZDefocusノードもやはりiBlurと同じように、内部的にはボケ具合の違う画像をいっぱいつくって、ダブらせて画像をつくっているんですが、その画像のことです。
ピントの合う範囲が「緑」、それよりも手前が「赤」、奥が「青」で表示されます。手前からR, G, Bで分かりやすいですね。

[depth of field]ノブは、日本語で言うと被写界深度(ひしゃかいしんど)です。被写界深度というのはピントが合う範囲の広さのことで、撮影用語では被写界深度が「深い」とか「浅い」と言ったりします。[depth of field]ノブの値を大きくすると画面に「緑」のエリアが出てきます。

なお、[depth of field]ノブの隣に "blur inside" というチェックボックスがあります。これはピントの合っているエリアにもわずかなブラーを追加する設定ですが、多くの場合好ましくないのでチェックを外して内側をぼかさないようにします。
ピントをきちんと合わせたい場所が「緑」になるように [depth of field] を設定したら、[output] は "result" に戻してください。
では、[size]ノブの値を上げ下げして、ボケの大きさを決定します。ここには[maximum]ノブがあります。[maximum](=最大値)では、ボケの大きさの上限を設定し、[size] を大きく調整してもある量以上にはボケないようにすることができます。

図にすると、各項目はこのような役割になっています(※この図は以前海外サイトで見かけたものを参考に描き起こしました)。

さて、ZDefocusノードには、Convolveノードの機能もあります。[filter type]ノブで、ボケの形状を設定できます。デフォルトの "disc" は正円の形でボケますが、"bladed" に変更すると多角形にできます。また、"image" に変更すると、Convolveノードのようにfilterインプットに入力した画像の形でボケるようになります。Convolveノードと同じく、通常 "use input channels" のチェックを入れて使います。このあたりは、ShizlogチャンネルさんのYoutube動画が分かりやすいので、ぜひご覧ください。
[Nuke tips 10] ZDefocusでリアルなボケを再現!
https://www.youtube.com/watch?v=nWEfjH4hi7Y
Bokehノードは、Nuke 14.0v2で新搭載されたノードです。ZDefocusノードによく似ていますが、より高機能で、現実世界のカメラをシミュレートできる点やディープコンポジティングに対応している点などが特長です。もともとはPeregrine Labs社の販売する"PGBokeh"というプラグインでしたが、標準機能としてNukeに統合されました。非常に多機能なツールですが、ここでは基本的な部分に絞って紹介したいと思います。

[Depth Style]ノブでは、デプスデータの形式を "Real" か "1/z" から選びます。今回は "Real" を使いますが、前述の "far=0" 形式のデプスデータの場合は "1/z" を選べば良いというわけです。NukeのScanlineRenderノードは "far=0" 形式なので、"far=0" も用意されているようです(ただし、前述したようにこれらの方式は単純な計算式で相互に変換可能です)。

[Focal Plane]ノブ(=焦点面)でピントを合わせる距離を設定します。depthの値が"4.7"の部分でピントを合わせたいなら、ここに"4.7"と入力します。

[Focus Region Size]ノブは、被写界深度(=ピントが合う範囲の広さ)を調整します。

[Output Type]ノブを "Defocused Image"(=デフォーカス後の画像) から ”Focal Distance Visualization”(=ピント距離の視覚化)にすると、ピントを合わせる範囲の確認用の画面になります。"Normalize Vizualization" のチェックを入れると見やすいかもしれません。ピントが合う範囲が「赤」、それよりも手前が「緑」、奥が「青」で表示されます。ZDefocusノードと違うのがやっかいですね。

[Multiplier]ノブで全体的なボケの大きさ、[Front Multiplier]ノブで手前のボケの大きさ、[Back Multiplier]ノブで奥のボケの大きさを調整できます。"Multiplier"の名前の通り、かけ算(Multiply)で大きくしたり小さくしたりします。

さて、Bokehノードの特色である現実のボケをシミュレートしたい場合は、[Lens]タブで "Real World Lens Simulation" (=現実世界でのレンズシミュレーション)のチェックを入れます。

【補足:】VFXショットの撮影時には、一般的にカメラレポート(Camera Report)と呼ばれる記録を取ります。米国の視覚効果協会(Visual Effects Society)が、カメラレポートのテンプレートを公開しています。
https://camerareports.org/
ハリウッド映画の撮影現場ではこういった記録を取るのは"VFXデータラングラー"や"オンセットVFXスーパーバイザー"の仕事です。撮影現場でのデータ収集については、『映像制作のためのVFX教科書』(Eran Dinur著)という書籍が詳しく解説しています。
参考:3D人-3dnchu-|映像制作のためのVFX教科書 - エミー賞受賞の現役VFXスーパーバイザーによる技術解説本の日本語版!2020年11月下旬発売!

というわけで、実際のカメラの数値が手元にあるなら、Bokehノードに数字を入れていくことでシミュレートできます。[Focal Length]ノブ(=焦点距離)にレンズのmm数を入力し、[Apertures]ノブ(=絞り)にはF値を入力します。[File Format]ノブのドロップダウンから "Custom" を選び、[Aperture Width] と [Aperture Height] にセンサーサイズ(フィルムサイズ)を入力します(単位mm)。

さて、[World Scale]ノブで適切な単位を選んでください。正しいボケをシミュレートするなら「距離を表す数字の単位は何なのか?」という点が重要になってきます。たとえばここで「m」(=メートル)を選んだなら、デプスの値もmになっているべきで、1mなら「1」、10mなら「10」という値になっている必要があるわけです。また、[World Scale Multiplier]ノブでは、たとえばデプス値「1」が10mを意味している場合に、ここに "10" と入力することで正しく計算されるようです。

また、BokehノードではCameraインプットにCameraノードをつないで利用することができます。CGカメラが存在する場合には便利です。Cameraノードをインプットすると、Bokehノードの[Focal Length]、[Apertures]、[Focal Plane]、[Aperture Width]、[Aperture Height] などのノブは触れなくなります。代わりにCameraノードが持つ [Focal Length]、[Fstop]、[Focal Distance]、 [Horizontal Aperture]、[Vertical Aperture] の値が利用されることになります。
なお、もちろんBokehノードにもボケの形状をコントロールする機能があります。Bokehノードでは"Kernel"(カーネル)と呼んでおり、[Kernel]タブで調整します。ボケの形状用の画像を使うときは、Kernelインプットに画像を入力します。
補足しておきたいことがあります。Nukeのノード間で、用語が一致していないので注意が必要です。Bokehノードがもともとプラグインだったこともありますが、どうもそれだけではないようです…。バージョンによっても違いますが、ここではNuke14.1で説明します。
●デプスデータの方式
ZDefocusノードの [math] = Bokehノードの [Depth Style]
ZDefocusノードの "depth" = Bokehノードの "Real"
ZDefocusノードの "far=0" = Bokehノードの "1/z"
●F値(絞り値)
Bokehノードの [Apertures] = Cameraノードの [Fstop]
※ちなみにシネマレンズでは「F値」のかわりに「T値」が使われることが多く、厳密には違いますが、おおむね似たようなものです。
●焦点面(ピントを合わせる被写体の距離)
ZDefocusノードの [Focus Plane] = Bokehノードの [Focal Plane] = Cameraノードの [Focal Distance]
※言葉が似ていてややこしいですがFocal Length(焦点距離)はいわゆる「レンズのmm数」で、これとはまったく別の要素です。レンズのmm数というのは、ざっくり言うとカメラ内部のレンズとセンサーの間とか、そのへんの距離の話です。
●被写界深度(ピントが合う範囲の広さ)
ZDefocusノードの [depth of field] = Bokehノードの [Focus Region Size]
●センサーサイズ(フィルムサイズ)
Bokehノードの [Aperture Width] = Cameraノードの [Horizontal Aperture] = CameraTrackerノードの [Film Back Size] x
Bokehノードの [Aperture Height] = Cameraノードの [Vertical Aperture] = CameraTrackerノードの [Film Back Size] y
※なお、基本的にセンサーサイズの単位はmmで入力します。CameraTrackerノードではドロップダウンでmm以外の単位にも変更できるようになっていますが。
"Aperture"(アパーチャー=開口部)という英語も、一般的なカメラ用語としては「絞り」という意味で使われるようなのですが、CGソフト・合成ソフトなどではセンサーサイズを指して使われることが多く、混乱しやすい用語です。
さて、最後になりますが、コンポジターのグザヴィエ・ブルク(Xavier Bourque)が"Pixelfudger"(ピクセルファッジャー)として公開しているツール群のパッケージの中に、優れたデフォーカスのツールがあります。ここでは2つ紹介したいと思います。
まずひとつは、PxF_IDefocusというツールです。上述のiBlurやiConvolveを組み合わせたような高機能なツールで、選択肢になると思います。
PxF_IDefocusのビデオチュートリアル
https://www.youtube.com/watch?v=vCnBBDV0aic
以下の動画では、ティルト・シフト撮影(Tilt–shift photography)のようなジオラマ風のボケを例にして、Nukeの標準のZDefocusノードとBokehノードの機能を比較します。その上で、PxF_IDefocusが優れていることを説明しています。
ZDefocusノード vs Bokehノード
https://www.youtube.com/watch?v=0j0IUFC1mvk
もうひとつ、PxF_ZDefocusというツールは、Nukeの標準のZDefocusノードとBokehノードの良い所どりをした、進化版のようなツールです。
PxF_ZDefocusのビデオチュートリアル
https://www.youtube.com/watch?v=526Qi-NMwUo
以下の動画では、再びZDefocusノードとBokehノードの機能を比較します。その上で、PxF_ZDefocusが良い選択肢であることを説明しています。
ZDefocusノード vs Bokehノード パート2
https://www.youtube.com/watch?v=HTM59OFuQfQ
なお、この動画の中で紹介されているように、ZDefocusのようなツールではしばしばエッジに問題が発生することがあります。alphaのエッジにだけ問題が発生しているならdepthチャンネルをUnpremultすれば解決することもありますが、隣接する物体の境界で問題が発生している場合はdepthチャンネルの色を拡張したり、ぼかしたりすることで解決します。
いかがだったでしょうか。デフォーカスはとても奥の深い分野ですが、基本的な部分は理解できたんじゃないかと思います!
(つづく?)
前回からの続きです。今回は、ブラーとデフォーカスをテーマにして解説していきます。

内容:
Blurノード / Defocusノード / Convolveノード / ZDefocusノード / Bokehノード / DirectionalBlur(by Tony Lyons) / iBlur(by Moritz Eiche) / iConvolve(by Adrian Pueyo) / PxF_IDefocus, PxF_ZDefocus("Pixelfudger" by Xavier Bourque)
Blurノード
Blurノードは、Nukeで画像をぼかすときの最も基本となるノードです。

リアルなボケは表現できませんが、わずかに画像をぼかしたいときや、マスクをぼかすときなど、よく活躍します。

DirectionalBlur(by Tony Lyons)
Blurノードはブラーの量を垂直、水平を別々に調整できるため、縦方向のブラー、横方向のブラーはつくれます。しかし斜め方向のブラーは、そのままでは不可能です。斜め方向のブラーを適用したいときは、DirectionalBlur(=方向性ブラー)というツールが便利です。Trixterのコンポジターのトニー・ライオンズ(Tony Lyons)が公開しています。残念ながらNukeの標準機能のDirBlurノードは良くないのです。
DirectionalBlurのデモビデオ
https://www.youtube.com/watch?v=BrioyN9YMA8
DirectionalBlurは、トニー・ライオンズがまとめあげて配布している"Nuke Survival Toolkit"というNukeツールのパッケージの中に含まれています。VFX会社で実際に使われている、コンポジターなら道具箱に入れておくべきツールを数百個まとめたそうです。Nuke Survival Toolkitは、Githubからダウンロードできます。
https://github.com/CreativeLyons/NukeSurvivalToolkit_publicRelease/releases/
Nuke Survival Toolkitの紹介動画
https://www.youtube.com/watch?v=c8Jw-Iw2u4g
Defocusノード
Defocusノードは、レンズのようなボケをつくります。

Blurノードの結果とは明らかに異なり、玉ボケの表現が可能です。

Nukeの「maskインプット」について
ところで、ブラーやデフォーカス系のノードでNukeの「maskインプット」を使用することは、基本的にオススメしません。

maskインプットでは、「ノード適用前の画像」と「ノード適用後の画像」という2つの画像をブレンドするだけです。やっていることはKeymixノードと同じです。つまり、maskインプットでは中間の量のブラー、というのは期待できません。

iBlur(by Moritz Eiche)
iBlurは、コンポジターのモーリッツ・アイヒェ(Moritz Eiche)による有名なツールです。2015年のテラオカマサヒロ氏によるCGWORLDの連載、NUKE プラクティカル・ガイド Vol. 9:secret for Gizmo(その2)でも紹介されていました。

alphaチャンネルの濃度によって、徐々にボケていくようにできます。前述のmaskインプットではできなかった表現です。

それにしても、いったいどうやったらこんな効果が可能になるのでしょう?Groupノードの中を見てみれば分かります。ボケ加減の違う画像をたくさん生成し、段階的にブレンドすることで実現しています。
iBlurは、Nukepediaからダウンロードすることも可能ですが、前述のNuke Survival Toolkitにも含まれています。
Covolveノード
Nukeの標準のCovolveノードは、Defocusノードよりもさらにリアルなボケを表現できるノードです。ちょっとクセがあるのと、他の方法もあるので、実際にはそれほど使われないノードかもしれません。しかし、この後の説明の前提知識として、ここで説明しておきたいと思います。Covolveノードは、filterインプットにボケの形状用の画像を入力して使います。

これにより、実際のカメラで撮影したときのように、絞りの形でボケます。Defocusノードでは正円でボケますが、Convolveノードでは多角形など自由な形でボケをつくれるので、Convolveノードの方がよりリアルな表現が可能であると言えます。

デフォルトでは[filter channel]ノブが "rgba.alpha" になっていますが、その横にある"use input channels"のチェックを入れるとその設定は無視され、RGBカラーがデフォーカス効果に影響を与えるようになります。filterインプットに入力した画像のr, g, b各チャンネルが、r, g, b各チャンネルのデフォーカス効果に利用される仕組みになります。
これにより各チャンネルでボケの量が異なるという「軸上色収差」に似た表現が可能になります。色収差については、[別記事:VFXと色収差] で説明しました。また、この後の説明で登場するカメラ用語なども説明していますので、よろしければぜひご一読ください。
iConvolve(by Adrian Pueyo)
iConvolveは、VFXスーパーバイザーのエイドリアン・プエヨ(Adrian Pueyo)によるツールです。iBlurのConvolveバージョンです。グラデーションを持つalphaを入力し、徐々にボケていくようにできます。
2分で"iConvolve"を理解する(VFXforFilmmakers.comチャンネル)
https://www.youtube.com/watch?v=0jdlkQ9Fl2g
iConvolveも、Nuke Survival Toolkitに含まれています。
ZDefocusノード
ZDefocusノードはNukeの標準のノードで、奥行きに応じてデフォーカス量を変えられるノードです。Defocusノードの発展版です。

通常、ZDefocusノードはCGレンダリング画像に対して使います。たとえば、このようなCGレンダリング画像があるとします。

Zデプスのデータがこちらです。3次元空間の次元軸を表すX, Y, Zのうち、Z軸は一般的に奥行きを表すことが多く、奥行きの情報が保存されたデータは "Zデプス" と呼ばれています。

そして、これがZDefocusノードの効果です。距離に応じて、ボケ具合の違う表現が可能です。

簡単に使い方を説明します。[depth channel]ノブで適切なチャンネルを選びます。ここでは"depth.Z"チャンネルを選びます(ちなみにもしデプスデータがRGBA画像とは別の画像ファイルとして書き出されていたら、ShuffleノードやCopyノードでチャンネルを移し替える必要があるということになります)。

[math]ノブは、デプスデータの形式をNukeに教えてあげるためのドロップダウンです。どうしてこんなにたくさんの設定が選べるようになっているのでしょうか?これには、画像処理の歴史的な経緯があります。

現在はOpenEXR画像ファイルに浮動小数(float)のデータを保存できるので、数値の上限・下限はありません。しかし昔はデジタル画像を8bitや16bitの整数(integer)で保存するのが普通であり、たとえば8bitで言うと下限は0、上限は255と決まっていました。そのためデプスデータは「0~1」の範囲に収める必要がありました(0~1というのは、0~255の8bitで言うと255で割ることで正規化=Normalizeした数値で、これは255を掛けることで元に戻ります)。そこでCGソフトは「Z=1/カメラからの距離」という計算を行い、カメラからの距離が1なら1、10なら0.1、100なら0.01…というふうにして、0~1の範囲にして、つまりある種のデータ圧縮のような計算を行ってから画像データを保存しました。これが "far=0" の形式であり、NukeのScanlineRenderノードやCGレンダラーのRenderManのデフォルトなどがこれにあたります。CGソフトやレンダラーによってさまざまな方式があるため、Nukeは項目をたくさん用意しているわけです。今回、ここで説明に使うデプスデータはカメラの場所を原点として、遠くほど値が大きくなり、上限は決まっていないという形式にしたいと思います。つまり、今回は[math]ノブを "depth" に設定すると良いことになります。
なお、さまざまな方式のデプスデータは、わりとシンプルな計算によって相互に変換可能です。ShizlogチャンネルさんのYoutube動画では、Expressionノードで変換する方法が紹介されています。
[Nuke tips 11] Nukeがdepthをどう書き出してるかのはなし
https://www.youtube.com/watch?v=WzM91G4jt3Q
さて、ZDefocusノードでは、「ピントを合わせる部分」を決める必要があります。ビューア画面上に出てくる "focal_point"という点を動かすことで指定できて、便利です。

ビューア画面上で "focal_point" を動かすと、自動的に [focus plane] と [focal point] の x, y のノブの数値が変わっていきます。項目が2つあって少しややこしいですが、最終的にピントを決定するのは [focus plane]ノブの値です。[focal point] は、[focus plane] を設定するために一時的に利用される値にすぎません。

[output]ノブを "result"(=結果) から "layer setup"(=レイヤー設定)" または "focal plane setup" (=焦点面設定)という出力モードに切り替えます。これらはピントを合わせる範囲の確認用の画面です。

2つのモードは同じようなもので「赤」「緑」「青」で表示しますが、"layer setup" はレイヤーに分割したときの状態を加味して表示します。ここで言うレイヤー(=層)というのは、ZDefocusノードもやはりiBlurと同じように、内部的にはボケ具合の違う画像をいっぱいつくって、ダブらせて画像をつくっているんですが、その画像のことです。
ピントの合う範囲が「緑」、それよりも手前が「赤」、奥が「青」で表示されます。手前からR, G, Bで分かりやすいですね。

[depth of field]ノブは、日本語で言うと被写界深度(ひしゃかいしんど)です。被写界深度というのはピントが合う範囲の広さのことで、撮影用語では被写界深度が「深い」とか「浅い」と言ったりします。[depth of field]ノブの値を大きくすると画面に「緑」のエリアが出てきます。

なお、[depth of field]ノブの隣に "blur inside" というチェックボックスがあります。これはピントの合っているエリアにもわずかなブラーを追加する設定ですが、多くの場合好ましくないのでチェックを外して内側をぼかさないようにします。
ピントをきちんと合わせたい場所が「緑」になるように [depth of field] を設定したら、[output] は "result" に戻してください。
では、[size]ノブの値を上げ下げして、ボケの大きさを決定します。ここには[maximum]ノブがあります。[maximum](=最大値)では、ボケの大きさの上限を設定し、[size] を大きく調整してもある量以上にはボケないようにすることができます。

図にすると、各項目はこのような役割になっています(※この図は以前海外サイトで見かけたものを参考に描き起こしました)。

さて、ZDefocusノードには、Convolveノードの機能もあります。[filter type]ノブで、ボケの形状を設定できます。デフォルトの "disc" は正円の形でボケますが、"bladed" に変更すると多角形にできます。また、"image" に変更すると、Convolveノードのようにfilterインプットに入力した画像の形でボケるようになります。Convolveノードと同じく、通常 "use input channels" のチェックを入れて使います。このあたりは、ShizlogチャンネルさんのYoutube動画が分かりやすいので、ぜひご覧ください。
[Nuke tips 10] ZDefocusでリアルなボケを再現!
https://www.youtube.com/watch?v=nWEfjH4hi7Y
Bokehノード
Bokehノードは、Nuke 14.0v2で新搭載されたノードです。ZDefocusノードによく似ていますが、より高機能で、現実世界のカメラをシミュレートできる点やディープコンポジティングに対応している点などが特長です。もともとはPeregrine Labs社の販売する"PGBokeh"というプラグインでしたが、標準機能としてNukeに統合されました。非常に多機能なツールですが、ここでは基本的な部分に絞って紹介したいと思います。

[Depth Style]ノブでは、デプスデータの形式を "Real" か "1/z" から選びます。今回は "Real" を使いますが、前述の "far=0" 形式のデプスデータの場合は "1/z" を選べば良いというわけです。NukeのScanlineRenderノードは "far=0" 形式なので、"far=0" も用意されているようです(ただし、前述したようにこれらの方式は単純な計算式で相互に変換可能です)。

[Focal Plane]ノブ(=焦点面)でピントを合わせる距離を設定します。depthの値が"4.7"の部分でピントを合わせたいなら、ここに"4.7"と入力します。

[Focus Region Size]ノブは、被写界深度(=ピントが合う範囲の広さ)を調整します。

[Output Type]ノブを "Defocused Image"(=デフォーカス後の画像) から ”Focal Distance Visualization”(=ピント距離の視覚化)にすると、ピントを合わせる範囲の確認用の画面になります。"Normalize Vizualization" のチェックを入れると見やすいかもしれません。ピントが合う範囲が「赤」、それよりも手前が「緑」、奥が「青」で表示されます。ZDefocusノードと違うのがやっかいですね。

[Multiplier]ノブで全体的なボケの大きさ、[Front Multiplier]ノブで手前のボケの大きさ、[Back Multiplier]ノブで奥のボケの大きさを調整できます。"Multiplier"の名前の通り、かけ算(Multiply)で大きくしたり小さくしたりします。

さて、Bokehノードの特色である現実のボケをシミュレートしたい場合は、[Lens]タブで "Real World Lens Simulation" (=現実世界でのレンズシミュレーション)のチェックを入れます。

【補足:】VFXショットの撮影時には、一般的にカメラレポート(Camera Report)と呼ばれる記録を取ります。米国の視覚効果協会(Visual Effects Society)が、カメラレポートのテンプレートを公開しています。
https://camerareports.org/
ハリウッド映画の撮影現場ではこういった記録を取るのは"VFXデータラングラー"や"オンセットVFXスーパーバイザー"の仕事です。撮影現場でのデータ収集については、『映像制作のためのVFX教科書』(Eran Dinur著)という書籍が詳しく解説しています。
参考:3D人-3dnchu-|映像制作のためのVFX教科書 - エミー賞受賞の現役VFXスーパーバイザーによる技術解説本の日本語版!2020年11月下旬発売!

というわけで、実際のカメラの数値が手元にあるなら、Bokehノードに数字を入れていくことでシミュレートできます。[Focal Length]ノブ(=焦点距離)にレンズのmm数を入力し、[Apertures]ノブ(=絞り)にはF値を入力します。[File Format]ノブのドロップダウンから "Custom" を選び、[Aperture Width] と [Aperture Height] にセンサーサイズ(フィルムサイズ)を入力します(単位mm)。

さて、[World Scale]ノブで適切な単位を選んでください。正しいボケをシミュレートするなら「距離を表す数字の単位は何なのか?」という点が重要になってきます。たとえばここで「m」(=メートル)を選んだなら、デプスの値もmになっているべきで、1mなら「1」、10mなら「10」という値になっている必要があるわけです。また、[World Scale Multiplier]ノブでは、たとえばデプス値「1」が10mを意味している場合に、ここに "10" と入力することで正しく計算されるようです。

また、BokehノードではCameraインプットにCameraノードをつないで利用することができます。CGカメラが存在する場合には便利です。Cameraノードをインプットすると、Bokehノードの[Focal Length]、[Apertures]、[Focal Plane]、[Aperture Width]、[Aperture Height] などのノブは触れなくなります。代わりにCameraノードが持つ [Focal Length]、[Fstop]、[Focal Distance]、 [Horizontal Aperture]、[Vertical Aperture] の値が利用されることになります。
なお、もちろんBokehノードにもボケの形状をコントロールする機能があります。Bokehノードでは"Kernel"(カーネル)と呼んでおり、[Kernel]タブで調整します。ボケの形状用の画像を使うときは、Kernelインプットに画像を入力します。
カメラ用語についての補足
補足しておきたいことがあります。Nukeのノード間で、用語が一致していないので注意が必要です。Bokehノードがもともとプラグインだったこともありますが、どうもそれだけではないようです…。バージョンによっても違いますが、ここではNuke14.1で説明します。
●デプスデータの方式
ZDefocusノードの [math] = Bokehノードの [Depth Style]
ZDefocusノードの "depth" = Bokehノードの "Real"
ZDefocusノードの "far=0" = Bokehノードの "1/z"
●F値(絞り値)
Bokehノードの [Apertures] = Cameraノードの [Fstop]
※ちなみにシネマレンズでは「F値」のかわりに「T値」が使われることが多く、厳密には違いますが、おおむね似たようなものです。
●焦点面(ピントを合わせる被写体の距離)
ZDefocusノードの [Focus Plane] = Bokehノードの [Focal Plane] = Cameraノードの [Focal Distance]
※言葉が似ていてややこしいですがFocal Length(焦点距離)はいわゆる「レンズのmm数」で、これとはまったく別の要素です。レンズのmm数というのは、ざっくり言うとカメラ内部のレンズとセンサーの間とか、そのへんの距離の話です。
●被写界深度(ピントが合う範囲の広さ)
ZDefocusノードの [depth of field] = Bokehノードの [Focus Region Size]
●センサーサイズ(フィルムサイズ)
Bokehノードの [Aperture Width] = Cameraノードの [Horizontal Aperture] = CameraTrackerノードの [Film Back Size] x
Bokehノードの [Aperture Height] = Cameraノードの [Vertical Aperture] = CameraTrackerノードの [Film Back Size] y
※なお、基本的にセンサーサイズの単位はmmで入力します。CameraTrackerノードではドロップダウンでmm以外の単位にも変更できるようになっていますが。
"Aperture"(アパーチャー=開口部)という英語も、一般的なカメラ用語としては「絞り」という意味で使われるようなのですが、CGソフト・合成ソフトなどではセンサーサイズを指して使われることが多く、混乱しやすい用語です。
PxF_IDefocus, PxF_ZDefocus("Pixelfudger" by Xavier Bourque)
さて、最後になりますが、コンポジターのグザヴィエ・ブルク(Xavier Bourque)が"Pixelfudger"(ピクセルファッジャー)として公開しているツール群のパッケージの中に、優れたデフォーカスのツールがあります。ここでは2つ紹介したいと思います。
まずひとつは、PxF_IDefocusというツールです。上述のiBlurやiConvolveを組み合わせたような高機能なツールで、選択肢になると思います。
PxF_IDefocusのビデオチュートリアル
https://www.youtube.com/watch?v=vCnBBDV0aic
以下の動画では、ティルト・シフト撮影(Tilt–shift photography)のようなジオラマ風のボケを例にして、Nukeの標準のZDefocusノードとBokehノードの機能を比較します。その上で、PxF_IDefocusが優れていることを説明しています。
ZDefocusノード vs Bokehノード
https://www.youtube.com/watch?v=0j0IUFC1mvk
もうひとつ、PxF_ZDefocusというツールは、Nukeの標準のZDefocusノードとBokehノードの良い所どりをした、進化版のようなツールです。
PxF_ZDefocusのビデオチュートリアル
https://www.youtube.com/watch?v=526Qi-NMwUo
以下の動画では、再びZDefocusノードとBokehノードの機能を比較します。その上で、PxF_ZDefocusが良い選択肢であることを説明しています。
ZDefocusノード vs Bokehノード パート2
https://www.youtube.com/watch?v=HTM59OFuQfQ
なお、この動画の中で紹介されているように、ZDefocusのようなツールではしばしばエッジに問題が発生することがあります。alphaのエッジにだけ問題が発生しているならdepthチャンネルをUnpremultすれば解決することもありますが、隣接する物体の境界で問題が発生している場合はdepthチャンネルの色を拡張したり、ぼかしたりすることで解決します。
いかがだったでしょうか。デフォーカスはとても奥の深い分野ですが、基本的な部分は理解できたんじゃないかと思います!
(つづく?)
- 関連記事
-
- 10分で分かるNUKE*4 (ブラー&デフォーカス編) (2024/05/26)
- 10分で分かるNUKE*3 (Rotoノード編) (2023/11/06)
- さまざまなグレイン・ワークフロー(Nuke) (2023/09/14)
- Nukeのノードのクローンは使ってはいけない!(という都市伝説?) (2023/05/11)
- NukeのTCL入門!さまざまな情報を取得して活用する方法 (2023/04/18)
- スクリーンクリーン: Nukeでグリーンバックを均一にするテクニック (2023/04/04)
- 10分で分かるNUKE*2 (2020/12/15)
- 10分で分かるNUKE (2020/12/01)
- NukeにおけるOCIOを使ったACESシーンリニアワークフロー (2019/05/08)
- NUKEのスピードを速くするためのTips集 (2016/12/19)
- Nuke Pythonを使ってノードの設定を一括変更する (2016/12/03)
- NUKEのエクスプレッション(Expression)の便利な使い方 (2016/10/18)
- NUKE初心者におすすめのショートカット (2016/10/11)
- NUKE入門! 画像サイズをマスターする10項目のルール (2016/07/15)
- NUKEのノードツリーを整理してワンランク上の合成作業を目指す (2015/11/17)