投稿

ラベル(POV-Ray)が付いた投稿を表示しています

ラジオシティ

イメージ
どうやら、フォトンマッピングとラジオシティは計算が別なので、相互作用をシミュレートできないようだ… 実際、ラジオシティを有効にした状態でレンズがなくても、見た目が同じようになる。 レンズあり レンズ無し リファレンスマニュアルでは、これらを相互作用させる方法は見つけられなかった。つまり、POV-Rayではこれ以上どうしようもないということになる。 レイトレーシングについて色々調べていると、物理ベースレンダリングというものを見つけた。ツールとしては、LuxCoreRendarというものを見つけた。これについて調べてみようと思う。 下記は、ラジオシティの項の翻訳となる。 3.4.4.3 Radiosity 3.4.4.3.1 Radiosity Basics ラジオシティは、拡散相互反射をよりリアルに計算する手法です。この拡散相互反射は、青いカーペット、青い壁、青いカーテンの部屋に白い椅子を置くと、その現象を見ることができます。椅子は、部屋の椅子以外の場所から反射する光によって、青っぽくなります。その表面を光が直接照らしていなくても、完全に真っ黒な影にならないことに気づくでしょう。ほかの物体から反射してきた拡散光が影を塗りつぶします。レイトレーシングでは、これをシミュレートするのに「環境光」を用いますが、これは正確ではないです。 ラジオシティの計算は、global_settingの中に、radiosityブロックがある場合に行われます。 以下のセクションでは、ラジオシティがどのように働き、global_settingによってどのようにコントロールされ、品質とスピードのトレードオフについて説明します。 3.4.4.3.2 How Radiosity Works レイトレーシングは、シーン内で見えるそれぞれの点での光のレベルが、どれくらいかを示す事を課題としています。従来、レイトレーシングでは、以下の要素の和として分解できます。 拡散:物体側面を明るくする効果 スペキュラ:輝いている物体がキラキラする効果 反射:鏡のように反射する効果 アンビエント:あらゆるシーンが持つ一般的な全体の光で、影が真っ黒にならないようにしている Greg Wardの手法に基づくPOV-Rayのラジオシティは、最終項?を 近傍表面の状態とその明るさの順番に基づく明るさレベルに置き換えるものです(?...

フォトンマッピング

POV-Rayのフォトンマッピングでは、何が可能なのかを、下記を翻訳して確認することにした。 http://www.povray.org/documentation/3.7.0/r3_4.html#r3_4_4_4 結果として、そもそもこのフォトンマッピングには、反射と屈折しか定義がなく、散乱という概念がないことに気づいた。散乱による反射をシミュレートしているのは、ラジオシティのみと考えられるので、今度はラジオシティの項目を確認しようと思う。 今回訳したもののうち、冒頭部分を下記に記載する。 3.4.4.4 Photons Photonsによって、現実の反射や屈折のコースティクス(光の紋様や筋のこと)をレンダリングできます。フォトンマッピングは、Henrik Wann Jensenによってはじめて導入されました。 フォトンマッピングは、反射や屈折のコースティックを写実的にレンダリングする為の、前方レイトレーシング前処理?を用いる技術です。 フォトンマッピングは、光源から光のパケット(フォトン)をシーン内で発射することで機能しています。フォトンが、ターゲットとなっている物体を通った(あるいは跳ね返った)後に、ある物体にぶつかると、その衝突点がメモリに保存されます。このデータは、反射や屈折によって生じる光の量を計算するのに使用します。 3.4.4.4.2 Using Photon Mapping in Your Scene フォトンマッピングを使ってシーンを設計する場合、オブジェクトは2つのカテゴリに分けて考えるとよいです。一つは、コースティックが描かれる物体で、もう一つは、フォトンを屈折させたり、反射したりする物体がありあす。物体はどちらかに分類されるか、どちらにも属さない場合があります。 カテゴリ1:コーステックが現れる物体 デフォルトでは、すべての物体が、カテゴリ1になります。フォトンがカテゴリ1の物体にあたる度に保存され、その物体にコーステックを描くために使用されます。これはつまり、デフォルトでは、あらゆる物体の表面にコーステックを描くことができるということです。レンダリングを高速にするためには、物体をこのカテゴリから外しておくとよいです。やり方としては、photons{collect off}を追加しておけばよいです。この構文を使えば、コーステックがその物体に...

反射光と拡散光

イメージ
 前回まで、レンズによる結像を見てきたが、レンズを通過する光は光源からの光で、いわゆる透過光を見ているイメージなのだが、正反射光や拡散光も結像させたい。 実験系 反射光を見るために、下図のように赤色の鏡を45度の傾けて、横からスポット光を入れて撮像面に当てる形を作って実験した。 正反射光 finish{reflection 1.0} 正反射の場合、光源の色が見える。光もスポットとして見えており、正しく結像していると考えられる。 拡散光 finish処理なし 物体を鏡面でなくした状態にしたら、拡散光が得られるのか実験した。結果、真っ暗な像しか得られなかった。これは、フォトンマッピングのアルゴリズムとして、反射しない物体に到達すると、そこから再度放出されるフォトンが、ゼロになってしまう為と考えられる。 フォトンマッピングをWikipediaで調べると、拡散相互反射(diffuse interreflection)、表面下散乱(subsurface scattering)は、原理的には実現できるようだが、POV-Rayでどうやるのかがまだ分かっていない。 ちなみに、別のグローバルイルミネーションの方法として、ラジオシティがある。これをONにしたうえで、光源のrgb値を<500,500,500>などとすると、真っ黒ではない像が得られるが、像の形がおかしいうえに、結像位置がレンダリング毎に変わる。これは、拡散面からランダムに放射した光をとらえているからではと考える。ランダムな光だから、像の形もおかしくなると考える。ただ、像の色が赤であることから、素材の色がちゃんと見えている点だけは正しくシミュレートされている。 フォトンマッピングのパラメータをもう少し調べる必要がありそう。

レンズを置いてみる8

イメージ
 メニスカスレンズを置いてみる。 構成としては、撮像対象→凸凹メニスカス→両凹となる。凸凹は曲率がそれぞれ5.15,10といれている。当然ながらこれらのパラメータは、それらしい画像が得られる位置にしただけなので、計算等は全くしていない(ある意味シミュレータの良いところかもしれない… もちろん裏付けは必要だけどね)。両凹レンズは曲率10にしている。 どういうわけか歪みがなくなった。理屈が分からないことが増えてきたので、これ以上は、やっぱりレンズ光学を学ぶ必要がありそう。レンズ光学の基礎というドキュメントがダウンロードできたので、ちょっと見てみようと思う。

レンズを置いてみる7

イメージ
 凹レンズの挙動を確認した。 構成としては、撮像対象→両凸→両凹として、両凸を焦点距離の3倍の位置におき、その先に両凹を置いて1倍の像を結像しているが、凸レンズのみの時より歪曲しているように見える。 系全体を俯瞰してみた画像 この調子で、一通りレンズ系をそろえた上で、レンズ設計について勉強してみるのが良いかもしれない。今は、適当に置いているせいで、なぜこの配置で結像するのか考察できない。

レンズを置いてみる6

イメージ
 凸凹凸のトリプレットを再現できないかなと試行しているが、うまくいっていない。 トリプレットの前玉になっている平凸レンズを単体でおいてみると、下記のように歪曲が少なくなる。ただし、焦点距離は両凸レンズの2倍になる。 平凸のマクロは、以下の通り。 #macro lens_plano_convex(lens_radius,lens_curv1,lens_width,lens_res,lens_ior,position)     #local lens_cnt    = (lens_radius / lens_res);     #local lens_x      = 0.0;     #local lens_y      = 0.0;     #local lens_offset1 = sqrt(pow(lens_curv1,2) - pow(lens_radius,2));     #local cnt = 0;     lathe{ linear_spline         (lens_cnt + 2),         #while(cnt < lens_cnt)             #if( cnt < (lens_radius/lens_res))                 #local lens_y = sqrt(pow(lens_curv1,2) - pow(lens_x,2)) - lens_offset1 + (lens_width/2);                 <lens_x, lens_y>,                ...

レンズを置いてみる5

イメージ
 レンズを作るマクロと、焦点距離を計算するマクロを作成した。前回までは、エクセルで小数点以下5桁までの数字をコピペしていたため、球面が粗く、像に円形の線が現れていたが、POV-Rayマクロで計算しているので、精度が良い。 レンズを像面から焦点距離の2倍離して、撮像対象をレンズから焦点距離の2倍離した形にすれば、その映像は、等倍の撮像対象が見えるはず。光は、平行光を用いている。 レンズ無しの像。前回同様、片側の空いた格子を光源側に配置し、透過光観察している lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)*2>) ほぼ等倍に見えるが、線がボケているように見える。次に、焦点距離にレンズを置いてみる。焦点距離の場合、もっとも絞った光点が見えるはずだが、妙に大きい光点になっている。 lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)>) そこで、焦点距離に係数をかけて位置を微調整した。 lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)*0.955>) この係数を2倍した場合の像が以下になる。先ほどよりも等倍にみえ、ボケが少ないように見える。 lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)*0.955*2>) もっとも絞れる光点のサイズが、レンズの解像力を決めることを考えると、ボケが改善するのは納得する。像の歪曲・湾曲は相変わらず、すごい。単純レンズの収差が大きいのは当然といえば当然だ。ここまできたら、非球面レンズなどを再現してみて、収差や解像力を改善できるか検討してみたい。 マクロを以下に記載する。 #macro lens(lens_radius,lens_curv1,lens_curv2,lens_width,lens_res,lens_ior,position)     //#debug "\n Lens Calcuration \n"  ...

