fc2ブログ

gluLookAt

OpenGLのgluLookAt関数は、視野を定義する完璧な関数です。知る人はもう少ないと思いますが、前身のIrisGLでもlookatという同様の関数があったものの、仕様上、真上(と真下)が向けないという大きな欠陥がありました(何故って、y軸をup vectorとしていたので)。gluLookAtはその欠陥を除去し、どのような視野でも定義できるようになったのです。素晴らしい!

でもgluなので、所詮はユティリティなんですね。何故か?他の関数を使ってもできるので、本質的なものとは見なされていない、ということですね。

さて、gluLookAtでどのような行列が生成されるかを調べるのは、ベクトル計算の良い練習問題になります。回転成分の導出は外積をうまく使えばできます。間違いやすいのが実は平行移動成分。gluLookAtの最初の引数eye(実際には3つですが、ベクトルで書きます)を負にして、そのまま平行移動成分としがちですが、それは違います。最初の操作が平行移動ですので(先ずeyeを原点に移動)、最終的には、平行移動成分に後段の回転がかかる。勘違いしやすいところです。

一応、式を書いておきます。eyeに続く引数は、centerupですので、

vzeyecenter --- (1)
vxup × vz --- (2)
vyvz × vx --- (3)

とすると、回転成分R(3x3行列)は、

R = (vx, vy, vz)T --- (4)

と書けます。但し、vxvyvzは正規化されているとします。そして、平行移動成分tは、

t = -Reye --- (5)

と書けます。

ところで、私の今のお気に入り、"Advanced Graphics Programming Using OpenGL(2005)"にもAppendix B.3(pp.608-609)に、gluLookAtの行列表現が載っているのですが、何と、上記で私が指摘した平行移動に関する間違いを犯している!え、まさか、という訳で、何度も見てみましたが、やはり間違いだよな~弘法も筆の誤りとはこのこと?
スポンサーサイト



コメントの投稿

Secret

とても分かりやすいです

gluLookAtについての説明、とても分かりやすかったです。
以前ビューフラスタムカリングの実装をしていたので、そのとき出会えていたら!と思いました。
ところで、
平行移動には回転がかかるというのは勘違いしやすい個所ですね。
以前OpenGLとは関係ないですが、似たような失敗をしました。

ありがとうございます。
この記事を書くきっかけですが、ある仕事で4x4行列からgluLookAtパラメタに変換する作業が発生しそうで、その方法をうまく社員に伝えようと、何となく"Advanced Graphics Programming..."をめくっていたところ、あれ、なんかおかしい!と思ったことでした。
プロフィール

加納裕(かのうゆたか)

Author:加納裕(かのうゆたか)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR