Gen III HMDS(ヘルメット・マウンテッド・ディスプレイ・システム) の視界とターゲット追尾を体験できるシミュレータープログラムです。
Pythonの標準ライブラリ(tkinter と math)のみを使用し、MVC(Model-View-Controller)に近いオブジェクト指向設計で綺麗に整理されています。
- 全体像とアーキテクチャの解説コードは役割ごとに5つのブロックに分かれています。
ブロッククラス名役割・機能1. 設定・定数HMDConfig画面サイズ、カラーパレット(HUDの緑、地上/空中ターゲットの色など)、描画倍率の管理 - データモデルTarget敵目標(戦車や航空機)の位置(Yaw/Pitch)、距離、移動速度などのデータ保持3. 数理演算AvionicsMathパイロットの頭部運動(Pitch/Roll/Yaw)に応じた 3D→2Dスクリーン投影座標変換
- 描画・ビューHMDRendererCanvasへの暗視ビジョン(NVG)、地平線(姿勢指示器)、照準・ターゲット枠の描画
- コントローラーHMDSimulatorAppGUI(スライダー)の構築、メインフレーム処理(約30FPSループ)の制御
注目すべきコア演算メカニズムこのシミュレーターの最も重要な部分は、パイロットが頭を動かしたときに 「目標がHMDの画面上のどこに見えるか」 を計算する数学的変換です(AvionicsMath.project_to_screen メソッド)。
2Dスクリーンへの投影手順相対角度の算出:目標の絶対角度からパイロットの頭の向きを引きます。$$\text{相対 Yaw} = \text{Target Yaw} - \text{Head Yaw}$$※normalize_angle で $-180^\circ \sim +180^\circ$ の範囲に正規化し、画面の不自然な飛びを防止。
ピクセル換算:DEG_TO_PX(1度あたり12px)を掛け合わせて距離に変換。Roll(傾き)回転の適用:パイロットが首をかしげた(Roll運動)場合、画面上の記号も回転させるため、2次元の回転行列を計算します。$$\begin{pmatrix} rx \ ry \end{pmatrix} = \begin{pmatrix} \cos(\theta) & -\sin(\theta) \ \sin(\theta) & \cos(\theta) \end{pmatrix} \begin{pmatrix} x \ y \end{pmatrix}$$画面中心(Center Offset)の加算:計算された座標をCanvasの中心(cx, cy)を基準として配置。3. 実装されているHMDの表示機能描画を担当する HMDRenderer には、実際のHMDに倣ったグラフィック演出が備わっています。
NVG(暗視ビザー)機能:draw_nvg_background で緑色の円を重なるように描き、暗視双眼鏡を覗いたような視界とサイン波による山並み(地形)を描画します。
姿勢指示器(Pitch Ladder):パイロットの頭のPitch(上下)とRoll(傾き)に合わせて傾く地平線およびピッチバー($+20^\circ \sim -20^\circ$)を描きます。ターゲットトラッキングシンボル:[GND] 地上目標(TANK): 赤色の正方形(□)で表示。
[AIR] 空中目標(AIRCRAFT): 黄色のひし形(◇)で表示。自律移動(update_position)します。ロックオン判定: 照準中心(レティクル)から一定距離(60px以内)に空中目標が入ると、シアン色(水色)に変化し、LOCK の文字が点滅アニメーションします。
FOV(視野)外指示(Cueing Indicator):目標が画面端の外に外れた場合、画面の端にマゼンタ色(ピンク)の丸を貼り付け(クランプ処理)、どこに敵がいるかインジケーターで指示します。4. プログラムの実行の流れHMDSimulatorApp がインスタンス化され、GUIウィンドウとピッチ/ロール/ヨー変更用スライダーを生成。初期ターゲット(戦車2機、航空機2機)が作成される。
_update_loop がスタート(root.after(33, ...) により約30FPSでタイマー実行)。毎フレームの処理:空中ターゲットの座標を更新(旋回)。Canvasを一度全消去(clear)。
暗視ビジョン、姿勢指示器、ターゲット(またはFOV外インジケーター)、照準レティクルを再描画。スライダーを動かすと、リアルタイムでパイロットの視点が変わり、それに応じて背景やターゲットのHUD記号がダイナミックに追従動作します。