投稿

12月, 2020の投稿を表示しています

レイトレーシングの光源

イメージ
 光源について調べていく。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度で...

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

イメージ
POV-Ray v3.7をインストールして、さっそく触ってみた。 今回知りたいことは、カメラについてのパラメータが、本来のカメラにおける何に相当するのか、である。カメラ部分のコードは下記の通り。 camera {   perspective   location <0,0,10>   direction <0,0,1>   right <1.33,0,0>   up <0,1,0>   sky <0,0,0>   look_at <0,0,0> } perspective カメラタイプを指定するらしい。言葉の意味は、遠近法のことを指している。 location 文字通り、カメラの空間上の位置を示している。 look_at これも文字通り、カメラの向きを示している。視点を向ける座標を指定する形になっている。 sky 突然の空。さらにバンク角を座標指定するという分かり難さ。locationの位置と指定する座標を結んだ線に沿ってカメラが傾く動きをする。この3つのパラメータによってカメラの姿勢を制御できることが分かった。それにしても、なんでsky? rightとup view screenの比率を決めるパラメータ。View screenというのが、出来上がる絵のアスペクト比になる。このView screenというのが、カメラでいうところのフィルムサイズの比、あるいはセンサーサイズの比になるというイメージ、なのかな…。デフォルトはright=<1.33,0,0>,up=<0,1,0>で、4:3の比率になっている。画面に出てくる画素数を数えると、512 x 384pixelだったので、20万画素くらいだから、一昔毎前のWebカメラのイメージだろうか。 direction 説明が不可解なのだが、look_atで動く前のカメラの向きを示すらしい。意味はよくわからない。また、その長さは、カメラのlocationとview screenとの間の距離を指定するものらしい。つまり、これが焦点距離を表している事になる。長さを短くすると焦点距離が短く(つまり引いたような広角の画像になる)長さを長くすると焦点距離が長く(つまり望遠のよ...

撮像シミュレータがほしい

光の当て方やレンズによって、カメラでの撮影(物撮りとか検査装置のイメージ)結果に、どういう違いがでるのかシミュレーションしてみたいなぁと思ったのだが、これといったソフト(フリーが良いなぁ)を見つけられなかったので、自分で作ってみるかと思い立ち、記録を残す為にブログを始めた。 思い描いている内容 対象(材質、色、形状など)、照明(色、強度、スペクトル、設置位置など)、レンズ(構成と絞り)、カメラ(センササイズ、分光感度特性)のパラメータにしたがって、どのような撮像になるかをシミュレーションするものを作りたい。 レイトレーシングという方法が、もっとも現実に近い表現が可能なコンピュータグラフィック手法だから、それを使えばできるかなと考えているのと、リアルタイムにレンダリングできたら、カッコいいなぁと思っている。 実現に向けてやってみること ①レイトレーシングを理解する A)POV-RAYというソフトがフリーであるので、どういうものか学んでみる。これですべて実現できたらラッキー。 B)Ray Tracing in One Weekendという教科書がフリーで手に入るらしいので、理論的なところをコーディングしながら学んでみる。 ②リアルタイムレイトレーシングをやるには、対応するGPUが必要らしい(GeForce RTX 20 シリーズと言うらしい)ので、それが可能なPCを用意する(いつになるかはわからないが)。 ③リアルタイムレイトレーシングを実装するには、DirectXを理解する必要があるらしい(DirectX Raytracing (DXR)というらしい)ので、どこか学ぶ先を探す。 ②、③は、ただやってみたいだけ・・・ 自分の現状 ・約20年前、PASCALで書かれたレイトレーシングの教科書を読んだことがあるが、記憶の彼方。 ・プログラミング経験は、C、C++、Pythonをたしなむ程度。 ・開発環境は、中古のDynabook1台だけ。 ・カメラ歴は長いが、知識は浅い