カメラ好きのためにレンズ設計シミュレーションの紹介

## はじめに
カメクラ+プログラマー->光学シミュレーション
ってことでオープンソースの光学シミュレーションライブラリ**opticspy**の紹介です。
http://opticspy.org/
光学シミュレーションは、*ZEMAX OpticStudio*等の有料のものはありますが無料のものは珍しいみたいですね。

**レンズ構成図**
<img src="https://qiita-image-store.s3.amazonaws.com/0/380878/0c7cd72d-e77b-fe07-3e93-562d6dff373c.png" width=50%>
**スポットダイアグラム**[^1]
<img src="https://qiita-image-store.s3.amazonaws.com/0/380878/c98fb9de-d13c-7737-91be-981747a7366b.png" width=50%>
**収差図**[^2]
<img src="https://qiita-image-store.s3.amazonaws.com/0/380878/7c49953d-d709-13a4-0cf5-b6c1cf797b09.png" width=50%>
なんかが作れます。

他にも光学系の計算に使用する**ゼルニケ多項式**や波長や位相差を測定する**干渉計**が使える模様（光学に関してド素人なのでそっちは触ってません）。

## 環境
* Python3.6
* Jupyter Notebook

## 導入
PyPIからだと2.x用がインストールされてしまうので
[github Sterncat/opticspy](https://github.com/Sterncat/opticspy) から3.x用をクローン

```
# pip install git+git://github.com/Sterncat/opticspy.git@master
```

~~**としたいところですが**今回のチュートリアルが完了できないバグがあります。
修正してプルリクエスト済みですが、マージされるまでは以下を使ってください。
[github HijiriIshi/opticspy](https://github.com/HijiriIshi/opticspy)~~

*Jupyter Notebook*は*root*で起動しないとダメ。

```console
# jupyter notebook --allow-root
```

### glass_databaseに関して
ガラス素材の材質をymlで定義することができます。
基本的な材質は*glass_database*に用意されています。

しかしながら、執筆時点で*Sterncat/opticspy*だとinstallパッケージに*glass_database*は含まれません。
https://github.com/Sterncat/opticspy/tree/master/opticspy/ray_tracing/glass_database

そのためチュートリアルを行うにはリポジトリからフォルダをコピーする必要があります。
場所はパッケージインストール先の`opticspy/ray_tracing/glass_database`です。

```console
# pip show opticspy
Name: opticspy
Version: 0.2.1
Summary: Python optics module
Home-page: http://opticspy.org
Author: Xing Fan
Author-email: marvin.fanxing@gmail.com
License: MIT License
Location: /usr/lib/python3.6/site-packages
Requires: numpy, matplotlib, unwrap
Required-by:
```

上記の場合は`/usr/lib/python3.6/site-packages/opticspy/ray_tracing/glass_database`となります。

この位置やめたほうが良くない？とは思いますが、参照先を定義している`opticspy\opticspy\ray_tracing\glass_function\refractiveIndex.py`が修正途中のようなのでノータッチ。

パッケージに含めることの是非はおいといて*HijiriIshi/opticspy*では*glass_database*を含めています。

## レンズデザインのチュートリアル
チュートリアルが[**公式サイト**](http://opticspy.org/)に用意されています。
光学専門用語が含まれるので取っつきやすいように*Real ray tracing and Lens Design*より[**Example 1: Basic functions introduction**](http://sterncat.github.io/files/Real_Ray_Tracing.html)の冒頭部分と見出しを和訳しました。

>Opticspyは解析だけではなくレイトレーシングモジュール、単焦点レンズ設計モジュールを提供します。
1. レンズ面、波長、フィールドを追加してレンズ系を構築する
2. 光線追跡、レンズ系の描画
3. レンズ系の解析：スポットダイアグラムと収差図(レイファンプロットダイアグラム)
4. システムを通したレイトレーシング
5. ABCD行列モジュールによる*Lens paraxial information*(収差を出さない理想レンズ？ 直訳: レンズ近軸情報)の計算  
次に示すのが、*opticspy*のレイトレーシングモジュールを使用して最大視野角20度のF/5トリプレット[^3]を構築する例です。レンズ系のスポットダイアグラムと収差図が表示されます。
1. 表面、波長、フィールドを追加することにより、レンズ系を構築する。
2. レイトレーシングを行いレンズ系を描画する（最初に`refresh_paraxial`関数で入射瞳位置[^4]を見つける）
3. レンズ系解析：スポットダイアグラムと収差図
Opticspyは3種類のトレーシンググリッドを提供します
    * 格子状: n本の光線が軸に沿った配置で入射瞳を通過します
    * 円形状: n本の光線が円環を描いた配置で入射瞳を通過します
    * ランダム: n本の光線がランダムな配置で入射瞳を通過します
4. システムを介したレイトレーシング：ユーザはレイトレーシングを行うにあたり（入射瞳に対する）光線の位置、視野および波長を指定することができる。ユーザは、出力形式を選択することができ、また、線位置出力X、Y、Z及び光線方向出力K、M、L、ならびに開始および終了面を指定することができる。 
5. ABCDマトリックスモジュールによるレンズ近軸情報の計算：像位置、有効焦点距離、後側焦点距離、入射瞳位置と直径、射出瞳位置、面xからyまでの焦点距離、2面間の厚さなど。

## おわりに
*Real ray tracing and Lens Design*の他のチュートリアルに関して触れると、
* [Example 2: A double gauss lens example](http://sterncat.github.io/files/Double_Gauss.html) : Example 1のダブルガウス版
* [Example 3: Build a Petzval lens with codev seq file](http://sterncat.github.io/files/CodeV_Convertor.html) : レンズ構成を定義した*.seqファイルの読込
* [Example 4: Build a microscope lens with codev seq file](http://sterncat.github.io/files/Microscope.html) : Example 3のマイクロスコープ版
チュートリアルで使用する*.seqファイルは[**こちら**](https://github.com/Sterncat/opticspy/tree/master/opticspy/ray_tracing/CodeV_examples)にあります。

参考リンクに有名なレンズ構成が紹介されているサイトや、光学の基礎が学べるサイトへのリンクを載せました。
いろんなレンズを作って遊ぼう！

## 参考リンク
* 光学入門  
[光学総合サイト - CYBERNET](http://www.cybernet.co.jp/optical/)
* 光学用語集
[レンズ設計光学講座 - 株式会社レンズ設計支援](http://www.lenses-ds.co.jp/myweb11_29.html)
* レンズ構成と*OpticStudio*用の光学データの公開  
[○○○レンズ屋：業務用単品レンズの設計・製造○○○ - 株式会社レンズ屋](http://www.lensya.co.jp/lensdata/)

[^1]: 光源から像面まで多数の光線追跡を行い、像面上の光線到達位置をプロットしたものがスポットダイアグラムです。集光度合いや収差の幾何光学的な振る舞いを視覚的に把握するのに適しています。[(スポットダイアグラム：光学総合サイト：サイバネット)](http://www.cybernet.co.jp/optical/course/word/s15.html)
[^2]: 収差図を見るとレンズの性能だけでなくボケの味などもおおざっぱに分かるようになります。[(・球面収差と縦収差図の見かた：虹色の旋律)](http://nijikarasu.cocolog-nifty.com/blog/2014/02/post-db7f.html)
[^3]: 3群3枚の写真レンズの構成様式
[^4]: 開口絞り（絞り面参照）より物体側の光学系で結像された開口絞りの像を入射瞳と呼びます。また、物体空間上での主光線をそのまま延長し、光軸と交わる位置が入射瞳位置になります。[(入射瞳：光学総合サイト：サイバネット)](http://www.cybernet.co.jp/optical/course/word/n01.html)