レンズを置いてみる4

イメージ
 下図のような構成を作り、どういう画面が見えるか確認した。 4x4のスクリーンとレンズの距離は、焦点距離の2倍をとっている。latticeは下図に示すような格子模様となる。図は、レンズを外して見たものとなる。4x4スクリーンに黒色で格子が表示されている。lensとlatticeの距離も焦点距離の2倍である。 レンズを挿入すると、下図のようになる。 すこしボケているのと、レンズの歪曲収差(糸巻型)が現れている。表示されている格子は、本来のサイズよりやや小さく表示されている。

レンズを置いてみる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という機能を導入したが、そうすると、ドーナツのようなもの...

レンズを置いてみる2

イメージ
前回の像は実は実像だったとわかった。チェッカーパターンを使ったのが間違いだった。チェッカーパターンの片側だけ赤色のブロックを置くと、ちゃんと反転していることが分かる。 ただ、見え方がちょっと違う。焦点距離の2倍の位置に物を置き、焦点距離の2倍の位置から観察した場合、実像の大きさは、物体と同じになる。しかし、実際のところ、大きく拡大されている。 interior{ior 1.5} interior{ior 1.0} 焦点距離で見ると、反転していない虚像になっている。   考えてみたが、下記のようなことが起こっているのかもしれない。 上の図では、locationからのびた光線を追跡すると、最終的には物体の頂点部分にたどり着く。ただ、光線が曲がらないことを前提としている場合、結果的に像の見え方は、点線で描いた矢印のように見えることになるのではないかと考える。 結局、レンズからの光をView screenに投影するというような、カメラと同じ動作ではないため、実像のような振る舞いをするが、実質的に虚像を見ているのではないかと考える。いずれにしても、光学系そのものをシミュレーションするのは難しいようだ…。

