座標変換

OpenGLを少し勉強して、座標変換の基礎がやっと分かった。OpenGLでは行列の状態などのデータを自分で管理せずにOpneGLの内部の変数を利用して管理する。staticなデータ、つまり行列を保持する「スタック」で変換の行列を管理している。現在操作対象の行列はスタックのトップということになる。また、スタックも投影行列スタックとモデルビュー行列スタックの2つがある。


行列の積の順番は、スタックのトップの行列に右側から掛け算する順番で行われる。例えば、モデル変換では、Global座標系で考えた場合、変換行列(Translate、Rotate、Scalingの3種類がある)の掛け算を呼び出す順番と逆順に変換されていく。逆に、Local座標系で考えた場合、行列の掛け算を呼び出す順番で変換されていく。GlobalとLocalの区別は関数や処理のレベルでは特になく、自分がどう見るかによって決まる。但し、Local座標系で考える場合、座標軸の向きが動的に変化するので、当然変換する場合の値がGlobalとLocalでは違ってくるが、そこが注意点でもある。


また、複数のオブジェクトの相対位置を考える場合は、あるオブジェクトのLocal座標系の状態をスタック上にコピーしておき、不要なものをpopすることにより復元できるようにしておく。


結局、このスタックの行列の状態変化をプログラムを作る側が頭の中で意識しておかないといけないのが難しい。まだ分かっていないが、スタックの状態をdump(デバッグ用に表示)するやり方があるのだろうか?一度処理をパターン化(関数化)しておけば良いのかもしれないが。そこら辺をどう作りこむかもまだ分かってない。実際作ってみて覚えていくしかないのか…。