将投影矩阵44分解为左,右,底,顶,近和远边界值

use*_*554 6 android opengl-es qcar-sdk

任何人都可以帮助我从投影矩阵44获得左,右,底,顶,近和远边界值?

wip*_*wip 9

以下是Christian Rau提到的等式系统的分辨率:

对于正交矩阵:

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

对于透视矩阵:

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;
Run Code Online (Sandbox Code Playgroud)

您可以通过glOrthoglFrustum文档中定义的公式替换值m11,m12等,以检查它是否正确.

  • 仅供参考这个答案是使用(1索引)行主矩阵坐标,OpenGL默认使用列主要.如果不转换坐标,`m34`将是一个常数值. (5认同)

Chr*_*ica 3

glOrtho首先,您可以查看如何为对和glFrustum(或框架中的类似函数)的相应调用定义这些矩阵。接下来的步骤取决于投影的类型,是正交(例如从glOrtho)还是透视(例如从glFrustumgluPerspective),这可以通过查看第三列来决定。

现在对于正交矩阵,很容易得到两个方程:

right - left = 2 / m11
right + left = -2 * m14 / m11
Run Code Online (Sandbox Code Playgroud)

从这些你可以很容易地计算right = (1-m14) / m11left = right - 2/m11(你可以重新检查我心算过程中犯的任何错误)。其他两对参数也类似(注意 的符号m33)。

对于透视投影,您应该首先计算nearfar使用m33m34。然后您可以计算right/leftbottom/top类似于上面的情况,但使用计算near值。

总而言之,一旦您了解了基于参数的矩阵公式,它实际上就归结为一堆易于求解的简单 2x2 方程组。一个更有趣的问题是,为什么您实际上需要从投影矩阵计算这些参数。如果你真的需要它们,你应该存储它们(因为你是构建矩阵的人,无论如何)。否则,这听起来像是使用 OpenGL 做更多事情(比如场景管理)的另一个实例,而不是它的实际用途,只是一个简单的绘图 API。