draw_tft3d.py 技術ドキュメント

プログラムの動作

draw_tft3d.py は、PyVistaライブラリを使用して薄膜トランジスタ (Thin-Film Transistor, TFT) の概念的な3D構造モデルを描画するスタンドアロンのPythonスクリプトです。

目的: このプログラムの主な目的は、TFTの幾何学的構造を直感的かつ視覚的に理解しやすい3Dモデルとして表現することです。特に、従来の tft.py スクリプトの model3d モードの機能をPyVistaベースに再実装し、以下の課題を解決します。

主な機能:

  • 3Dレンダリング: 基板、ゲート、ゲート絶縁膜、半導体層、ソース/ドレイン電極といったTFTの各構成要素を、それぞれ直方体として定義し、3D空間に描画します。PyVista(VTKベース)を使用することで、Zバッファ処理による適切な奥行き表現と、滑らかなレンダリングが可能です。

  • パラメータ設定: チャネル幅 (W)、チャネル長 (L)、ゲート絶縁膜厚 (dg) などの主要なTFT幾何学的パラメータに加え、各層の厚さ、ソース/ドレインのX方向の長さ、Z方向の視覚的拡大率などをコマンドライン引数で細かく調整できます。

  • インタラクティブビューア: プログラムはインタラクティブな3Dビューアウィンドウを提供し、ユーザーはマウス操作やキーボードショートカット(回転、パン、ズーム、プリセットビュー、平行投影切り替えなど)でモデルを自由に探索できます。

  • 画像保存: 描画された3Dモデルのスクリーンショットを指定されたファイル名で保存する機能があります。これにより、ドキュメント作成や発表資料への組み込みが容易になります。

  • 表示オプション: レイヤーラベル、凡例、座標軸の表示/非表示を切り替えることができます。

解決する課題:

  • matplotlibの mplot3d のような基本的な3Dプロットよりも高度な、専用の3Dレンダリングとインタラクティブ性を提供します。

  • TkinterなどのGUIライブラリに依存せず、スタンドアロンで動作するため、軽量で導入が容易です。

  • 初期カメラ設定がTFT構造全体を視野に収めるように調整されるため、すぐに構造を把握できます。

原理

draw_tft3d.py は、TFTの各構成層を直方体としてモデル化し、PyVistaライブラリの3Dレンダリング機能を用いて視覚化します。

1. 幾何学的モデル化: TFTの各層(基板、ゲート、絶縁体、半導体、ソース、ドレイン)は、Layer データクラスによって定義されます。各 Layer オブジェクトは、その名前、6つの境界座標 (xmin, xmax, ymin, ymax, zmin, zmax)、色、不透明度を持ちます。

  • 単位変換: コマンドライン引数で与えられるチャネル幅 W、チャネル長 L、ゲート絶縁膜厚 dg はメートル (m) 単位ですが、プログラム内部では全てナノメートル (nm) に変換されて計算・描画されます (\(1\text{m} = 10^9\text{nm}\))。

  • 座標の計算:

    • X方向: 全体のX方向の長さ x_tot は、ソース/ドレイン電極の長さ L_sd とチャネル長 L を基に計算されます。 $\(x_{\text{tot}} = 2 \cdot L_{\text{sd}} + L_{\text{nm}}\)$

    • Y方向: 全体のY方向の長さ y_tot は、チャネル幅 W に等しいです。 $\(y_{\text{tot}} = W_{\text{nm}}\)$

    • Z方向: 各層の厚さはZ軸に沿って積み上げられます。ユーザーが指定する --zscale 引数により、描画時にはこのZ座標が視覚的に拡大されます。これにより、実際には非常に薄い膜厚の層も、明確に視認できるようになります。例えば、厚さ d の層は、z から (z + d) までを物理的な厚さとして計算し、描画時には z * zscale から (z + d) * zscale の範囲で描画されます。

2. 3Dレンダリングエンジン: PyVista は、VTK (Visualization Toolkit) をベースとしたPython用の強力な3Dグラフィックスライブラリです。

  • メッシュの生成: 各 Layer オブジェクトの境界座標から、pyvista.Box オブジェクトを生成します。これは直方体形状の3Dメッシュです。

  • シーンへの追加: pv.Plotter インスタンスが3D描画ウィンドウを管理します。plotter.add_mesh() メソッドを使用して、生成されたボックスメッシュを色、不透明度、エッジの表示設定とともにシーンに追加します。

  • カメラ設定:

    • 初期ビュー: get_scene_bounds 関数で全モデルの空間範囲を抽出し、configure_camera 関数でその範囲全体が画面に収まるように初期カメラ位置、焦点、ズームレベルを自動調整します。

    • 投影法: --parallel オプションにより、遠近感がなく寸法が一定に保たれる平行投影と、奥行きに応じてサイズが変わる透視投影を切り替えることができます。

  • インタラクティブ操作: install_camera_keybindings 関数により、キーボードイベントをカメラ操作にマッピングします。これにより、ユーザーはマウスだけでなく、キーボードでもカメラを直感的に操作できます。

必要な非標準ライブラリとインストール方法

draw_tft3d.py は以下の非標準ライブラリに依存しています。

  • numpy: 数値計算、特に配列操作に使用されます。

  • pyvista: 3Dモデルのレンダリングに使用されます。PyVistaは内部的にVTK(Visualization Toolkit)を利用します。

これらのライブラリは pip を使用してインストールできます。

pip install numpy pyvista

環境によっては、pyvista をインストールする際に vtk も明示的に指定する必要がある場合があります。その場合は以下のコマンドを試してください。

pip install pyvista vtk

必要な入力ファイル

このプログラムは、外部の入力ファイルを必要としません。 すべてのTFTの幾何学的パラメータや表示オプションは、コマンドライン引数として直接指定されます。

生成される出力ファイル

プログラムは、--save=1 オプションが指定された場合に、TFTの3Dモデルのスクリーンショットを生成します。

  • ファイル名: --outfile 引数で指定されたファイル名を使用します。デフォルトは tft3d.png です。

  • 内容: 描画されたTFTの3Dモデルの静止画像です。ファイル形式は、指定されたファイル名の拡張子(例: .png, .jpg, .svg, .pdf など)に応じて自動的に決定されます。PyVista(VTK)がサポートするほとんどの画像形式に対応しています。

コマンドラインでの使用例 (Usage)

プログラムのヘルプメッセージは、--help オプションで確認できます。

python draw_tft3d.py --help

出力例:

usage: draw_tft3d.py [-h] [--W POSITIVE_FLOAT] [--L POSITIVE_FLOAT]
                   [--dg POSITIVE_FLOAT] [--d_sub POSITIVE_FLOAT]
                   [--d_gate POSITIVE_FLOAT] [--d_semi POSITIVE_FLOAT]
                   [--d_sd POSITIVE_FLOAT] [--L_sd POSITIVE_FLOAT]
                   [--zscale POSITIVE_FLOAT] [--figsize WIDTH,HEIGHT]
                   [--dpi DPI] [--title TITLE] [--background BACKGROUND]
                   [--camera_scale POSITIVE_FLOAT]
                   [--camera_margin POSITIVE_FLOAT] [--parallel {0,1}]
                   [--edges {0,1}] [--legend {0,1}] [--labels {0,1}]
                   [--axes {0,1}] [--save {0,1}] [--show {0,1}]
                   [--pause {0,1}] [--outfile OUTFILE]

Draw a 3D conceptual model of a thin-film transistor (TFT) using PyVista.