レイトレーシングでLED光を再現する

イメージ
たとえば、ロームのSML-E12UWを再現するとしたら、どのようにできるか考える。 ・波長は、624nm(typ.) ・光度は、85mcd(typ.) レイトレーシングにおいて、光の色は波長ではなく、RGBで指定している。波長からRGBへの変換は、等色関数を用いるhttps://ja.wikipedia.org/wiki/CIE_1931_%E8%89%B2%E7%A9%BA%E9%96%93 等色関数の数値データは、下記サイトのエクセルを用いた。 https://www.rit.edu/cos/colorscience/rc_useful_data.php 問題は、LEDのデータシートを見るとピーク波長しか記載されておらず、スペクトラム分布が不明という点である。スペクトラム分布が分からなければ、積分値を計算できず、ピーク値だけのrgb値しかでてこない。ピーク値だけだと、以下の値になる。 rgb <0.3654,0.0125,-0.0001> レイトレーシングにおいて、光の減衰はfade_distanceとfade_powerで設定する。これをLEDの光度から逆算する。まず、カンデラ[cd]という単位は照度[lx]x距離[m]の2乗であらわされる。ここで、照度の下限を0.1lx程度と決めたとすると、85mcdの光源が0.1lxになる距離は、√(85mcd / 0.1lx) =0.9mとなる。 周辺減光は、半値角からtightnessパラメータを設定する。70°で50%なので、tighntessはおよそ0.9あたりと考える(リファレンスマニュアルの3.4.4.1.2 Spotlightsの最後の図から目測で推定)。 上記をすべて入れた設定が以下となる。距離単位はmmと考えて、100mmの位置に光源を置いた。 light_source{<0,0,100> color rgb<0.3654,0.0125,-0.0001> spotlight radius 0 falloff 90 tightness 0.9 point_at <0,0,0>  fade_distance 900 fade_power 1} スペクトラム分布が分かれば、ちゃんとした色と輝度で見えるのだろうか…?引き続き調べていこうと思う。

レイトレーシングの光源

