Upload
danglien
View
215
Download
1
Embed Size (px)
Citation preview
ZEMAX用 NagataパッチDLL
マニュアル
Volume-CADプロジェクト
c© Copyright by RIKEN All Rights Reserved
作成日 : 平成 23年 1月 26日作成者 : 西舘 陽平 ( )
ii 目次
目次
1. Nagataパッチ DLLの目的 1
2. Nagataパッチについて 1
3. VObj入力形式 23. 1. 頂点座標 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23. 2. 法線 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23. 3. 三角形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
4. DLLの使用準備 34. 1. Sequencialモード用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34. 2. Non-Sequencialモード用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
5. Sequencial光線追跡チュートリアル (単レンズ問題) 4
6. Non-Sequencial光線追跡チュートリアル (反射光学系問題) 13
7. Non-Sequencial光線追跡チュートリアル 2 (単レンズ問題) 22
8. Non-Sequencial光線追跡チュートリアル 3 (ミラー/レンズ複合問題) 29
9. Nagataパッチ DLLの注意点 409. 1. Sequencialと Non-Sequencialプラグイン共通 . . . . . . . . . . . . . . . . . . . . . . . . . . 409. 2. Sequencialプラグイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419. 3. Non-Sequencialプラグイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
目次 iii
CreditNagata patch plugin for ZEMAX is based in part on the work of the FLTK project (http://www.fltk.org).
2. NAGATAパッチについて 1
1. NagataパッチDLLの目的光学系の設計において、レンズ/ミラー形状が関数形式で与えられていることがありますが、成形後には
熱変形で関数形式と異なる形状になるため、そのままの面表現で光線追跡計算をするとその結果は成形されたレンズでの光線経路と異なります。局所ごとに変形量が異なる一般的な成形レンズ/ミラー面を表現するには、グローバル座標の関数形式はパラメータが少なすぎるため適しません。Nagataパッチ形式は頂点、頂点の法線 (複数可)、頂点の接続情報 (三角形)から、頂点を通り曲率が最小になるような滑らかな面 (C0連続)を作ります (図 1)。作成後のレンズ等の実測点群データ、もしくは成形シミュレーション結果を使いレンズ面を表現することで、光線追跡計算をより現実的なものにすることができます。ZEMAXには、SequencialとNon-sequencialモードがあり、それぞれのモードに対応するDLLがあります。一般的に、追跡する光線が通るレンズ/ミラー面の順番が、1通りで固定されているような場合は Sequencialモード、そうでない場合は Non-sequencialモードを使います。
2. NagataパッチについてNagataパッチは頂点とそこでの法線ベクトル、頂点の接続情報 (三角形メッシュ)を与えると、それぞれ
の三角形内のローカル座標に関する 2次補間を作ります。Nagataパッチには他の曲面パッチと比較し、以下の利点があります。
• それぞれの頂点に、その頂点を参照する三角形と同じ数の法線ベクトルを与えることができる。つまり、表面の欠陥のような、面上の折れ曲がりを自然に表現できる。
• 隣接パッチ間で面が破れないことが数学的に保証されている。
• 光線との交差が解析式で求められるため、繰り返し解法で有り得る交差計算が収束しないということが起こる心配が無い。
• 通常の三角形メッシュでも与えられる頂点での法線を使って、簡単に作ることができる。
• 計算量が少ない。
Nagataパッチについては論文1、Nagataパッチを使った光線追跡については論文2に詳しく書いてあります。線形補間を使った場合に比べ、圧倒的に少ないパッチ数でスポット半径が収束することがわかっています。
(a)線形補間パッチ (b) Nagataパッチ
図 1: それぞれ線形補間パッチ、Nagataパッチを使った場合の面の再構築。
1T. Nagata, “Simple local interpolation of surfaces using normal vectors,” Comput. Aided Geom. Des. 22, 327–347 (2005).2S. Morita, Y. Nishidate, T. Nagata, Y. Yamagata, and C. Teodosiu, “Ray-tracing simulation method using piecewise quadratic inter-
polant for aspheric optical systems,” Appl. Opt 49, 3442–3451 (2010).
2 3. VOBJ入力形式
3. VObj入力形式NagataパッチDLLには、三角形メッシュの情報を外部ファイル入力として与えます。形式はVObjです。
VObjはWavefront Objとほぼ同じ形式で以下のキーワードから成り立ちます。
3. 1. 頂点座標
v x y z
vはキーワードで、以降は頂点の x, y, z座標です。
3. 2. 法線
vn nx ny nz
vnはキーワードで、以降は法線の x, y, z成分です。
3. 3. 三角形
f v1//vn1 v2//vn2 v3//vn3
f は面を記述するためのキーワードで、viは頂点 iのインデクス、vniは法線 iのインデクス。Wavefront ObjはN 角形を使用できますが、VObjは三角形のみです。
シンプルな三角形の記述例
# コメントv 0.0 0.0 0.0v 1.0 0.0 0.0v 1.0 1.0 0.0
vn 0.0 0.0 1.0
f 1//1 2//1 3//1
より実用的な例は、DLLと一緒に配布されているチュートリアル用レンズ面ファイル”lens-1.vobj”や”lens-2.vobj”を参照してください。
4. DLLの使用準備 3
4. DLLの使用準備32bitと 64bitの DLLがあります、インストールした ZEMAXがどちらか確認してください。
4. 1. Sequencialモード用
32bit版の場合NagataPatch win32.dll、64bit版の場合NagataPatch win64.dllを、ZEMAXのユーザ定義面DLLフォルダ (例:C:\Program Files\ZEMAX\DLL\Surfaces)へコピーし、名前をNagataPatch.dllに変更してください。これで Sequencialモードで Nagataパッチ面 DLLが使用できます。
4. 2. Non-Sequencialモード用
反射オブジェクトと屈折オブジェクトで別々の DLLがあります。32bit版の場合 UDO NagPatch refract win32.dllと UDO NagPatch reflect win32.dll、64bit版の場合 UDO NagPatch refract win64.dllと UDO NagPatch reflect win64.dllを、ZEMAXのユーザ定義オブジェクト DLLフォルダ (例:C:\Program Files\ZEMAX\DLL\Objects)へコピーし、名前をそれぞれ UDO NagPatch refract.dllと UDO NagPatch reflect.dllに変更してください。これで Non-Sequencialモードで Nagataパッチ定義オブジェクト DLLが使用できます。
4 5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題)
5. Sequencial光線追跡チュートリアル (単レンズ問題)問題概要SequencialモードのNagataパッチプラグインの使い方を学ぶために、DLLを使って簡単な問題を解いてみます。例は、入射平行光を 1点に収束させる非球面単レンズの問題です (図 2)。レンズ面は 2つあり、一つは平面でもう一つは非球面です。非球面は式
z(r) =r2/R
1 +√
1− (k + 1) r2/R2(1)
で定義し、パラメータはR = −1.838992mm, k = −2.550409で、レンズの半径は 2.1mmです。どちらの面も、いくつかの点でサンプリングし、離散点とそこでの法線ベクトル、接続情報を VObj形式で与えます。
図 2: 入射光線 (赤い線)を像面 z = 6.5203896097mmに収束させる無収差単レンズ。レンズは中心の厚みが3.44mm。屈折率は空気中で n1 = 1.0、レンズ内で n2 = 1.597。
1. ZEMAXを起動後、Lens Data Editorで一つ目のレンズ面 (STO)を選び、左上のメニューから “Edit ⇒ Surface Type”を選んでください。(下の図が手順を表しています)
5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題) 5
2. Surface Typeは”User Defined”を選んでください。
3. Surface DLLは”NAGATAPATCH.DLL”を選んでください。
6 5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題)
4. ここで VObjの入力を選ぶためのファイルダイアログが出ます。平面をサンプリング (173点, 301三角形)した”lens-1.vobj”を選び”OK”を押してください。読み込みが成功すると、読み込まれた面のx = 0,y = 0での z座標が”lens 1 center z=0.000...”のように出ます。”OK”を押してください。
5. もう一つ Nagataパッチのレンズ面を作ります。Lens Data Editorで一つ目のレンズ面 (STO)を選び、左上のメニューから “Edit ⇒ Insert After”を選んでください。
5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題) 7
6. Lens Data Editorで、新しくできたレンズ面 (2)を選び、左上のメニューから “Edit ⇒ Surface Type”を選んでください。
7. 1つ目のレンズ面 (STO)と同様、Surface Typeは”User Defined”、Surface DLLは”NAGATAPATCH.DLL”を選んでください。ファイルダイアログでは非球面をサンプリング (847点, 1592三角形)した”lens-2.vobj”を選び”OK”を押してください。
8 5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題)
8. レンズ面と像面の z 方向位置を Thicknessによって与えます。一つ目のレンズ面 (STO)の Thicknessに”3.44”、二つ目のレンズ面 (2)の Thicknessに”3.0803886097”、と入力してください。二つ目のレンズ面 (2)の ThicknessはVariableにしてMerit Functionを与えて、後にOptimizationで求めても良いかもしれません。
9. レンズの屈折率を与えます。一つ目のレンズ面 (STO)のGlassをダブルクリックし、出てきたウィンドウの Solve Typeで “Model”を選び、Index Ndに”1.597”と入力し”OK”を押してください。
5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題) 9
10. レンズ面の半径を与えます。一つ目のレンズ面 (STO)の Semi-Diameterに”2.099”、二つ目のレンズ面(2)の Semi-Diameterにも”2.099”、と入力してください。本来は半径 2.1のレンズですが、わずかに小さな値を与えないと面の描画がおかしくなります。ZEMAXはグローバルの x,y座標を DLLに渡し、DLLが返す z座標を面の描画に使います。パッチのようにローカルな三角形内での補間を計算する形式の場合、与えられたグローバル x,y座標を通りz軸に平行な線とパッチとの交差判定をし、交差位置のローカル座標から z座標を返すしかありません。この線との交差判定を行ったとき、レンズの縁で交差判定ができないことがあるので、実際のレンズより多少小さめの半径を与える必要があります。
11. レンズができているか確認します。”Analysis ⇒ Layout ⇒ Shaded Model”を選び、3Dモデルを確認してください。
10 5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題)
12. 光線を与えます。”System ⇒ General”を選びます。出てきたウィンドウで, Aperture Typeは”EntrancePupil Diameter”を選び、Aperture Valueに”2.1”と入力し、”OK”を押してください。
13. 光線追跡の結果、像面 (IMA)でスポット半径の値が計算され 6.472× 10−4と出ました。”Analysis ⇒Layout ⇒ Shaded Model”を選び、3Dモデルを確認すると光線が 1点で収束しているのが分かります。この単レンズ問題で、同数の線形補間の三角形パッチを使ったときと、Nagataパッチを使ったときのスポット半径の値を比較をした論文があります3。線形補間の三角形の場合、像面 (IMA)で半径の値は 1.8× 10−1程度で、Nagataパッチは圧倒的に良い結果になっています。非球面の表現パッチ数を増やせば、さらに理想的な値に近づきます。
3S. Morita, Y. Nishidate, T. Nagata, Y. Yamagata, and C. Teodosiu, “Ray-tracing simulation method using piecewise quadratic inter-polant for aspheric optical systems,” Appl. Opt 49, 3442–3451 (2010).
5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題) 11
14. ここから、保存と開く操作について説明します。特に開く操作には注意が必要です。まずは、できあがった問題設定を保存します。”File ⇒ Save As..”を選びます。保存する名前を”monolens nagpatch.zmx”として保存してください。
15. ”File ⇒ Exit”で、いったん ZEMAXを終了してください。
16. ZEMAXを起動してください。起動したら保存した”monolens nagpatch.zmx”を読み込みますが、ここで注意が必要です。ZEMAXにはプラグインが入力としてとった点群データを覚えておく手段がありません。そのせいで保存した問題設定を開くとき、どのレンズ面の情報がどのVObjに記述されているかを、ユーザが再びファイルダイアログから与える必要があります。まず、”File ⇒ Open”で出たファイルダイアログで”monolens nagpatch.zmx”を選んで開きます。
12 5. SEQUENCIAL光線追跡チュートリアル (単レンズ問題)
17. すぐに別のファイルダイアログがVObjの名前を聞いてきます。与えるVObjは、monolens nagpatch.zmxで作成したレンズ面の上から順番になります。一つ目は”lens-1.vobj”、二つ目は”lens-2.vobj”を選んでください。これで、monolens nagpatch.zmxに対して、正しくNagataパッチレンズの情報を与えて、保存した問題設定を再現できました。
6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題) 13
6. Non-Sequencial光線追跡チュートリアル (反射光学系問題)問題概要Non-SequencialモードのNagataパッチプラグインの使い方を学ぶために、DLLを使って簡単な問題を解いてみます。例は、平面反射鏡と非球面反射光の間に光源があり、一部の光線が検出器に到達するという問題です (図 4)。非球面は式
z(r) =r2/R
1 +√
1− (k + 1) r2/R2(2)
で定義し、パラメータはR = −1.838992mm, k = −2.550409で、ミラー面の半径は 2.1mmです。どちらの面も、いくつかの点でサンプリングし、離散点とそこでの法線ベクトル、接続情報をVObj形式で与えます。
図 3: 入射光線 (赤い線)の一部が非球面反射鏡と平面反射鏡に当たり、検出器まで到達する光学系。
14 6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題)
操作手順
1. ZEMAXを起動後、左上のメニュー “File ⇒ Non-Sequencial Mode”を選び、Non-Sequencialモードに入ってください。
2. Non-Sequencial Component Editorウィンドウ内で一つ目の部品を選んだ後、同ウィンドウ内の “Edit⇒ Object Properties”を選んでください。
6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題) 15
3. 出てきたオブジェクトの編集ウィンドウで、Typeを “Source Ellipse”としてから “OK”を押してください。
4. 一つ目の部品の “Z Position”を”1.0”、“# Layout Rays”(描画する光線数)は”1, 000”、“# Analysis Rays”(実際に光線追跡する光線数)を”100, 000”、“X Half Width”と “Y Half Width”を”1.0”としてください。
16 6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題)
5. 一つ目の部品を選び、“Edit ⇒ Insert After”で新しい部品を追加します。Nagataパッチプラグインを使うときは、上から順番に部品を Insert Afterで追加していくようにしてください。
6. 二つ目の部品を選び、“Edit ⇒ Object Properties”で 2つめの部品を編集します。
6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題) 17
7. “Type”は “User Defined Object”、“Data File”は “UDO NagPatch reflect.dll”を選び、“OK”を押してください。
8. すると、どのvobjファイルを使ってNagataパッチ面を定義するか指定するファイルダイアログが 2回出ます。2回ともこのミラー面に使う “lens-1.vobj”を選び “開く”を押してください。
(本来はファイルダイアログが出るのは 1回にするべきですが、ZEMAXが UDOプラグインに出す要求の関係上、ある UDO
プラグインが初めて使われたときに限って、UDOそのものの初期化とこの面の初期化の 2回分ファイルダイアログが出ざ
るを得ません。)
9. 二つ目の部品を選び、“Edit ⇒ Insert After”で新しい部品を追加します。
18 6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題)
10. 三つ目の部品を選び、“Edit ⇒ Object Properties”で 3つめの部品を編集します。
11. “Type”は “User Defined Object”、“Data File”は “UDO NagPatch reflect.dll”を選び、“OK”を押してください。
12. 反射面 1つ目を作ったときには、点群を格納する vobjファイルがどれなのか指定するためのファイルダイアログが自動的に出ましたが、2つ目以降は”# Object ID”を設定するまで vobjファイルを指定できません。反射面 2つ目の”# Object ID”に”1”と入力してください。
6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題) 19
13. どの vobjファイルを使って Nagataパッチ面を定義するか指定するファイルダイアログが出るので、“lens-2.vobj”を選び “開く”を押してください。
14. 最後に Detectorを追加します。三つ目の部品を選び、“Edit ⇒ Insert After”です。
15. 四つ目の部品を Detectorにします。“Edit ⇒ Object Properties”から編集します。
20 6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題)
16. “Type”は “Detector Rect”を選び、“OK”を押してください。
17. “Y Position”と “Z Position”を 3.0”、“Tilt About X”は”−45.0”、“# X Pixels”と “# Y Pixels”を”128”としてください。
6. NON-SEQUENCIAL光線追跡チュートリアル (反射光学系問題) 21
18. 光学系全体像を確認してみます。メインウィンドウの “Analysis ⇒ Layout ⇒ NSC Shaded Model”を状態を確認してみてください。
19. ディテクタでの照度分布を確認してみます。まずメインウィンドウの “Analysis ⇒ Detectors ⇒ RayTrace/Detector Control”を選択します。出てきたウィンドウで “Trace”ボタンを押した後 “Exit”ボタンを押します。
20. 次にメインウィンドウの “Analysis ⇒ Detectors ⇒ Detector View”を選択します。するとディテクタでの照度分布などが確認できます。
22 7. NON-SEQUENCIAL光線追跡チュートリアル 2 (単レンズ問題)
7. Non-Sequencial光線追跡チュートリアル 2 (単レンズ問題)問題概要第 5.章の Sequencialモードで光線追跡した単レンズ問題を、Non-Sequencialモードでやってみます。配置などは図 2で確認してください。
1. ZEMAXを起動後、左上のメニュー “File ⇒ Non-Sequencial Mode”を選び、Non-Sequencialモードに入ってください。
2. Non-Sequencial Component Editorウィンドウ内で一つ目の部品を選んだ後、同ウィンドウ内の “Edit⇒ Object Properties”を選んでください。
7. NON-SEQUENCIAL光線追跡チュートリアル 2 (単レンズ問題) 23
3. 出てきたオブジェクトの編集ウィンドウで、Typeを “Source Ellipse”としてから “OK”を押してください。
4. 一つ目の部品の “Z Position”を”–1.0”、“# Layout Rays”(描画する光線数)と “# Analysis Rays”(実際に光線追跡する光線数)は”1,000”、“X Half Width”と “Y Half Width”を”1.0”としてください。
24 7. NON-SEQUENCIAL光線追跡チュートリアル 2 (単レンズ問題)
5. 一つ目の部品を選び、“Edit ⇒ Insert After”で新しい部品を追加します。Nagataパッチプラグインを使うときは、上から順番に部品を Insert Afterで追加していくようにしてください。
6. 二つ目の部品を選び、“Edit ⇒ Object Properties”で 2つめの部品を編集します。
7. NON-SEQUENCIAL光線追跡チュートリアル 2 (単レンズ問題) 25
7. “Type”は “User Defined Object”、“Data Fileは”は “UDO NagPatch refract.dll”を選び、“OK”を押してください。
8. すると、この屈折体がいくつの vobjファイルで定義されるのかを聞くダイアログが 2回出ます。1回目のダイアログでは何もせずそのまま”OK”を押てください。この屈折体は (レンズ)は前面と後面が別々の vobjファイルに格納されていますから、2回目のダイアログでは数値”2”を入力してから”OK”を押してください。
1回目 2回目
(1回目のダイアログには何の意味もありませんが、ZEMAX UDOの仕様上出さざるを得ません。その問題中で初めてNagata
パッチ UDOを使ったときに限って、2回分ダイアログが出てしまいます。Nagataパッチ DLLで屈折体を 2つ以上作ると、
2つ目以降は 1度しかダイアログが出ないので、いきなりいくつの vobjを使うか与えてください。)
9. この屈折体は (レンズ)は 2つの vobjから成り立っています。一つ目のファイルダイアログでは “lens-1.vobj”、二つ目のファイルダイアログでは “lens-2.vobj”を選んでください。
26 7. NON-SEQUENCIAL光線追跡チュートリアル 2 (単レンズ問題)
10. 屈折体の屈折率を与えます。二つ目の部品の”Material”カラムをダブルクリックしてください。
11. 出てきたウィンドウで”Solve Type”は”Model”を選び、“Index Nd”に”1.597”と入力し、”OK”を押してください。
12. 最後に Detectorを追加します。二つ目の部品を選び、“Edit ⇒ Insert After”です。
7. NON-SEQUENCIAL光線追跡チュートリアル 2 (単レンズ問題) 27
13. 三つ目の部品を選び、“File ⇒ Object Properties”で編集します。
14. 出てきたウィンドウで”Type”を”Detector Rect”とし、”OK”を押してください。
28 7. NON-SEQUENCIAL光線追跡チュートリアル 2 (単レンズ問題)
15. Detectorの”Z Position”を”6.52”、”# X Pixels”と”# Y Pixels”を”128”にしてください。
16. 光学系全体像を確認してみます。メインウィンドウの “Analysis ⇒ Layout ⇒ NSC Shaded Model”を状態を確認してみてください。
8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題) 29
8. Non-Sequencial光線追跡チュートリアル 3 (ミラー/レンズ複合問題)問題概要平面ミラーと、第 5.章のSequencialモードで光線追跡した単レンズを組み合わせた光学系を、Non-Sequencialモードで光線追跡します。
図 4: 入射光線 (赤い線)の一部が平面反射鏡に当たった後、非球面レンズで屈折され、検出器まで到達する光学系。
30 8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題)
1. ZEMAXを起動後、左上のメニュー “File ⇒ Non-Sequencial Mode”を選び、Non-Sequencialモードに入ってください。
2. Non-Sequencial Component Editorウィンドウ内で一つ目の部品を選んだ後、同ウィンドウ内の “Edit⇒ Object Properties”を選んでください。
8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題) 31
3. 出てきたオブジェクトの編集ウィンドウで、Typeを “Source Ellipse”としてから “OK”を押してください。
4. 一つ目の部品の “Y Position”と “Z Position”を”2.0”、“Tilt About X”を”160.0”、“# Layout Rays”(描画する光線数)を”100”、“# Analysis Rays”(実際に光線追跡する光線数)は”100,000”、“X Half Width”と“Y Half Width”を”0.5”としてください。
32 8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題)
5. 一つ目の部品を選び、“Edit ⇒ Insert After”で新しい部品を追加します。Nagataパッチプラグインを使うときは、上から順番に部品を Insert Afterで追加していくようにしてください。
6. 二つ目の部品を選び、“Edit ⇒ Object Properties”で 2つめの部品を編集します。
8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題) 33
7. “Type”は “User Defined Object”、“Data Fileは”は “UDO NagPatch reflect.dll”を選び、“OK”を押してください。
8. すると、どのvobjファイルを使ってNagataパッチ面を定義するか指定するファイルダイアログが 2回出ます。2回ともこのミラー面に使う “lens-1.vobj”を選び “開く”を押してください。
34 8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題)
9. 二つ目の部品を選び、“Edit ⇒ Insert After”で新しい部品を追加します。
10. 三つ目の部品を選び、“Edit ⇒ Object Properties”で 3つめの部品を編集します。
8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題) 35
11. “Type”は “User Defined Object”、“Data File”は “UDO NagPatch refract.dll”を選び、“OK”を押してください。
12. すると、この屈折体がいくつの vobjファイルで定義されるのかを聞くダイアログが 2回出ます。1回目のダイアログでは何もせずそのまま”OK”を押てください。この屈折体は (レンズ)は前面と後面が別々の vobjファイルに格納されていますから、2回目のダイアログでは数値”2”を入力してから”OK”を押してください。
1回目 2回目
13. この屈折体は (レンズ)は 2つの vobjから成り立っています。一つ目のファイルダイアログでは “lens-1.vobj”、二つ目のファイルダイアログでは “lens-2.vobj”を選んでください。
36 8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題)
14. 屈折体の”Z Position”を”5.0”にしてください。
15. 屈折体の屈折率を与えます。二つ目の部品の”Material”カラムをダブルクリックしてください。
16. 出てきたウィンドウで”Solve Type”は”Model”を選び、“Index Nd”に”1.597”と入力し、”OK”を押してください。
8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題) 37
17. 最後に Detectorを追加します。二つ目の部品を選び、“Edit ⇒ Insert After”です。
18. 四つ目の部品を選び、“File ⇒ Object Properties”で編集します。
38 8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題)
19. 出てきたウィンドウで”Type”を”Detector Rect”とし、”OK”を押してください。
20. Detectorの”Y Position”を”–1.0”、”Z Position”を”10.0”、”# X Pixels”と”# Y Pixels”を”200”にしてください。
8. NON-SEQUENCIAL光線追跡チュートリアル 3 (ミラー/レンズ複合問題) 39
21. 光学系全体像を確認してみます。メインウィンドウの “Analysis ⇒ Layout ⇒ NSC Shaded Model”を状態を確認してみてください。
22. ディテクタでの照度分布を確認してみます。まずメインウィンドウの “Analysis ⇒ Detectors ⇒ RayTrace/Detector Control”を選択します。出てきたウィンドウで “Trace”ボタンを押した後 “Exit”ボタンを押します。
23. メインウィンドウの “Analysis ⇒ Detectors ⇒ Detector View”を選択します。するとディテクタでの照度分布などが確認できます。
40 9. NAGATAパッチ DLLの注意点
9. NagataパッチDLLの注意点チュートリアルのような手順を踏めば、計測点情報から正しく光線追跡計算ができます。しかしながら、
DLLにはユーザから見て不自然ながらそうせざるを得ない制限がいくつかあります。ZEMAXのDLLによるUser Defined Surface(UDS)やUser Defined Object(UDO)は、そもそも外部入力ファイルに記述された三角形メッシュを読み込み、DLLが面情報を保持し、それに基づきローカルでの補間関数を使ってレンズ面を表現するという使い方を想定していないためです。
9. 1. SequencialとNon-Sequencialプラグイン共通
1. オブジェクトやレンズ面は上から順番に作っていってください。最後に作ったレンズ面を選んで”InsertAfter”で付け加えるようにしてください。
2. ”Delete Surface”などを使った UDSや UDOの消去ができません。ZEMAXは、Layout3Dや ShadeModelのウィンドウを閉じたときにも DLLのクリーンアップを要求するため、面が消されたのか、ウィンドウを閉じたのか、など、どうして DLLのクリーンアップが要求されたのか判断する手段がないため、DLLが持つ点群情報を消すことができないためです。
3. DLLの選択で Nagataパッチプラグインを選んだ時点でファイルダイアログが出ますが、ここで何かVObjファイルを選ばないとファイルダイアログが出つづけます。間違ってNagataパッチプラグインを選んでしまった場合、適当なVObjファイル (拡張子が vobjであればOK)を作るなど、ダミーのVObjを選んで読み込んで、もういちど始めから作成し直してください。
4. ある面に対して、ファイルダイアログでえらんだVObjを変更したい場合があるかもしれません。そのときは、一度 ZMX形式で保存してから ZEMAXでその ZMXファイルを開き、ファイルダイアログで一つずつ VObjファイルを選び直すという手段しかありません。
5. ZEMAXにはプラグインが入力としてとった点群データを覚えておく手段がありません。そのため、いったん保存した問題設定 (ZMXファイル)を開くとき、どのレンズ面の情報がどの VObjに記述されているかを、ユーザが ZMXファイルを開く度にファイルダイアログから与える必要があります。つまり、Nagataパッチを使った ZMXファイルを他の人 (例えば 1週間後の自分)に渡したりする場合
• ZMXファイルだけでなく、
• Nagataパッチを使ったレンズ面と同じ数の VObjファイル
• VObjファイルをどの順番で読み込めば良いか
という情報が必要になります。Non-Sequencialの屈折体の場合は、これに加えて
• それぞれの屈折体がいくつの VObjから成り立っているか
も必要でしょう。ZMXファイルを保存するときは、同じフォルダにVObjと順番を記述したテキストファイルを置いておくことをお勧めします。
6. グローバル座標の関数表現に比べて、局所的な面表現を使うことの不利点が一つあります。ローカルな関数表現は頂点データを保存しておく必要があるため、その分だけ余分にメモリを消費します。Nagataパッチ形式では 1頂点につき 60byte、1パッチにつき 220byteのメモリを使います。ただし、現在の一般的なコンピュータで実用的な数の頂点数なら、何の問題も無い程度です。例えば、付属のlens-2.vobjは 847点、1592パッチの面で、これは 401Kbyteのメモリを使います。もう少し点の数を増やして、5万点、10万パッチの面の場合 25Mbyteとなります。
9. NAGATAパッチ DLLの注意点 41
9. 2. Sequencialプラグイン
1. レンズの Semi-Diameterには、実際の半径よりわずかに小さな値を与えないと面の描画がおかしくなります。気にしなくとも、光線の範囲が正しければ光線追跡計算には問題ありませんが、見た目が良くありません。ZEMAXはDLLのレンズ面を描画するときに、グローバルの x,y座標をDLLに渡し、DLLが返す z座標を使うため、DLLではグローバル x,y座標を通り z軸に平行な線とパッチとの交差判定をする必要が有り、レンズの縁で交差判定ができないことがあるのが理由です。
9. 3. Non-Sequencialプラグイン
1. 光学系を作るとき、反射体のプラグイン (UDO NagPatch reflect.dll),屈折体のプラグイン(UDO NagPatch refract.dll)をその問題中で初めて使う時に限って、VObjファイルを指定するための面数指定ダイアログやファイルダイアログが 2回出ます。Non-Sequencialの場合の反射体と屈折体のチュートリアルを参考に、正しく操作しないとうまく動きません。
2. 反射体と屈折体どちらでも複数使うときは、2つ目以降は”# Object ID”を指定する必要があります。例えば、2つ目の反射面の”# Object ID”は”1”、3つ目の反射面の”# Object ID”は”2”と、”ComponentEditor”ウィンドウでユーザが入力する必要があります。Non-Sequencial光線追跡チュートリアル (反射光学系問題)を参考にしてください。