Skip to main content

Posts

Showing posts with the label OpenGL

How to get the camera parameters from OpenGL perspective/modelview matrix? (2)

モデルビュー行列からカメラのパラメータを計算する. modelview matrix は model に作用する matrix も含んでいるので,シーンがスケール,移動,回転されていたりするとその効果が含まれている.これをmatrixの情報のみを使って分離する方法はない.そこで,ここではシーンに対するtransformation matrix は Identity matrix, つまり全てはカメラの効果としてカメラのパラメータを抽出する.もし,シーンに対する効果が分離されているようなレンダラと OpenGL レンダラを併用する場合には,この transformationmatrix を undo する必要がある. modelview matrix は以下のような成分になっている.この成分の詳しいことに関しては私の以前の blog( http://shitohichiumaya.blogspot.de/2011/01/what-matrix-glulookat-generates-1.html )を参照のこと. \begin{eqnarray*}  \left[   \begin{array}{cccc}    x_x & y_x & z_x & 0 \\    x_y & y_y & z_y & 0 \\    x_z & y_z & z_z & 0 \\    -(\vec{x} \cdot \vec{e}) &     -(\vec{y} \cdot \vec{e}) &     -(\vec{z} \cdot \vec{e}) & 1 \\   \end{array}  \right] \end{eqnarray*} 4行を \(a,b,c\)で置きかえるとこの行列は以下のように書ける. \begin{eqnarray*}  \left[   \begin{array}{cccc}    x_x & y_x & ...

How to get the camera parameters from OpenGL perspective/modelview matrix? (1)

Abstract この話はコンピュータグラフィクスとプログラミングの話である.以前 gluLookat 関数の作る Matrix に関して書いた( http://shitohichiumaya.blogspot.de/2011/01/what-matrix-glulookat-generates-1.html ).この記事を書いた動機はOpenGLとは独立したレンダラ(ray tracer など)を書いており,しかし OpenGL と画像をoverlay したいということがあったからである.そういう意味では特殊な話であるがこの記事は意外に参照されている.今回,我々の顧客が特殊なシステムを利用していて,この逆演算をする必要がでてきた.つまり OpenGL のProjection/Modelview matrix からカメラのパラメータを知りたいという要求である.これについてここに書いておく. はじめに 世の中にはいろいろな可視化システムがあるもので,可視化システムのカメラのパラメータが不明,つまりカメラがどこにあるのかわからない,というものがあるようだ.話を聞くと実は OpenGL に依存した大規模なシステムで,あるソフトウェアのレイヤーではカメラのパラメータがわからないという状況のようだ.しかし,OpenGL を使っているので,projection matrix と model view matrix にはアクセスできるということである.そこでこれらの matrix からカメラのパラメータを抽出する方法というものを尋ねられた. これはちょっと特殊な状況であると思うが,OpenGL の Projection/Modelviewmatrix が与えられた場合に,カメラのパラメータを抽出するにはどうするかというパズルとして考えれば面白いかもしれないと思い,ここに blog として記す. パースペクティブ行列からカメラのパラメータを計算する. まずは Perspective matrix に関連したパラメータを取りだそう. gluPerspective 関数は以下のような関数である.詳しくは OpenGL の manual を参照のこと. void gluPerspective(GLdouble fovyd,  GLdouble a...