【raytracing】Aperture、CurvedMirror、DielectricInterface、DielectricSlabの使い方[Python]

  • URLをコピーしました!

raytracing

前回、raytracingライブラリでThickLensを使ったThorlabsのレンズの再現方法を紹介しました。

今回はraytracingライブラリでAperture、CurvedMirror、DielectricInterface、DielectricSlabの使い方を紹介していきます。

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

Aperture

Aperture(アパーチャー)とは光学系の開口部やレンズの口径といった意味で、要するに光のサイズを制限するための穴のことを言います。

Apertureを設置するには「path.append()」の引数に「Aperture(diameter=直径)」を与えます。

from raytracing import *

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

実行結果

ASと書かれたところの下で、大体Y軸の値が10と-10のところに、二つの長方形が見えますが、これが設定したApertureです。

Apertureの直径を小さくするとそのApertureで通る光線のみが表示されます。

from raytracing import *

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

実行結果

CurvedMirror

CurvedMirrorはその名の通り、ある曲率をもったミラーです。

CurvedMirrorを設置するには「path.append()」の引数に「CurvedMirror(R=曲率)」を与えます。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(CurvedMirror(R=-5))
path.append(Space(d=20))
path.display()

実行結果

ミラーなのに図では反射している様には見えませんが、多分、ある曲率をもったミラーはレンズと同じ役割をするため、レンズに見立てて図示しているのだと思われます。

そのためレンズ以降のところは自分の頭の中で反射したものとしてイメージする方が良さそうです。

ちなみにある曲率をもったミラーはレンズと同じ役割をするため、焦点を持ちます。

そのため「Mirror.frontFocalLength()」や「Mirror.backFocalLength()」を焦点距離を知るために利用可能です。

from raytracing import *

Mirror = CurvedMirror(R=-5)

print(Mirror.frontFocalLength())
print(Mirror.backFocalLength())

実行結果
2.5
2.5

DielectricInterface

DielectricInterfaceは屈折率が変わる界面のことのようで、この界面を隔てて2つの屈折率の領域を作成することができます。

DielectricInterfaceを設置するには「path.append()」の引数に「DielectricInterface(n1=一つ目の領域の屈折率, n2=二つ目の領域の屈折率)」を与えます。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=10))
path.append(Space(d=20))
path.append(DielectricInterface(n1=1.0, n2=2.0))
path.append(Space(d=20))
path.display()

実行結果

Distanceの軸で30のところにある縦線が屈折率の海面です。

この位置で斜めの光線が、屈折率変化のため、折れ曲がっていることが分かります。

注意すべき点は「n1」は一つ前の領域の屈折率と合わせる必要があること、また最初の領域の屈折率は「1」と設定されていることです。

屈折率が合っていないとエラーとなります。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=10))
path.append(Space(d=20))
path.append(DielectricInterface(n1=2.0, n2=1.0))
path.append(Space(d=20))
path.display()

実行結果
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[16], line 7
      5 path.append(Lens(f=10))
      6 path.append(Space(d=20))
----> 7 path.append(DielectricInterface(n1=2.0, n2=1.0))
      8 path.append(Space(d=20))
      9 path.display()

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/raytracing/matrixgroup.py:79, in MatrixGroup.append(self, matrix)
     77         else:
     78             msg = "Mismatch of indices between last element and appended element"
---> 79             raise ValueError(msg)
     81 self.elements.append(matrix)
     82 transferMatrix = self.transferMatrix()

ValueError: Mismatch of indices between last element and appended element

ちゃんと合っていれば、複数設置することも可能です。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=10))
path.append(Space(d=15))
path.append(DielectricInterface(n1=1.0, n2=2.0))
path.append(Space(d=10))
path.append(DielectricInterface(n1=2.0, n2=3.0))
path.append(Space(d=20))
path.display()

実行結果

DielectricSlab

DielectricSlabはDielectricInterfaceと違ってある一定の厚さの屈折率の違う物質を設置する際に用います。

DielectricSlabを設置するには「path.append()」の引数に「DielectricSlab(n=屈折率, thickness=厚み)」を与えます。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=10))
path.append(Space(d=10))
path.append(DielectricSlab(n=1.5, thickness=20))
path.append(Space(d=20))
path.display()

実行結果

またDielectricSlabの引数に「diameter」を追加することで開口径を調整することもできます。

from raytracing import *

path = ImagingPath()
path.append(Space(d=10))
path.append(Lens(f=10))
path.append(Space(d=10))
path.append(DielectricSlab(n=1.5, thickness=20, diameter=10))
path.append(Space(d=20))
path.display()

実行結果

図の表示が変わってしまいましたが、同じ意味を示しています。

ただraytracingライブラリでは各レンズの直径を設定すると結構簡単に表示が変わってしまい厄介だったりします。

そこで次回は「objectRays」という光線の設定する関数を使って、同じ表示で光線追跡できる様にする方法を紹介します。

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

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

コメント

コメントする