Skip to content

t3tra-dev/waveoptics

Repository files navigation

波動光学回折シミュレーター

任意開口による光の回折現象をリアルタイムで計算・可視化する WebGL 実装のインタラクティブシミュレーターです。厳密な波動光学理論に基づき、教育から研究まで幅広い用途に対応します。

📋 特徴

  • 物理的に正確な計算: 角スペクトル法による厳密な波動伝播
  • リアルタイム処理: WebGL2 GPU 並列計算による高速 FFT
  • 完全な色再現: CIE 1931 標準に基づくスペクトル → sRGB 変換
  • インタラクティブ描画: マウスで任意形状の開口を自由に描画
  • 多波長対応: 単色光から白色光まで対応 (最大 15 波長同時計算)

🔬 理論的背景

入射波場の数学的記述

本シミュレーターでは 2 種類の光源モデルを実装しています:

点光源 (球面波):

$$U_0(x,y) = \frac{e^{ik\sqrt{(x-x_s)^2+(y-y_s)^2+z_1^2}}}{\sqrt{(x-x_s)^2+(y-y_s)^2+z_1^2}}$$

平面波 (コリメート光):

$$U_0(x,y) = e^{ik(x\sin\theta_x + y\sin\theta_y)}$$

ここで $k = 2\pi/\lambda$ は波数、$z_1$ は光源距離、$(\theta_x, \theta_y)$ は入射角です。

アパーチャ透過

開口面での複素振幅は透過関数との積で表されます:

$$U_A(x,y) = T(x,y) \cdot U_0(x,y)$$

透過関数 $T(x,y) \in [0,1]$ は、ユーザーが描画したグレースケールパターンから導出される振幅透過率です。半透明表現により、グラデーション開口や複雑な透過特性も表現可能です。

波動伝搬計算

角スペクトル法(メイン実装)

最も汎用的で数値的に安定な手法として角スペクトル法を採用:

$$\begin{aligned} \mathcal{F}_{x,y}\{U_A(x,y)\}(k_x,k_y) &= \tilde{U}_A(k_x,k_y) \\\ \tilde{U}_S(k_x,k_y) &= \tilde{U}_A(k_x,k_y) \cdot e^{iz_2\sqrt{k^2-k_x^2-k_y^2}} \\\ U_S(X,Y) &= \mathcal{F}^{-1}_{k_x,k_y}\{\tilde{U}_S(k_x,k_y)\} \end{aligned}$$

この手法では:

  • フーリエ変換でアパーチャ場を空間周波数領域に変換
  • 各空間周波数成分に伝搬位相を乗算
  • 逆フーリエ変換で観察面の場を復元

エバネッセント波の処理

$k_x^2 + k_y^2 > k^2$ の領域では:

$$H(k_x,k_y) = e^{-z_2\sqrt{k_x^2+k_y^2-k^2}}$$

指数減衰する成分として適切に処理し、数値安定性を確保します。

Fresnel 積分 (補助実装)

近距離伝搬での比較検証用として、Fresnel-Kirchhoff 積分も実装:

$$U_S(X,Y) = \frac{e^{ikz_2}}{i\lambda z_2} e^{\frac{ik}{2z_2}(X^2+Y^2)} \iint U_A(x,y) e^{\frac{ik}{2z_2}(x^2+y^2)} e^{-\frac{ik}{z_2}(xX+yY)} dx\,dy$$

🎨 色空間変換システム

スペクトル積分による色彩計算

多波長計算結果は、CIE 1931 標準等色関数を用いて XYZ 色空間に変換:

$$\begin{aligned} X &= \sum_i w_i I(\lambda_i) \bar{x}(\lambda_i) \Delta\lambda \\\ Y &= \sum_i w_i I(\lambda_i) \bar{y}(\lambda_i) \Delta\lambda \\\ Z &= \sum_i w_i I(\lambda_i) \bar{z}(\lambda_i) \Delta\lambda \end{aligned}$$

ここで:

  • $I(\lambda_i) = |U_S(\lambda_i)|^2$ は各波長での光強度
  • $\bar{x}(\lambda_i), \bar{y}(\lambda_i), \bar{z}(\lambda_i)$ は CIE 等色関数
  • $w_i$ は各波長の重み、$\Delta\lambda$ は波長間隔

sRGB 変換

XYZ 値は標準変換行列で sRGB 色空間に変換:

$$\begin{bmatrix} R\\G\\B \end{bmatrix}_{\text{linear}} = \begin{bmatrix} 3.2406&-1.5372&-0.4986\\\ -0.9689&1.8758&0.0415\\\ 0.0557&-0.2040&1.0570 \end{bmatrix} \begin{bmatrix} X\\Y\\Z \end{bmatrix}$$

