カメヲラボ

主にプログラミングとお勉強全般について書いてます

Stereo Graphics Programming(5)

正しい投影変換

OpenGLで3Dプログラミングをする場合、gluPerspective, gluLookAtという関数を使うと、視点とビューボリュームの設定が簡単にできる。SGLライブラリを使ったサンプルプログラム実行すると、内部的にはこれらの関数を使って右目、左目の位置に視点を移動しているだけのように見える。これだとあまり精度が良くないので、奥行き情報も加えて何等かの補正を加えているのではないかと思われる。この方法はhttp://astronomy.swin.edu.au/~pbourke/stereographics/stereorender/によればtoe-in法と呼ばれ精度の悪い*1投影方法とされている。SGLを使って作成したStereo映像では、画面中央部は問題無いように見えるが中央部から遠ざかるほど不自然さが目立つ。


上記URLで示されているように、立体視を行う場合は、正しい方法とされているoff-axis法使うべきなのだが、SGLライブラリではその指定ができない。SPLというライブラリの方には、SPLCameraという構造体があり、そのなかにFrustum[2]という配列が含まれている。SPLContextを作成する際、オプションとしてSPL_ASYMMETRIC_FRUSTUM*2というカメラタイプがあるし、SPLのAPIにも、SPLCalcCameraというものがあるので「おおお!」と思って使ってみたが正しく計算されていない。しかもこのSPLというライブラリは、描画処理に関してはノータッチなので利用する価値が全然無いのだ。


そんなわけで、Stereo Graphicsの精度を上げようと思えば、glFrustum関数(gluPerspective関数の内部で呼ばれている関数)を使い投影変換の設定を左目・右目別々行う必要がある。しかし、そんなものはhttp://astronomy.swin.edu.au/~pbourke/opengl/stereogl/にもサンプルがあることだし、それほど大変な作業ではないのだ。


しかし、SGLライブラリがよろしくないのはそれだけではない。


つづく

*1:というか、Incorrectとハッキリ書いてある^^;

*2:左右非対称なビューボリュームを作るでーというオプションのハズ