レンズを置いてみる3

 フォトンマッピングという機能があり、これを使うと光の集光を正確にシミュレートできるとリファレンスマニュアルに記載があったので、中身を確認した。

マニュアルには、屈折や反射のコースティック(ガラスコップに光が透過すると、光が集光したり散乱したりしてできる光の模様)をリアルにレンダリングできる機能とあり、ミラーが反射し、レンズがフォーカスするとあった。

仕組みとしては、フォトン(光の粒みたいなもの)を発射して、それが物体から反射したり透過した結果、どこかにぶつかったら、そのぶつかった場所にフォトンが当たった事を記憶しておいて、最終的に何個のフォトンが当たったかで、その場所の光の量を決定する。

なので、レンズなら、焦点に向かって大量のフォトンがぶつかるので、中心の一点が明るくなり、そこから離れると暗くなるはずである。

POV-Rayでは、コースティックが投影される物質(カテゴリ1)と、コースティックを出す原因となる物質や光源(カテゴリ2)がある。

カテゴリ1は、特に何もしなくても自動的になる。投影されないようにするには、photons {collect off}をオブジェクトに追加て、フォトンを収集しないようにする。カテゴリ2は、photons {target}を追加する事で、ここを通過・反射した光は、カテゴリ1の物質にぶつかると、その物質にぶつかったことが記録されるようになる。

フォトンマッピングを使うには、グローバルセッティングでphotonsを指定する必要がある。必要なパラメータは以下の通り。

spacing あるいは count

フォトンをカウントする物体面上の間隔(spacing)か、放射するフォトンの数(count)のどちらかは必ず指定する必要がある。spacingは数値を下げると細かくなるのでフォトンの数が増える。countは、数字を上げるほど細かくなる。

autostop 

フォトンは通常、カテゴリ2の中心から外側に向かって、スパイラル状に放射される。その放射は境界ボックス(カテゴリ2の物体を囲むような箱状の境界線)全体を覆うまでスパイラルが広がり続けるが、境界ボックスより物体が小さくて、スパイラルが1回転しても何にも当たらない状況なら、そこで放射を止めたい。そこでautostopという機能を導入したが、そうすると、ドーナツのようなものは中央に何もないので、いきなり止まってしまう。

そこで、スパイラル放射の衝突がある閾値を超えた後に、衝突が起きなくなったら停止する仕組みを入れた。その閾値は境界ボックスの0~100%(指定値は0~1)となる。autostop 0という指定は、スパイラル1回転分の放射でフォトンが1個でも当たったら、そこから1回転しても1個も当たらなくない状況になるまで止まらない。

これのパラメータを調整しないといけない場面は、複数の抜けのある輪のようなフォトン放射を止めてしまいかねない物体の場合のみである。したがって、通常はautostop 0を指定する。

今回は下記設定で試した。

global_settings {
  photons {
    spacing 0.01
    autostop 0
  }
}

下図は、平行光を上から照射し、曲率10、半径2のレンズをチェッカー模様の平面に対して、光点の収束がもっとも小さい点となる位置(つまり焦点距離)、焦点距離の2倍、および3倍においたもの。カメラは斜め横から見ている。

translate <0,0,8.85>

translate <0,0,17.7>

translate <0,0,26.5>

最初の図は、1点に集光しており、焦点距離の2倍ではちょうどレンズぴったりのサイズで集光し、焦点距離の3倍では、光はレンズよりも大きく集光している。

結果として、レンズの集光については、正確に表現できているといえる。つまり、いまチェッカー模様の平面のところを白色の面にして、カメラをレンズより平面寄りにおいたら、光学系とカメラの撮像センサーに投影される像をシミュレーションできるかもしれない。試しにその位置で見てみると、それらしい絵が得られた。


レンズが粗い(latheのlinear_splineで作っているため)ので、線が見えるが、滑らかにすればそれも見えなくなると考える。

コメント

このブログの人気の投稿

LuxCoreRenderを使ってみる

BlenderでLuxCoreRenderを使う

レンズを置いてみる2