BMS, Movie, Illustrations, Programming

ワイングラスとワインの間に空気の層を作るな【Blender】

この記事では、フォトリアリスティック系レンダリングにおいて、ワイングラスとワインの間に隙間を作る代わりに、ワイングラスとワインのジオメトリをわずかに重ねる方法を提案します。

Z-fighting

3DCG において、複数のオブジェクトが同一の位置を占有している場合、どちらがカメラに対して手前側にあるかという計算が安定せず、ギザギザや動画のチラつきなどが発生する場合があります。

これと類似の現象が、液体が入ったガラスのコップなどでも見られます。

一般的な対処法と問題点

これらを防ぐために、ガラスと液体の間に、わずかに隙間を作るという手法が 3DCG では一般的です。

しかし、場合によっては、それによって不自然な見た目になってしまう場合があります。

本来は、ガラスのコップに透明な液体を注いだ場合は、コップの表面いっぱいまで液体が見えているべきです。

このような誤ったレンダリング結果になってしまうのは、ガラスと液体の境界に挿入された空気の層で、光が全反射してしまっているからであると考えられます。

ガラスと水が接している場合は、ガラスと水の屈折率は近いので、光は直進に近い形で進行します。

この問題の解決方法

この問題を避けるために、グラスのジオメトリと水のジオメトリの間に隙間を作るのではなく、グラスのジオメトリと水のジオメトリがわずかに重なるようにします。

これにより、全反射の問題を避けることができます。

この方法では光の屈折回数が増えてしまうため、現実世界と完全に同じにはなりません。また、複数のオブジェクトが同じ空間を占有しているため、物理シミュレーションやリアルタイム系レンダラーなどで不具合が生じる可能性があります。

とは言うものの、他の例より良いレンダリング結果を得ることが出来ました。

ほとんど同じじゃない? と言われたらそれまでですが、私は、世界が少しでも良くなるように活動を続けています。

皆さんも、この方法を試してみてはいかがでしょうか。

Blend ファイルをダウンロード (cup_and_water_withouthdri.blend)

補足:複数の半透明オブジェクトが重なっている場合の屈折率

なお、Blender において、複数の半透明オブジェクトが重なっている場合は、それらの屈折率の重ね合わせになるようです。

(Blender において、マテリアルの屈折率は、本質的には相対屈折率であり、そのオブジェクトが他のどのオブジェクトに含まれているかに関係なく、入射角と屈折角の関係性を定義します。)

記事中の図表は Illustrator で作成しています。