Nukeのdepth値は1/distance
credit for my comp master thank you!
どこかに記事か資料があるかもしれませんが個人的に最近、本当の意味で理解できたのでメモを兼ねた投稿です。
Nukeで3Dシーンを構築しScanlineRenderから書き出されるdepthチャンネル値がどのように計算されているか。(調べましたが、NukeのPRmanRenderでも結果は一緒でした)
結論から言うとこのようになっています。
depth=1/distance(カメラからの距離 単位:unit)
カメラからオブジェクトの距離が2だとdepth=0.5
カメラからオブジェクトの距離が10だとdepth=0.1
という具合です。私は計算だけやってもピンとこないのでCard作っていちいち確認しましたw
この計算は値(0除く)にかけ算したら1になるような計算、multiplicative inverse(逆数)っていうみたいです。学校で習ったような習わなかったような・・・・習ったような・・・。
Q.なぜこれを理解している必要があるか?
A.主に、3Dレンダーなど外部から持ってきたdepth値と一致させる為。
例えばNukeのScanlineRenderから書き出した素材Aと、3Dレンダー素材Bを合成し、それぞれのdepthチャンネルを使ってシーン全体にフォグをかけると
き、3Dレンダラーの設定にもよりますが、まあ大体AとBのdepth値は合いません。最終的に見た目での微調整は必要かもしれませんが、作業する際、最初は理論的に整合性が取れている状態で始める必要があります。そして、3Dレンダラーの仕様と設定次第で3D側のdepth値の出方も変わります。
これを分かった上でどう操作すれば良いのか。
・ScanlineRenderから出したdepth値をカメラからのdistance値(unit)に変換したい場合
depth=1/distanceを使いdepthからdistanceを求めたいので、1/depthする。(画像参照)
・その上で、3Dソフトのdepthリマップ値と合わせたい場合(画像参照)
ExpressionもしくはGradeで合わせる。
3D側の例画像はMayaのMental Rayです。MayaのMental Rayはdepthが奥に行く程値が大きくなりますが、何もオブジェクトが無いところの値が"0"になる性質があり、データとして矛盾しています。(0=カメラに一番近い)ですのでレンダリングした素材をNukeに読み込んだときdepthチャンネルにエクスプレッションをかけてこの矛盾を回避する必要があります。
No comments:
Post a Comment