投稿

ラベル(レイトレーシング)が付いた投稿を表示しています

BlenderでLuxCoreRenderを使う

イメージ
 ポリゴンの生成は思いのほか技術が必要だったので、BlenderとLuxCoreRenderを使いながら、シミュレーションができるようになる方向で進めようと思う。 BlenderでLuxCoreRenderを使う方法は、以下の通り。 ・LuxCoreRenderのBlendLuxCoreをダウンロードする。 ・Blenderのメニューから、「編集」→「プリファレンス」をおし、左のメニューから「アドオン」を選んで、右上の「インストール」を押して、ダウンロードしてきたZIPファイルを選択すると、自動でインストールが完了する。 ・レンダープロパティ(カメラみたいなアイコン)を押して、レンダーエンジンをLuxCoreに変える。 ・適当なオブジェクトを配置したら、マテリアルプロパティ(下から二番目の赤いアイコン)でマテリアルを追加する。 ・シェーダーエディタ(前はノードエディタと呼んでいたらしい)を起動する。起動方法は、Blenderの画面左上のビューと書かれたところの左にあるアイコン(エディタータイプというやつ)を押し、「3Dビューポイント」から「シェーダーエディタ」にする。 ・マテリアルプロパティのShow Nodesを押す。初期は、Matte Materialがアクティブな状態になっている。マテリアルプロパティのNode Tree Presetsから、必要なマテリアルを選択すると、選択したものが追加され、追加した方がアクティブな状態になる。 ・初期状態では、環境光として「背景」が設定されているので、必要に応じて変えておく。「なし」にしておけば、設定した光源のみになる。下図は、HDRIという設定を使用した。設定は、ワールドプロパティ(オブジェクトプロパティの一つ上にある赤色のアイコン)を押すと設定がでてくる。 ・画像フォーマットやサイズは、出力プロパティで設定する。 ・レンダリングは、メニューの「レンダー」→「画像をレンダリング」を選択するか、F12を押す。レンダリングウインドウが表示され、延々とレンダリングが進む。止める場合は、ESCを押す。 ・ファイル保存は、レンダー画面の「画像」→「名前を付けて保存」で保存できる。 下記は、試しにレンダリングした画像。たいして設定はしていないが、かなりリアルな画像を生成できた。 User's manualも読み込みつつ、少し...

LuxCoreRenderで光源をスペクトルで指定する方法

イメージ
 LuxCoreRenderは、テクスチャを使って光源のスペクトル指定をする。 テクスチャの指定方法は、次の3つがある。 ・黒体温度(blackbody) 色温度を指定する方法。たとえば、電球色なら色温度3000Kくらいで、白昼色なら、色温度5000Kくらいとなる。主な色温度として以下が紹介されている。 Candles (1850K) Incandescent (2700) Halogen (3000K) Fluorescent (4200) The sun (5000-6500K) シーン例: scene.textures.lighttex.type = blackbody scene.textures.lighttex.temperature = 3000 scene.textures.lighttex.normalize = 1 scene.materials.whitelight.emission = lighttex scene.materials.whitelight.emission.gain = 120.0 120.0 120.0 色温度3000Kなので、電球色となる。normalize(正規化)をonにしてemission.gainで光量を設定すると、得たい光量通りの明るさになる。 ・スペクトル(irregulardata) スペクトル波長(wavelength)と強度(data)の列で指定する。 シーン例: scene.textures.lighttex.type = irregulardata scene.textures.lighttex.wavelengths = 536 560 576 scene.textures.lighttex.data = 0.0001 0.1 0.0001 scene.materials.whitelight.emission = lighttex 536nm~576nmの広がりを持ち、560nmをピークとした。やや黄色がかった緑色の光になる。シーンでは、赤い箱はやや暗めに描画されている。これは、赤が反射できるスペクトル成分量が少ないためと考えられる。後ろの青い壁は、完全に真っ黒なのは、青色のスペクトルを一切持っていない為である。ちなみに、こちらの場合、gainを設定せず、dataの強度をそのまま使用して...

