« Realityでテレビを表現する | トップページ | LuxRenderのSPPMを使う »

RealityFogとWorldVolume

Reality_fog_1

Realityを使い始めてからずっと気になっていたのが、Fog(霧)の表現です。RealityプラグインにはRealityFogというPropが付属していて、霧を表現したい場合にはこのPropでシーンを囲むというように説明されています。しかしこのRealityFogは曲者で、光を正しく処理してくれません。まるで霧全体が発光しているかのように、かなり不自然な霧になってしまいます。

まるであら捜しをしているようで大変心苦しくはあるのですが、Realityは使っていて変に感じることが多いのです。今回はこの霧を正しくレンダリングする方法について書きたいと思います。

なぜRealityFogが発光してしまうのか、その原因は霧のボリューム(立体的な質感)を正しく記述していないためです。本来、LuxRenderでは、基準となる面を境にして内側と外側のボリューム(InteriorとExterior)をそれぞれ指定する必要があります。しかし、Realityはこのボリューム情報を出力していません。従ってRealityFogを使用すると、LuxRenderはライトが霧のボリュームの内側にあるのか外側にあるのかを判断できません。従って、デフォルトのボリュームであるWorldVolumeの中にあると決め付けてレンダリングをするわけです。その結果、霧全体がライトに照らされているかのように発光してしまうわけですね。

そこで今回は、RealityFogなどという不完全なものを使わずに霧のシーンを表現してみたいと思います。本来、霧を使いたいときにはシーン全体を霧で覆うことが普通であるため、今回はデフォルトのボリュームであるWorldVolumeにその情報を記述するためのスクリプトを作成しました。(これがいちばん簡単)

ダウンロードはこちらです。(SkyDrive)

Reality_fog_2まずは比較のために、このようなシーンを準備しました。光源はスポットライト1灯のみです。これをレンダリングしてみたいと思います。これをRealityFogを使った場合と、今回のスクリプトを使った場合で比較してみます。


Reality_fog_3RealityFogのほうはシーンが白っぽくなってしまいます。しかも、本来存在するはずのスポットライトが見えません。ライト付近の霧は強い光で照らされるため、明るく見えるはずですよね。これに対して、WorldVolumeのほうは光源が正しくレンダリングされていますし、画面が白っぽくなるということもありません。


Reality_fog_5角度を変えて見てみると一目瞭然です。WorldVolumeのほうはスポットライトのコーン(円錐形)の形に霧が見えているのに対し、RealityFogではライトのコーンは見えないうえに、本来光があたらないはずの周辺の霧まで明るく輝いてしまっています。
これを作者のフォーラムで報告すると、どうせまたわけのわからない反論をされるのがおちですし、また英語でくどくど説明するのも嫌なので、今回は放置しておきます。さすがにあちらのユーザーさんもそのうち気が付くでしょ。(;´Д`)


Reality_fog_7ということで、スクリプトの使い方です。基本的にはlxsファイルを指定して、ボリュームのパラメータを入力してAcceptを押すだけです。このスクリプトが修正するのはlxsファイルとlxmファイルの2つになります。


パラメータの意味は次のとおりです。
①Type

ボリュームの質を指定します。ここではclearまたはhomogeneousのどちらかを選択します。clearは透明な質感で、濁りの無い澄んだ水や空気の質感になります。これに対してhomogeneousはボリュームの中で光が散乱します。霧を表現したいときにはhomogeneousを使用します。

②IOR

ボリュームの屈折率を指定します。デフォルトは空気の屈折率が入っています。

③Absorption color

ボリュームが吸収する光の色です。本来は補色で指定するのですが、ここではわかりやすくするために原色を指定します。たとえば青い光が遠くまで届くようにするには青っぽい色に指定してください。

④Absorption scale

吸収率を設定する場合の倍率です。Absorptionの効果を強めたり弱めたりするときにつかいます。0.01と指定すれば、光の吸収率は1/100になります。

⑤Scattering coefficient

ボリューム中で光が拡散する度合いです。明るい色にすれば濃い霧になります。

⑥Scattering scale

光の拡散を設定する場合の倍率です。Absorption scaleと同様に、霧を薄くしたい場合には1以下の少数値を入れてください。

⑦Scattering asymmetry

私もよくわかりません(笑)。通常は真っ黒で良いと思います。わかる人だけ値を設定してください。


今回はFogを取り上げましたが、Realityは特にボリュームの扱いについての実装が甘いように思えます。おそらく作者もあまり理解していないためだと思いますが、決して安くはないプラグインですし、作者にはもう少しLuxRenderについて勉強してほしいものです。(´・ω・`)

