SSブログ

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

前回からMathematicaに実装する光線追跡エンジンのおおまかなオブジェクト設計を始めた。あまりCodeVやZemaxなんかの概念を引きずらないで、プログラミングのしやすさを前提に考えることにした。

というかまあ、そういう姿勢はいつもの通りで、自分のやり方に素直なほうがきれいに書けるし、とちゅうでいやになりにくい。もちろんそういうやりかたが失敗することもよくあるけど。

4.2.2  媒質オブジェクト

媒質オブジェクトは屈折率を分散に従って計算するだけである。波長は光線オブジェクトが保持しているので、追跡が実際に始まって光線が与えられてから屈折率を計算することになる。

屈折率の分散はいろいろな与え方ができるようにするのがいい。一般的なSellmierの分散式はそれほど計算量は多くないけど、表として与えられているときには内挿する必要がある。したがって媒質オブジェクトは波長に対する屈折率の値をキャッシュすると効率が上がる。

したがって、同じ媒質を表すオブジェクトはひとつだけにするのがいい。普通の光学系では同じ種類のガラスを複数枚のレンズに使うことがあるが、それらをレンズごとに定義するのではなく、ひとつのオブジェクトを使い回すようにするのがいい。Mathematicaではちょっとした工夫が必要である。

4.2.3  光線オブジェクト

光線オブジェクトは光線の属性を保持するだけである。ひとつの媒質中にひとつの光線オブジェクトが対応して、媒質を経るごとに違う光線オブジェクトでその内部の光線を表現する。一本の光線は光線オブジェクトのリストになる。

光線オブジェクトは、少なくとも光線の
  1. 始点ベクトル
  2. 方向ベクトル(屈折率規格化)
  3. 波長
  4. 偏光方向
  5. 強度
を保持する。終点はリストの次の光線の始点なので省略する(計算効率のためにはあった方がいいかもしれない)。

一つの光線オブジェクトは一つの媒質のみの中にあるので、光路長の計算効率のためには屈折率も持っていた方がいいかもしれない。とりあえずは最低限のみ保持することにする。

例えば像面に達した、あるいはバッフルに達した、あるいは全反射を起こした、などで追跡がそこで止まる場合、それ以上進まないので光線は存在しないが、到達点を保持するために「停止光線オブジェクト」を光線オブジェクトとは別に用意する。

停止光線オブジェクトは光線オブジェクトの属性の他に
  1. 停止原因
を追加保持することにする。

4.2.4  面オブジェクト

面オブジェクトの仕事としては
  1. 形状を保持する
  2. 光線オブジェクトが与えられると
    1. 面との交点を計算する
      • 交点がなければvignetteがおこったとして追跡をやめる
    2. 交点での屈折角を計算する
      • 全反射がおこればやはり追跡をやめる
    3. 屈折後の光線オブジェクトを生成する
  3. 屈折後の光線オブジェクトを返す
ということをすればいい。面は自分自身が座標原点にいるとして計算を行う。
形状は、計算効率から
  • 平面
  • 球面
  • 2次曲面
  • 非球面
  • 一般の連続面
に分類して、それぞれに対して交点計算と屈折角計算のルーチンを用意しておく。

不連続面はとりあえず扱わない。不連続面を許容するとFindRootなどの関数が使えない。収束しない可能性があるためである。

4.2.5  バウンダリオブジェクト

面オブジェクトは自分が座標原点にいるとみなして計算する。実際の位置や姿勢はこのバウンダリオブジェクトが光線を変換し、面オブジェクトが返してきた屈折光線をもとの座標に戻すということをする。つまりワンクッション置くということ。

バウンダリオブジェクトは面と、その位置と姿勢を保持ししている、ということになる。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

献立11/18献立11/19 ブログトップ

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