options:
  -h, --help            show this help message and exit
  --W POSITIVE_FLOAT    channel width W [m] (default: 3e-04)
  --L POSITIVE_FLOAT    channel length L [m] (default: 5e-05)
  --dg POSITIVE_FLOAT   gate-insulator thickness [m] (default: 1e-07)
  --d_sub POSITIVE_FLOAT
                        substrate thickness [nm] (default: 300.0)
  --d_gate POSITIVE_FLOAT
                        gate thickness [nm] (default: 100.0)
  --d_semi POSITIVE_FLOAT
                        semiconductor thickness [nm] (default: 100.0)
  --d_sd POSITIVE_FLOAT
                        source/drain thickness [nm] (default: 100.0)
  --L_sd POSITIVE_FLOAT
                        source/drain length along x [nm] (default: 50000.0)
  --zscale POSITIVE_FLOAT
                        visual magnification factor for z direction (default: 80.0)
  --figsize WIDTH,HEIGHT
                        figure size as width,height [inch] (default: (8.0, 6.0))
  --dpi DPI             reference DPI to determine the render window size (default: 120)
  --title TITLE         window / figure title (default: Thin-film transistor structure)
  --background BACKGROUND
                        background color (default: white)
  --camera_scale POSITIVE_FLOAT
                        larger value = camera farther away (default: 1.9)
  --camera_margin POSITIVE_FLOAT
                        extra margin factor when fitting the initial camera (default: 1.08)
  --parallel {0,1}      use parallel projection (default: 0)
  --edges {0,1}         draw mesh edges (default: 1)
  --legend {0,1}        show legend (default: 1)
  --labels {0,1}        show layer labels (default: 0)
  --axes {0,1}          show axes (default: 0)
  --save {0,1}          save screenshot to --outfile (default: 0)
  --show {0,1}          show interactive window (default: 1)
  --pause {0,1}         pause before termination when --show=0 (default: 1)
  --outfile OUTFILE     output image file when --save=1 (default: tft3d.png)

コマンドラインでの具体的な使用例

1. デフォルト設定でインタラクティブビューアを表示

最も基本的な実行方法です。TFTの標準的な構造が3Dビューアウィンドウに表示され、マウスやキーボードで操作できます。

python draw_tft3d.py
  • 実行結果: 「Thin-film transistor structure」というタイトルで3Dビューアウィンドウが開き、TFTの3Dモデルが表示されます。画面下部とコンソールにはカメラ操作のヘルプが表示されます。

    • マウス操作: 左クリックドラッグで回転、右クリックドラッグでパン、ホイールでズーム。

    • キーボード操作: j/l (左右回転), i/k (上下回転), +/- (ズーム), a/d/w/s/u/o (パン), r (カメラリセット), x/y/z (プリセットビュー), p (平行投影切り替え), q (終了)。

2. 特定のTFTパラメータと表示オプションで描画し、PNGファイルとして保存

チャネル幅、チャネル長、Z方向のスケールを変更し、レイヤーラベルを表示して、インタラクティブウィンドウは開かずに直接画像ファイルとして出力します。

python draw_tft3d.py \
  --W 500e-6 \
  --L 100e-6 \
  --zscale 60 \
  --labels 1 \
  --title "Custom TFT Structure with Labels" \
  --save 1 \
  --show 0 \
  --pause 0 \
  --outfile custom_tft_with_labels.png
  • 実行結果: インタラクティブな3Dビューアウィンドウは表示されず、指定されたパラメータでTFT構造が描画され、そのスクリーンショットが custom_tft_with_labels.png という名前でカレントディレクトリに保存されます。プログラムは自動的に終了します。 コンソールには、設定されたTFTの物理的寸法(W, L, dgなど)と、画像保存のメッセージが表示されます。

    # TFT 3D structure (PyVista)
    W       =        500 um
    L       =        100 um
    dg      =        100 nm
    x_total =        700 um
    y_total =        500 um
    z_total =        700 nm
    zscale  =         60  (visual only)
    
    Saved figure to: custom_tft_with_labels.png
    

3. 平行投影で描画し、背景色とウィンドウサイズを指定して表示

平行投影を有効にし、背景色を黒に、ウィンドウサイズを大きくしてインタラクティブに表示します。

python draw_tft3d.py \
  --parallel 1 \
  --background black \
  --figsize 10,8 \
  --title "TFT in Parallel Projection"
  • 実行結果: 「TFT in Parallel Projection」というタイトルで、背景が黒色の3Dビューアウィンドウが開きます。描画されるTFT構造は平行投影で表示されるため、遠近感がなくなります。ウィンドウサイズは10x8インチ (1200x960ピクセル) に設定されます。