イメージ
 光源について調べていく。POV-Rayの主な光源は4種類で、点光源、スポット、シリンダ、平行光源である。 点光源(point lights) 1点から全方位に均一に光を放射する光源。点光源の場合、その照度は距離の二乗に反比例するはずだが、距離によって照度は変化しない。 light_source{<0,0,5> color rgb<1,1,1>} スポットライト(spotlights) 1点から円錐状に光を放射する光源。falloffはスポット光全体の円錐サイズを中心線との角度で指定していて、この角度より先は明るさが0となる。radiusはスポット光のうち明るい部分を中心線との角度で指定していて、この角度の範囲内は明るさが均一である。tightnessは、radiusで指定する光のスポットに対して指数関数的な減光を追加するもの。その計算式は、cos(Θ)^tightnessである。 このcos(Θ)は、光の入射角に対する特性に関係している。ある面に光が入射角度Θで入る場合、cosΘに比例してその光の照度が変化する。たとえば、真上から照射した場合は最大照度だが、真横から照射したら0になる。tightnessを指定すると、周辺に行くにしたがって減光する特性を指定することができる。また、radius=0、falloff=90とすれば、tightnessだけで減光を制御できる。 light_source{<0,0,5> color rgb<1,1,1> spotlight radius 10 falloff 20 tightness 0 point_at <-2.5,2.5,0> } シリンダーライト(Cylindrical lights) レーザーをシミュレートする光源。ほとんどスポットライトと同じだが、円錐形でなく円柱形であるという点が異なる。 light_source{<0,0,5> color rgb<1,1,1> cylinder radius 1 falloff 2 tightness 0 point_at <-2.5,2.5,0>} 平行光(parallel lights) 平行光の光源。拡散せずpoint_atに向かって平行な光が降り注いでいる状態。これと...

レンズを置いてみる

イメージ
 View screenの前にレンズを置くと、どういう見え方をするか確認した。半径10の曲率をもつ大きさ2、屈折率1.5のレンズを、latheを使って作り、平面のチェッカー画像に対して平行となるように配置した。 レンズの焦点距離は、下記サイトに記載の式より、おおまかにf = 1/(n-1)*(1/r1 + 1/r2)とすると、f=10となる。倍率1倍の実像を得るには、fの2倍の位置に物体を置き、fの2倍だけスクリーンをレンズから離せばよい。そこで、チェッカー平面(0,0,0)から、20離した場所にレンズを置き、40+directionの位置にlocationを置いた。 https://www.global-optosigma.com/jp/category/opt_d/opt_d08.html 結果が以下の通り。 下図はレンズの屈折率を1にして、下のチェッカーの絵を透過させたものだが、上図のレンズ越しに見える像は、反転していない(実像なら反転しているはず)。 つまり、虚像が見えていることになる。改めて、レイトレーシングのカメラとレンズの関係を図にして気づいたが、そもそも仕組み上、虚像しか見えないとわかる。レイトレーシングは、locationを出発点として光線を追跡していくので、locationを焦点とし、それより物体側の像(つまり虚像)の形をview screenに投影するため、どんなに頑張っても、虚像しか得られない。 この時点で、光学系を力技で再現する事は難しいとわかった。以降、光学系についてはあきらめて、物体に光が当たった時の見え方の再現性を確認していく事にする。

レイトレーシングにおけるカメラ5

イメージ
 これまでのところをまとめると、レイトレーシングにおけるカメラと現実のカメラの違いは以下となる。 ピンホールカメラとPerspectiveかめらは全く同じといえる。上の図では、異なるように見えるが、ピンホール位置をlocation、フィルム位置にView screenを持ってくると、ピンホールカメラと同じ構造であるとわかる。 orthgraphicカメラとテレセンレンズは光軸に対して光が平行(テレセントリック)であることが同じなので、orthgraphicは、理想的なテレセンレンズをシミュレートしているといえる。 fisheyeカメラは、fisheyeレンズそのものである。ただ、再現方法は、View screenを半球状にして、そこに対するレイトレーシングする形になる。 mesh_cameraのように、view screenの形状をメッシュで指定することで、任意のレンズを作り出すことが可能と考える。レンズ構成の情報からでは、最終的にどのような形になるか分からないので、カメラを使って撮像した画像から、収差の情報を抽出して、メッシュに変換することで、任意のレンズをシミュレートできるかもしれない。

レイトレーシングにおけるカメラ4

