2010-05-31

Relightingを考察してみる

チラオカ的にRelightingについて考えてみました。
その名前からして Re+Lighting = 再びライティングをする 的なことなのでしょうが、最近もてはやされているRelightingはそれにとどまらないように見受けられます。
Relighting Systemとしては、まだ市販の製品がなく(?)インハウスや、コンポジットでその仕組みを取り入れるというのが実情のようです。
しかし、そんな状況で場末のボクのようなペーペーの耳にも届く情報がちらほらとあり、一つはSPIのインハウスツールであった「Katana」。そしてもう一つは「Bakery Relight」です。Katanaに関しては、FMX 2010でFoundryから、少し発表があったようです。といってもNukeへの組み込みされたものではなく、SPIから買い取ったマンマのものでのデモがあったようです。その内容によると、確かに言葉のマンマ、Relightingツールではあるものの、それにとどまらないといった感じです。Bakery Relightに関しては、http://www.thebakeryanimation.com/に少し情報がありますが、こちらも、ただRelightingをするツールというわけではなく、自前レンダラなどが付属していて、もちろんshaderも編集できる といった感じです。海外で働かれている、ますおさんのブログでKatanaBakery Relightも紹介されています。無断リンクごめんなさい・・・

最近よく耳にするRelighingツールというのは、ボクが思うに、LookDevの作業をそこそこカバーするツールなんだろうなぁ・・・ と考えています。
あと、Hairが扱えるかどうかの差が結構デカイ気もします・・・ 


まともなRelightingシステムを触ってみたいぞ!

IBL+Blurry Reflection

IBL+Blurry Reflection をNukeでやってみました。少し標準のRelightingも足してます。



用いているレンダーパスは、beauty pass以外にPworld、Nworld、BentNormal、ambocc、relfoccです。
BentNormalに関しては、 http://en.wikipedia.org/wiki/Ambient_occlusion ココに少し載っています。
Nuke側で特にaddonするプラグインのようなものは使わずに、標準機能のみでやっております。
これで、shadowを落とせればかなり満足なのですが・・・


LookDev的にはNukeはナカナカ面白いかもしれません。

2010-05-30

Relighting その1

久々の更新・・・
Nukeを用いたRelightingに関して少し紹介しようと。ただ、どう考えてもそこそこなボリュームになるので、何回かに分けます。

実はNukeでのRelightingは実にいろいろな方法があります。
一番ストレートなのはFBXやOBJでジオメトリをインポートして、実際にライティングを施す方法。
Nukeはそこそこハイポリなジオメトリを持ち込んでも、かなり軽快にオペレーションできるので、この手法でもなかなかストレスなく結果に近づけていくことができます。
ただ、デフォームアニメーションしているジオメトリなどは、連番のジオメトリファイルで入ってくるので、やはり毎フレームの読み込みや、また、3Dアプリケーション側での吐き出しなどに時間がかかるだとか、shaderレベルでデフォーム(ディスプレイスメントマッピングなど)しており、3Dアプリケーション側から簡単にはけないだとか・・・ 色々と問題があったりします(どこぞのコンポジットのようにRIBが読めるかは別で・・・)。

で、そうすると、画像を元にRelightingをしたいと思うわけで、そうすると、一番手っ取り早いのが、標準のReLightNodeを用いる方法です。
 ただ、少々面倒なのは、すっーと、ReLightNodeを呼び出すことはなぜかできません・・・
手順としては、NodeOperator > Other(etcのアイコン) > All Plugins > Update
をすることで、アクセスできるようになります。


一旦これをやっておくと、すべてのNodeOperatorがアルファベット順でずらずらと出てきます。この中のReLightNodeです。


ReLightNodeには「color」と「lights」がコネクトできます。ただしこれだけでは不足で、適当に、「Color」と「Lights」をつないでみると・・・ 


なにやら新たにコネクト出来そうなものがでてきて・・・ さらにこいつを引っ張ってみると「camera」がコネクト出来ることがわかります。


実際に「Camera」をコネクトするとさらに、「material」がコネクト出来ます。「material」には 3D > Shader > Phong をとりあえず当てておきます。これで、一応、準備は完了です。


