🧊

OpenGLでNearFarに-1を掛ける理由について考察

2020/09/19に公開

プロジェクション行列を考えるにあたり、なぜかOpenGLはNearとFarに-1を掛けて計算するのにどうして??と疑問が湧いた。これらはOpenGLが右手系であることが主な理由だと思い、右手系と左手系を比較しながらかんたんに考察する。

考察なので本当にあっているかはわからない。もはやOpenGLは-1を掛けるとして覚えてもいいし、だいたいはMath系のライブラリ(glmなど)任せで計算するのだし。

まずは以下のような左手系の座標と右手系の座標をみる。手で示すと親指をx,人差し指をy,中指をzとするとz軸は左手系は奥に向かい、右手系は手前に向かうことがわかる

また、下の画像のようにz=2の座標にポリゴンがある状況を元に考察をすすめる

適当な正射影のビューをつくり、Near側から見た絵を考えると(下図)、右手系と左手系では同じ画像が出ないことがわかった。

なので、右手系側(OpenGL)のNearとFarを反転させるために-1を掛けたビュー空間内でプロジェクション行列を考えようということかなと理解した。反転させた空間をz軸に向かう方向に見れば左手系と見た目が一致する。

マルチプラットフォームであれば確かにどちらかに合わせる必要があるがglmはそういうライブラリではないが(OpenGL Mathematicsだし)、なぜかデフォルトで反転させている。これは考察だが、単純にXを右、Yを上とする(ViewPortでいうと左下が0)のに慣れてしまっているから?Yが下向き(もしくはXが左向き)で良ければそのままでも良さそうではある。

Discussion