Foggyscene1

こちらは屋外シーンのテスト画像です。

|

« Realityでテレビを表現する | トップページ | LuxRenderのSPPMを使う »

DAZ Studio Tips」カテゴリの記事

コメント

( ´・ω・)ノ どもっ♪
 
Realityは、まだまだ未完のプラグインなのですねえ。(´・ω・`)ショボーン
一枚目なんか、逆光のモノクロ写真みたいです。
 
やはり3DCGは、難しい・・・(;≡ω≡)o))
 
 
近況報告w(ノ∀`*)ペチ
膨大なRuntimeの整理に、地獄を見てます。
PC調子が悪くなる度にRuntimeを減らし・・・
P8J使うのに名前を変えた為に、重複が多く・・・
まだ重複を取り除く作業中です。
使う物とコレクションに分けてるので、さらに時間がかかりそうです。
Windows7にも、泣かされてます。
 
いったい何時になったら、遊び始められるのやらw☆ヽ(o_ _)oポテッ

投稿: おサル | 2011年5月 6日 (金) 09時42分

おサルさん、コメントありがとうございます。

Realityは設計思想が安易なのでしょうが、細部まで行き届いた設定というのができなくて歯がゆい思いをしています。特にPoser使いなら通常はあってしかるべき機能が未実装だったり不完全だったりしますので、作者の知識不足が原因だと思うのです。(´・ω・`)

とはいっても主要なエクスポート機能だけはしっかりと動作していますので、プラグインとしては実用になるレベルだと思います。Realityが使用するのはLuxRender全体の機能のうちのほんの一部だけです。Realityで実現できないからといってLuxRenderが使い物にならないものだと誤解されるようにはなって欲しくないです・・・。

Runtimeの移行は大変な作業になりますよね。私の場合はRuntimeそのものがすっぱり消えてしまったため、1からインストールしなおしでしたが、かえってそのほうが楽だったのかも知れません。(;´∀`)

Windows7は権限の問題にさえ注意すれば、慣れると快適ですよ。ヽ(´ー`)ノ

投稿: とうふ | 2011年5月 6日 (金) 11時00分

こういうボリューム表現もできるんですね。ありがたくダウンロードさせていただき、さっそく使わせてもらいました。
RealityFogだとのっぺりした感じになってしまうのに対して、WorldVolumeの方は理想的なボリュームスポットライトが表現できました。

RealityFogの方はこういうものになってしまうからこそ、(光の通り道以外が光ってしまわないように)フォグの外から細めのスポットライトを当てるよう、マニュアルの使い方のところで指定してあったのですね。

一つLuxRenderのことで疑問があるのですが、空気遠近法のような大気の設定というのはあるのでしょうか?野外のレンダリングを試すことが多いので気になってます。

投稿: Kotozone | 2011年5月 7日 (土) 15時47分

Kotozoneさん、コメントありがとうございます。

Realityは大変便利なプラグインなのですが、少し実装が甘いですよね。3D中級者以上の方なら、おそらくこういうところで不満が出てきているのではないかと思われます。(;´Д`)

