【raytracing】LensとThickLensの使い方と焦点の取得方法[Python]

  • URLをコピーしました!

raytracing

前回、raytracingライブラリで光源の設定:サイズ、位置、角度、光源数、光線数の変更を紹介しました。

今回はraytracingライブラリでLensとThickLensの使い方と焦点の取得方法を紹介します。

それでは始めていきましょう。

Lens

Lensは非常に簡単にレンズを配置することができ、最低限としては焦点距離(f)を引数に与えるだけでレンズを配置出来ます。

つまり「Lens(f=焦点距離)」だけでレンズを作成することができます。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=10))
path.append(Space(d=20))
path.display()

実行結果

他に与えられる引数としては「diameter=直径」と「label=ラベル」があります。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=10, diameter=20, label="LABEL"))
path.append(Space(d=20))
path.display()

実行結果

またLensをprint関数で表示するとABCD行列が表示されます。

from raytracing import *

Lens = Lens(f=10, diameter=20)

print(Lens)

実行結果
|  1.000    0.000 |
|                 |
| -0.100    1.000 |
f=10.000

ここで焦点距離(f)が表示されますが、詳細は分かりません。

焦点距離を取得するには「Lens.effectiveFocalLengths()」、もしくは「Lens.focalDistances()」、フロント側の焦点距離を取得するには「Lens.frontFocalLength()」、バック側の焦点距離を取得するには「Lens.backFocalLengths()」を用います。

from raytracing import *

Lens = Lens(f=10, diameter=20)

print(Lens.effectiveFocalLengths())
print(Lens.focalDistances())
print(Lens.frontFocalLength())
print(Lens.backFocalLength())

実行結果
FocalLengths(f1=10.0, f2=10.0)
FocalLengths(f1=10.0, f2=10.0)
10.0
10.0

あとでも出てきますが、これで全部前後の焦点距離が出ている様に見えますが、実は「Lens.effectiveFocalLengths()」、「Lens.focalDistances()」のf1、f2は同じ値が表示されます。

そのため前後の焦点距離を知りたい場合は「Lens.frontFocalLengths()」と「Lens.backFocalLengths()」を用います。

Lens()を使った場合はレンズの形状が出てきませんが、「f」を正の数にすると両凸レンズに、「f」を負の数にすると両凹レンズになります。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=-10))
path.append(Space(d=20))
path.display()

実行結果

ThickLens

もう少し複雑なレンズを作成したい場合は、ThickLensを使います。

ThickLensでは「屈折率n」、「入射側の曲率R1」、「出射側の曲率R2」、「厚みthickness」を引数に与えます。

そのため「ThickLens(n=屈折率, R1=入射側の曲率, R2=出る射側の曲率, thickness=厚み)」とします。

ちなみにthicknessはレンズの中心、いわゆる一番厚い場所の厚みです。

from raytracing import *

path = ImagingPath()
path.append(Space(10))
path.append(ThickLens(n=1.5, R1=2.5, R2=-5, thickness=5))
path.append(Space(30))
path.display()

実行結果

ThickLensの場合はこの様にレンズの形状が表示されるので、光学系として分かりやすいです。

ThickLensでもprint関数でABCD行列が取得できますし、「Lens.effectiveFocalLengths()」と「Lens.focalDistances()」、「Lens.frontFocalLengths()」と「Lens.backFocalLengths()」を使うこともできます。

from raytracing import *

Lens = ThickLens(n=1.5, R1=2.5, R2=-5, thickness=5)

print(Lens)
print(Lens.effectiveFocalLengths())
print(Lens.focalDistances())
print(Lens.frontFocalLength())
print(Lens.backFocalLength())

実行結果
|  0.333    3.333 |
|                 |
| -0.233    0.667 |
f=4.286
FocalLengths(f1=4.285714285714285, f2=4.285714285714285)
FocalLengths(f1=4.285714285714285, f2=4.285714285714285)
2.8571428571428568
1.4285714285714288

このThickLensを使うと、両凸レンズや両凹レンズだけでなく、平凸レンズや平凹レンズを作成もできますし、メニスカスレンズを作ったりもできます。

平凸レンズや平凹レンズを作成するには、平にしたい方のRを大きな値、例えば1000とか10000とかにします。

from raytracing import *

path = ImagingPath()
path.append(Space(10))
path.append(ThickLens(n=1.5, R1=2.5, R2=1000, thickness=5))
path.append(Space(30))
path.display()
from raytracing import *

path = ImagingPath()
path.append(Space(10))
path.append(ThickLens(n=1.5, R1=-2.5, R2=1000, thickness=5))
path.append(Space(30))
path.display()

実行結果

メニスカスレンズを作成する場合は曲率を同じ方向にします。

from raytracing import *

path = ImagingPath()
path.append(Space(10))
path.append(ThickLens(n=1.5, R1=2.5, R2=1.5, thickness=5))
path.append(Space(30))
path.display()

実行結果

次回はこのThickLensを使ってThorlabsのレンズをいくつか作ってみましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次
  1. raytracing
  2. Lens
  3. ThickLens