と、大雑把な流れは異常なのですが、ReLightNodeのプロパティーを「normal vectors(Nworld)」と「point positions(Pworld)」が必要なことがわかります(最後に説明します)。


さらに、cameraデータが必要です。3Dアプリケーションなどから、実際にFBXなどでcameraを受け取ることもできるのですが、せっかくなので、すべて画像ベースで行おうとおもいます。ただし、レンダラがVrayに限られます。

vrayCameraAttributes
http://fullblownimages.servebeer.com//scripts.html

というのを利用します。これはプラグインとかではなく、Vrayでレンダリングするとメタデータとして画像に付属している、cameraデータを読み込むツールというか手法です。
中身はただのPythonを用いたExpressionなのですが、RIBなどを編集するのにも用いられる、Python CGkit というものを利用します。

Python Computer Graphics Kit
http://sourceforge.net/projects/cgkit/files/cgkit/
(Python2.6が必須です)

インストールなどの詳しい手法は、各サイトを参考にしてみてください。

でこれらを用いるとカメラの位置、回転、レンズ、アパチャーなど諸々情報が得ることができます。
これでcameraはNukeにインポートできます。もちろん、先に書いたように、FBXで持ち込んでもいけますし、 http://www.creativecrash.com/ などに各3Dアプリケーションに対応した、スクリプトやプラグインなどでNukeへのエクスポーターがいくつか存在していますので、それを使ってもいけるとおもいます。


で、ジオメトリを実際に持ち込んでいれば、ライトを3Dビューで見ながら調整してやれば、感覚が掴みやすいのですが、今回は画像のみで行うということにこだわりたいと思います。
じゃあ、どうするか・・・ PointCloud を用います。PointCloudNodeを用いると、Pwolrd(Ppass)から、Nuke内でPointCloudを構築できます。これにより、いちいちジオメトリをインポートしなくても、Relightingに必要なぐらいの形状は把握することができ、なかなか便利に作業が行えます。
ただ、PointCloudNodeは標準ではありません。ここでは、

PointCloud
http://www.pxfactory.eu/plug/PointCloud/pointCloud.html 

のものを使っております。



説明がボロボロと前後していますが、ここで紹介している手法はかなり「複合技」です。確かに、ReLightNodeにペコっと繋げばいいだけなのですが、しかし、色々と説明しておかなければならない、事項があったりします・・・ その中にPworld(Ppass)と、Nwolrd(Npass)とがあります。Pworldというのは、画像内のピクセルが、3D空間上のどこにあるかの座標を格納しています。XYZの各座標値をRGBの各チャンネルに格納しています。 Nwolrdというのは、同じように、画像に映っているジオメトリの法線情報をRGBの各チャンネルに格納しています。ともに、ワールドスペースだからworldとついてます。他にオブジェクトスペース、カメラスペースなどがあります。


通常CGに用いられてきた8bit画像では、RGBは0-255で格納されておりますが、16bitや32bitの画像フォーマットを用いると、これらを超えた領域でも保存することが可能です。マイナス値も格納されます。で、いろんなレンダパスをAOVとして一枚の画像に保存できるのが、OpenEXRです。memlogのコマツさんも紹介されています。

memlog
OpenEXR使おうぜ

でこれらの複合技でRelightingするとこんな感じ


とはいえ、これで、ライティング調整、質感調整ができるはずもなく、環境マッピングなどを組み合わせて、その後も色々と行うのですが。今回はここまでで。

オマケ
3dsmaxからいろんなものを出す場合は、3dsmaxの座標系とNukeの座標系の違いのため(というか3dsmaxが特殊な座標系)、変換してやる必要があります。PpassもNpassもしかり、今回exrから取り出したcameraデータしかり・・・
簡単に説明すると、XYZ(RGB)でYとZを交換して新たにZになった値にマイナスを掛けると3dsmaxの座標系のZupが通常の座標系Yupに変換できます。
VrayからPython CGkitをつかって取り出したcameraの位置のXYZ、回転のXYZも同様です。