空気遠近法についても、WorldVolumeの応用で可能だと思います。ご参考になるかどうかわかりませんが、記事の最後に屋外のテストシーンを貼り付けておきます。使用した照明はIBLのみで、ポストワークなしです。これにBloomをかけると霧らしく見えてきます。

基本的にはAbsorptionをごくわずかに青になるよう設定するか、あるいは完全な白にして空気による光の吸収を無効にし、scatteringはscaleを0.01のように小さくすることで、遠景の霞を表現できそうです。

ただし屋外のシーンだと少し問題があって、木の葉のように厚みの無いポリゴンの表裏で構成されているようなものは、その両面(InteriorとExterior)にVolumeの設定をしてあげる必要があります。一応スクリプトは作ったのですが、サイズの巨大なlxoファイルを編集することになるため、スクリプトでは実行にかなり時間がかかります。(高速化のため、この処理はあとでC++などの外部アプリケーションで作り直そうと考えています。)

lxo対応版のスクリプトは↓に置いておきました。
http://cid-5ac2dad2137b3be2.office.live.com/self.aspx/.Public/WorldVolume^_002.zip

lxoを処理するかどうかはチェックボックスでON/OFFができます。一度lxoを処理さえしてしまえば、あとはチェックをはずしてVolumeの設定を調整を繰り返し行っても問題ありません。

投稿: とうふ | 2011年5月 7日 (土) 20時29分

わざわざ改良していただいてありがとうございます。InteriorとExteriorという用語はLuxRenderでの頻出語ですね。
簡単なシーンでテストしてみました。Clearタイプだと効果がわからなかったのですが、homogeneousタイプなら調整しやすかったです。これで遠くまで見通せないような森の中を表現できますね。最初は海の中になってしまいましたけど^^
あとで遠景にも挑戦してみます。
レンダリング時間も思ったほど増大しないみたいで良い感じです。

投稿: Kotozone | 2011年5月 8日 (日) 15時42分

Kotozoneさん、コメントありがとうございます。
検証ありがとうございます。見直してみたところ、clearタイプのAbsorptionが正常に出力されていませんでした。申し訳ありません。(;´Д`)

修正版をアップしておきました。
http://cid-5ac2dad2137b3be2.office.live.com/self.aspx/.Public/WorldVolume^_003.zip

clearではAbsorptionのみ有効で、scatteringは意味を持ちません。水などの表現には、このclearタイプのボリュームを使用すると、水深による青みの強さなども表現できるようです。空気として使った場合でも、IBLを使ったときの背景画像の明るさを調整するのにも使えそうな感じです。

レンダリング時間に関してですが、RealityではVolumeIntegratorをsingle固定で出力するため速度にそれほど影響がないようです。ここをmultiにするとレンダリング速度が著しく落ちますが、よりリアルなボリュームを表現できます。しかしよほどのことが無い限り、singleでも十分な結果を得ることができると思います。(;´∀`)

投稿: とうふ | 2011年5月 8日 (日) 22時35分

003版を使わせていただきました。
Clearタイプでも変化がわかるようになっていました。
いろいろと値を変化させて試してみたのですが、Absorption scaleをマイナスの値にすれば遠景になるほど明るくなるみたいですね。その場合はAbsorption colorは補色を指定しないといけないみたいです。
なかなか調整が難しいですが、もっといろんな表現ができるレンダラなんだと再認識できました。ありがとうございます。

投稿: Kotozone | 2011年5月12日 (木) 20時15分

Kotozoneさん、コメントありがとうございます。
検証ありがとうございます。Absorptionにマイナスの値を設定してもちゃんと動作するんですね。しかも予想通り、吸収と逆の効果が現れるとは・・・。使いようによってはかなり使える裏技かも知れません。(`・ω・´)

投稿: とうふ | 2011年5月13日 (金) 21時51分

コメントを書く



(ウェブ上には掲載しません)




« Realityでテレビを表現する | トップページ | LuxRenderのSPPMを使う »