3DCG

Python3で「OpenGL」を学ぶ 「PyOpenGL」PyCG lesson4 球面投影

lesson4を学んだ。順にそれぞれ自分の理解をメモしながらまとめる。

球面投影

プラネタリウムのようなドームシアターのスクリーンは平面ではなく、球体のような面になっている。(通常、スクリーンに正しい映像を映し出すために、特殊なプロジェクタが使用される。)このような球面に対して、普通のプロジェクタを使って投影した場合にどうなるかをシミュレーションする。

どのように画像を取得するか?

簡易カメラ・プロジェクタモデル

シンプルに実装するために、単純な数学モデルを使用する。このモデルでは、光学中心と像面の2つを用意し、光学中心は像面の中心の真上に存在しする(光学中心から像面までの距離を焦点距離と呼ぶ)。像面上では、OpenGLテクスチャの座標系と同一の座標系を仮定する。

レイトレーシング

フォトリアリスティックなレンダリングの手法。レイトレーシングの改良版を使うことで、球面上の投影を計算することができる。詳細は、元記事のCompute the image by ray tracingの項を参照。

OpenGL の実装

全体の処理はシェーダに実装できるため、GPUハードウェアでアクセラレーションできる。フラグメントの位置を決定するために、フラグメントシェーダはgl_FragCoordというパラメータを受け取る。これはフラグメントのウィンドウ座標。

デモ

コードはGitHubを参照。

  • “W, A, S, D” と、マウスを使ってシーンを移動する
  • “ESC” を押下で、終了
  • “o” を押下で、カメラとプロジェクタを切り替える
  • “p “を押下で、スクリーンショットを撮る