投影行列から左、右、下、上、近距離、遠距離の境界値を取得するのを手伝ってくれる人はいますか44?
3 に答える
以下は、クリスチャン・ラウが参照し た方程式系の解像度です。
正射行列の場合:
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のドキュメントで定義されている式で置き換えて、それが正しいことを確認できます。
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
)。
透視投影では、最初に と を計算near
しfar
て使用する必要がm33
ありm34
ます。right/left
次に、上記のケースとbottom/top
同様に計算できますが、計算されたnear
値を使用します。
つまり、パラメータに基づいて行列の公式がわかれば、簡単に解くことができる単純な 2x2 方程式系にたどり着きます。もっと興味深い質問は、実際に射影行列からこれらのパラメーターを計算する必要がある理由です。それらが本当に必要な場合は、それらを保存する必要があります(とにかく、マトリックスを構築するのはあなたです)。それ以外の場合は、単純な描画 API であるため、実際に意図されているよりも多くのこと (シーン管理など) に OpenGL を使用する別のインスタンスのように思えます。