OpenGLにおいて、視点を設定する為によくgluLookAt()関数が用いられます。ですがモデルビュー行列をアプリケーション内部で持つ為、同様の計算をしてみます。
OpenGLはかなり低レベルな3D描画ライブラリで、各種変換行列を変化させてポリゴンを出力するのが基本です。例えば射影行列(Projection)やモデルビュー行列(Model-View)などです。
ですが、それではあまりに面倒だという事で、GLU内にはヘルパー関数が用意されています。例えばgluPerspective()関数は射影行列を設定する事で透視図法を実現します。
同様にgluLookAt()関数はモデルビュー行列に「カメラ」のような設定をする事が出来ます。具体的には引数に1.視点位置ベクトル、2.対象位置ベクトル、3.「上」を示す方向ベクトルを与える事でモデルビュー行列を設定します。
一般的にはこれらの関数をそのまま用いて問題ないのですが、4x4行列をアプリケーション自身で管理したいときには厄介になります。射影行列やモデルビュー行列はOpenGL内部で管理されるため直接各要素にアクセスする事ができない為です。glGetFloatvでモデルビュー行列の中身を取得する事も出来ますが、どうにも二度手間な気もするので、gluLookAtを自前で計算してみます。
はじめにgluLookAtをglLoadMatrixで置き換えてみる - 三次元日誌を参考に実装したのですが、当環境ではどうやらカメラのX、Y方向の移動が考慮されないようでしたので、独自に改良してみました。
先述ページでは視点位置ベクトルをpos、対象位置ベクトルをtarget、方向ベクトルをdirとして、
と置き、
としています。こうすると先述の通りうまくいかなかったため、変更した結果、
としました。ただし、数学的根拠がある訳ではなく経験的です。GLUの仕様の方も調べましたが、どのような行列にするかという定義が無いようでした。どなたか詳しい方がおりましたらご指摘いただければ幸いです。
カテゴリ
トラックバック
このブログ記事を参照しているブログ一覧: OpenGLのカメラ位置行列の計算
このブログ記事に対するトラックバックURL: http://www.memorize-being.net/x/mt-engine/mt-tb.cgi/49


コメントする