イメージ
 引き続き、カメラについて調査。 Focal Blur ぼけ(焦点深度)を再現する機能。リファレンスにはaperture keywordの後に記載するとある。焦点深度に深く関係するのはaperture(絞り)なので、「絞り」というキーワードがあってしかるべきではある。 絞りを開くと焦点深度は浅く(つまりボケが強くなる)、絞りを閉じていくと焦点深度が深く(つまりボケが少なくなる)なる。絞りの開き度合を表す数字としてf値がある。f値は、焦点距離を、絞りの開口のうち有効な部分の長さ(有効口径)で割ったもので、f値が小さいほど絞りが開いているのでボケやすい事になる。 ただ、リファレンスの注意書きどおり、apertureの値とf値は何の関係もない。apertureは、焦点の合う範囲を数値的に指定するだけ。数字を小さくすると焦点深度が深くなるとのことなので、f値とは真逆である。 blur_samplesは、数値が多いほど、滑らかなボケになるという記述がある。ある点にあたった光線が、焦点からのズレ分だけボケさせないといけないので、このサンプル数分だけ、ボケた結果できる「もやもや」を、描写しているということなのかな。 focal_pointは、焦点の合うポイントのことなので、そのまま。 箱をちょっとずつ前後にずらして配置したものをfocal blurで描画した。緑色の箱の天面にフォーカスを合わせている。 aperture 3 blur_samples 100 focal_point <0,0,2> ここまでのところで分かってきたのは、POV-Rayでは、カメラの挙動を疑似的にシミュレーションしているということである。歪曲収差は、メッシュ形状へのマッピング、焦点深度は、アンチエイリアス(図のように角部分をぼかしてギザギザをなくす手法)を応用しているように見える。

レイトレーシングにおけるカメラ3

イメージ
引き続きカメラについて調査。 mesh_camera 出力画像の光線の原点と方向を完全にコントロールするカメラで、画像のピクセルとmeshオブジェクトの面とを関連付ける仕組みらしい。デモファイルの中にあるmeshcam_macros.incで、レンズの歪曲収差をシミュレーションするマクロがあった。barrel distortionが凸型、pincushion distortionが凹型の歪曲収差をシミュレーションする。デモでは、メッシュをマクロによって自動生成し、それをメッシュカメラに適用して、レンズシミュレーションとして利用している。meshcam_persp_demo.povのuse_distortionの値を振った場合の画像は以下の通り。 use_distortion = 1.0 use_distortion = -1.0 distortionが1って、本来の物の寸法に対して倍のズレが起きているイメージなので、ちょっと非現実的な数値かも…。

レイトレーシングにおけるカメラ2

イメージ
 前回に続き、カメラについて調べていく。 カメラタイプの部分が、レンズを選択する部分となる。リファレンスマニュアルを読むと、以下のようなレンズがあるらしい。 perspective ピンホールカメラをシミュレーションしていると記載されている。ピンホールカメラは、焦点距離(穴から感光面までの距離)の長短では絵の拡大縮小しかしないので、前回の結果は納得の内容となる。レンズがないからね…。ピンホールカメラなら、焦点距離を伸ばしたら絵が大きく(そして高解像度)になる代わりに暗くなるわけだが、それは再現されていなさそうだ。おそらく露光時間という概念がないからだろうと思う。 レイトレーシングは、目から光線を追っていくという計算なので、レンズのないピンホールカメラのほうが、計算しやすいのかなと考える。 Orthographic 平行カメラ光線を使ってシーンを作ると記載されている。意味が分からないので、実際に使ってみた。前回のシーンファイルに対して、カメラタイプをorthographicにしたものが以下の画像となる。 何だこの黒いの?と思ったが、どうやら影らしい。光源が物体に近いところにあるので、影が大きく出てしまったので、光源をめちゃくちゃ遠くにして、実質的な平行光にする。すると下記にように、影のない四角だけになった。 light_source{<0,0,1000>color rgb<1,1,1>} これは、テレセントリックレンズっぽい。テレセンレンズはレンズ光軸に対して光線が平行になるような光学系(つまり歪曲収差がゼロのレンズ)なので、画像計測に使われるレンズだが、それに近い挙動をしている。 mesh_camera 出力画像の各ピクセルの光線の原点と方向を制御できるカメラタイプ。用途として、テクスチャベイクや照明計算に使えると記載されている。テクスチャベイクは、物体の形状によって生まれる影をあらかじめ計算して、模様のデータとして出力し、それをテクスチャのように張り付けることで、いちいちレイトレーシングしなくてもよくする手法のことらしい。 照明計算に使えるとあるが、これは気になるので、この機能は別途深堀する。 Fisheye 魚眼レンズのこと。物体に寄って撮影しても、周りの物体が見えてしまうほどの広角レンズ。パラメータ的には、angle=180度で...