LuxCoreRenderを使ってみる2

イメージ
 simple.scnをいじりながら、何ができるかの挙動を確認した。 カメラの座標 カメラの座標を下記のようにすると、エラーがでる。 scene.camera.lookat.orig = 0.0 0.0 10.0 scene.camera.lookat.target = 0.0 0.0 1.0 エラーの内容: Singular matrix in MatrixInvert: -nan(ind) -nan(ind) -nan(ind) 0 -nan(ind) -nan(ind) -nan(ind) 0 0 0 -1 0 0 0 10 1 singular matrixというものが、非正則行列と呼ばれるもので、MatrixInvertというのが、逆行列の算出だとすると、逆行列を計算しようとしている行列が正則行列でないということと考える。今回の場合は、行列要素にnanが入っていて計算できないようで、nanの部分には、カメラ座標を基に算出されると考える。nanとして考えらえる値は「無限大」くらいしか思いつかないので、1/0を計算する事態になったと考える。 今のところ、origとtargetの座標が同一ベクトルの場合、上記エラーが出ることが分かっている。たとえば、下記なら問題ない。 scene.camera.lookat.orig = 0.0 -10.0 2.0 scene.camera.lookat.target = 0.0 0.0 2.0 マテリアル scene.materials.redmatte.type = glossytranslucent scene.materials.redmatte.kd = 0.5 0.0 0.0 scene.materials.redmatte.kt = 0.5 0.0 0.0 scene.materials.redmatte.ks = 0.5 0.0 0.0 scene.materials.redmatte.ks_bf = 0.5 0.0 0.0 scene.materials.greenmatte.type = metal2 変形 平行移動はできないことが分かっている。 scene.objects.box2.transformation = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 scene.obje...

LuxCoreRenderを使ってみる

イメージ
まずはレンダリング 下記より、スタンドアロンとAPI SDKをダウンロードする。 https://luxcorerender.org/download/ それぞれ適当なフォルダに展開する(私の場合Cドライブ直下に置いた)。スタンドアロンのフォルダにある、luxcoreui.exe を実行する。出てきたウインドウのRendering→Loadを選択して、SDKのフォルダにあるscenesの下にあるフォルダの中から、適当なcfgファイルを選択すると、レンダリングが開始する。下の画像は、scenes/simple/simple.cfgを選択した場合の画像である。 最初ノイズまみれな画像から、だんだんときれいになっていく様子を見ることができる。ずっとレンダリングし続けるので、止める場合は、Rendering→Pauseを選択する。再開するときは、Rendering→Resumeを押す。 上のウインドウとは別で表示されているコンソールに、以下のようなものが出力され続けるのだが、どうやら処理を進めることで、ノイズが少なくなるということらしい。 [LuxCore][31.734] Noise estimation: first pass [LuxCore][59.578] Noise estimation: Error mean = 0.00993405 [LuxCore][101.531] Noise estimation: Error mean = 0.00612393 [LuxCore][142.218] Noise estimation: Error mean = 0.00357345 [LuxCore][180.250] Noise estimation: Error mean = 0.00257599 [LuxCore][218.015] Noise estimation: Error mean = 0.00201924 [LuxCore][258.171] Noise estimation: Error mean = 0.00166048 [LuxCore][301.125] Noise estimation: Error mean = 0.00140384 [LuxCore][339.734] Noise estimation: Error mean = 0.00...

ラジオシティ

イメージ
どうやら、フォトンマッピングとラジオシティは計算が別なので、相互作用をシミュレートできないようだ… 実際、ラジオシティを有効にした状態でレンズがなくても、見た目が同じようになる。 レンズあり レンズ無し リファレンスマニュアルでは、これらを相互作用させる方法は見つけられなかった。つまり、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に向かって平行な光が降り注いでいる状態。これと...