SSブログ

厳密な光線追跡 - その9 [光線追跡エンジンを作る]

前回一般的な姿勢の面と光線との交点を求める問題を、光線を逆方向に姿勢を変換して一番簡単な面の姿勢での問題にすることを提案した。一般の2次曲面や非球面はこうしないと解くのが難しいが、平面球面にとっては計算効率的には完全に不利。しかし統一的に扱うことができて簡単になる。

今日は光線追跡の眼目、屈折光線の計算について。成分にわけないベクトル表現のままの屈折の定式化は一般化しやすいので便利。

3.4  Snellの法則のベクトル表現

光線が面に到達したあと、次にその面での屈折を計算することになる。

Snellの法則をベクトル形式で書き表すやり方はいろいろある。ここでは僕が昔から使っている、数値計算と比較的相性のいい方法をまとめておく。

図-4のように、入射側の光線の伝播方向をri、屈折光線の伝播方向をroとし、入射側の媒質の屈折率の実部をni、面の向こう側の屈折率の実部をnoとする。
1008fig04.png
図-4では下から上に向かって光が伝播している。

このとき、光線の伝播方向ベクトルは特殊な規格化
1008eq41.png
がなされているとする。つまり、伝播方向ベクトルの長さは屈折率(の実数部)のに一致させておく。こうすることで後の計算がちょっとだけ楽になる。吸収性媒質の場合は屈折率の実部だけを取るようにする。虚数部は光線の伝播方向にはきかない。
Snellの法則
1008eq42.png
から
1008eq43.png
であることはあきらかであるが、このままでは使えない。 roに関して陽なかたちにしたい(もちろん式-43を成分にわけて解いても以下と同じ結論が得られるが、式の変形がけっこう大変)。

そこでちょっと工夫して
1008eq43a.png
なので、
1008eq44.png
としてみる。これが成り立つことは図-4をみればわかる。
この式は
1008eq45.png
とできる。ここでa ·bはベクトルabの内積である。

屈折光線の方向ベクトルは屈折率の値とベクトル演算だけで表すことができて、しかも割り算が計算途中にあらわれない(0での割り算のチェックをする必要がない)。式-41の規格化をすることでちょっと簡単になったということである。

このとき式中の平方根の中身jr
1008eq46.png
が負になる場合は屈折光線が無く、全反射となる。

ここで、式-45は法線ベクトルnriと境界面の同じ媒質の方を向いていないといけない。面の式-2をそのように制限してもいいが、屈折光線を計算する際に向きを一致させるというひと手間をかけた方がいい(内積をとって負なら法線ベクトルを反転させる)。そうすれば逆追跡も変更無しにできるし、逆追跡ができれば迷光追跡も楽になる。

これでSnellの法則から入射光線の方向ベクトルが与えられたときの屈折光線を得ることができた。Snellの法則は入射面という平面上に両方の光線が乗っているので、図-4でもそれを前提に書いているが、ベクトルで書けば座標の取り方によらなくなるので、これをそのままプログラムすれば一般の面に勝手な方向から来た光線の屈折を計算できることになる。

3.4.1  反射の場合

反射の場合は反射光線の伝播ベクトルをriとすると、図-5から、
1008fig05.png
1008eq47.png
である。ここでもnは正規化されていて、入射ベクトルと同じ方向を向いているとする。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立10/08献立10/09 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。