最終的にガンマ補正を適用:

$$C_{sRGB} = \begin{cases} 12.92 \, C_{linear} & (C_{linear} \leq 0.0031308)\\\ 1.055 \, C_{linear}^{1/2.4} - 0.055 & (C_{linear} > 0.0031308) \end{cases}$$

💻 数値実装の詳細

離散フーリエ変換

すべての伝搬計算は WebGL シェーダーで実行される 2D 高速フーリエ変換を使用。サンプリング定理の制約:

$$\Delta x \leq \frac{\lambda z_2}{N_x \Delta x_s}$$

ゼロパディングと数値安定性

  • 設定可能なオーバーサンプリング比 (1-4 倍) でエイリアシング防止
  • 位相ラッピング処理による高精度浮動小数点演算
  • エバネッセント成分のソフトカットオフ

物理単位系の一貫性

  • 波長: メートル単位での内部計算 (UI 表示はナノメートル)
  • 距離: メートル単位 (開口サイズはミリメートルからの変換)
  • 角度: ラジアン単位での位相計算

🚀 使用方法

基本操作

  1. 開口描画: 左キャンバスでマウスドラッグして開口を描画
  2. 消去: 右クリックドラッグで部分消去
  3. プリセット: 単スリット/複スリット/円形開口のワンクリック設定
  4. パラメータ調整: 右パネルでリアルタイム物理パラメータ変更

パラメータ設定

  • 光源: 点光源 (球面波) / 平面波 (コリメート光)
  • 波長: 380-780nm (単色 or 多色最大 15 波長)
  • ジオメトリ: 光源距離、開口-スクリーン距離、開口サイズ
  • 計算: 解像度 (256-1024)、ゼロパディング係数

物理現象の観察例

  • 単スリット回折: sinc² 関数パターンの確認
  • 複スリット干渉: Young 干渉縞と包絡線
  • 円形開口: Airy disk の形成
  • 白色光分散: 中央白色から両端虹色への分散パターン

⚙️ 技術仕様

システム要件

  • WebGL2 対応ブラウザ (Chrome 56+, Firefox 51+, Safari 15+)

アーキテクチャ

┌─ フロントエンド (HTML5/CSS3/JavaScript ES6+)
├─ 物理エンジン (波動光学計算・FFT・色変換)
├─ WebGL2 レンダリング (12種類のGLSLシェーダー)
└─ リアルタイム UI (パラメータ同期・描画イベント)

パフォーマンス

  • 計算解像度 512x512: ~50-100ms/フレーム
  • メモリ使用量: ~50-200MB (解像度・波長数に依存)
  • リアルタイム更新レート: 最大 6.7fps (150ms スロットリング)

📚 参考文献・理論背景

主要参考文献

  1. Goodman, J.W. Introduction to Fourier Optics (4th ed.) フーリエ光学と回折理論の包括的教科書。本実装の理論的基盤。

  2. Born, M. & Wolf, E. Principles of Optics (7th ed.) レイリー-ゾンマーフェルト理論からキルヒホッフ近似までの厳密な導出。

  3. Matsushima, K. "Band-Limited Angular Spectrum Method for Numerical Simulation of Free-Space Propagation in Far and Near Fields." Optics Express 17, 19662-19673 (2009)
    数値安定性を向上させた角スペクトル法の改良版。

  4. CIE Publication 15.2 Colorimetry (1986)
    CIE 1931 標準等色関数の公式仕様。色変換システムの基準。

数値計算手法

  • Cooley-Tukey FFT: 基数 2 分解による高速フーリエ変換
  • Complex texture packing: RG チャンネルによる複素数表現
  • GPU 並列化: WebGL2 compute shader による大規模並列演算

検証方法

理論値との比較検証:

  • 単スリット: $I(\theta) = I_0 \text{sinc}^2(\pi a \sin\theta/\lambda)$
  • 複スリット: 上記にコサイン項 $\cos^2(\pi d \sin\theta/\lambda)$ が乗算
  • 円形開口: Airy 関数による第一暗環位置の検証

📄 ライセンス

本ソフトウェアは教育・研究目的での使用を想定しています。コードベース自体は MIT ライセンスで提供され、商用利用や再配布も可能です。ただし、波動光学理論の厳密性を保つため、数値計算の結果は参考値として扱ってください。

🤝 貢献・フィードバック

バグ報告や機能要望は Issue までお寄せください。波動光学理論や数値計算の改善提案も歓迎します。


このシミュレーターは、複雑な波動現象を直感的に理解できるよう、厳密な物理理論とリアルタイム可視化技術を統合したものです。光学教育や計算光学研究の発展に貢献することを願っています。

About

波動光学解析ィ!!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors