6

投影行列から左、右、下、上、近距離、遠距離の境界値を取得するのを手伝ってくれる人はいますか44?

4

3 に答える 3

10

以下は、クリスチャン・ラウが参照し た方程式系の解像度です。

正射行列の場合:

near   =  (1+m34)/m33;
far    = -(1-m34)/m33;
bottom =  (1-m24)/m22;
top    = -(1+m24)/m22;
left   = -(1+m14)/m11;
right  =  (1-m14)/m11;

透視行列の場合:

near   = m34/(m33-1);
far    = m34/(m33+1);
bottom = near * (m23-1)/m22;
top    = near * (m23+1)/m22;
left   = near * (m13-1)/m11;
right  = near * (m13+1)/m11;

値 m11、m12 などを、glOrthoおよびglFrustumのドキュメントで定義されている式で置き換えて、それが正しいことを確認できます。

于 2012-10-17T03:26:57.350 に答える
3

glOrthoまず、対応するand glFrustum(またはフレームワークの同様の関数) の呼び出しに対してこれらの行列がどのように定義されているかを確認できます。次のステップは、投影の種類によって異なります。正投影 (例: からglOrtho) または遠近法 (例: または からglFrustum)gluPerspectiveであり、3 番目の列を見て決定できます。

正射行列の場合、次の 2 つの方程式を簡単に得ることができます。

right - left = 2 / m11
right + left = -2 * m14 / m11

これらから非常に簡単にright = (1-m14) / m11とを計算できleft = right - 2/m11ます (私の暗算中にエラーが発生したかどうかを再確認してください)。他の 2 組のパラメーターについても同様です ( の記号に注意してくださいm33)。

透視投影では、最初に と を計算nearfarて使用する必要がm33ありm34ます。right/left次に、上記のケースとbottom/top同様に計算できますが、計算されたnear値を使用します。

つまり、パラメータに基づいて行列の公式がわかれば、簡単に解くことができる単純な 2x2 方程式系にたどり着きます。もっと興味深い質問は、実際に射影行列からこれらのパラメーターを計算する必要がある理由です。それらが本当に必要な場合は、それらを保存する必要があります(とにかく、マトリックスを構築するのはあなたです)。それ以外の場合は、単純な描画 API であるため、実際に意図されているよりも多くのこと (シーン管理など) に OpenGL を使用する別のインスタンスのように思えます。

于 2012-05-31T15:22:46.010 に答える