我一直在努力使用the Gribb/Hartmann method of extracting the Frustum planes,但收效甚微。我想建立一个镜头视锥,以消隐我的场景。
我正在使用右手坐标系中的主要列矩阵。 (OpenGL样式-我使用的是C#和Playstation Mobile,但数学方法应该相同)
我想让飞机进入世界空间,所以我从“ View -投影矩阵”(即projectionMatrix * viewMatrix)构建了平截头体。矩阵 View 是摄影机的世界变换的逆矩阵。
问题是;无论我进行什么调整,我似乎都无法获得正确的视锥。我认为我可能缺少明显的东西。
如果我仍在俯视Z轴时左右“扫视”相机,则我的飞机的法线会发生变化,以使它们始终指向场景的原点-这使我认为它们不在世界空间中...

最佳答案

可以使用Gribb/Hartmann方法提取投影矩阵中的平面,如下所示(主列):

void extract_planes_from_projmat(
        const float mat[4][4],
        float left[4], float right[4], float top[4], float bottom[4],
        float near[4], float far[4])
{
    for (int i = 4; i--; ) left[i]      = mat[i][3] + mat[i][0];
    for (int i = 4; i--; ) right[i]     = mat[i][3] - mat[i][0];
    for (int i = 4; i--; ) bottom[i]    = mat[i][3] + mat[i][1];
    for (int i = 4; i--; ) top[i]       = mat[i][3] - mat[i][1];
    for (int i = 4; i--; ) near[i]      = mat[i][3] + mat[i][2];
    for (int i = 4; i--; ) far[i]       = mat[i][3] - mat[i][2];
}
其中mat4是投影矩阵和模型 View 矩阵的乘积。
看:
  • https://fgiesen.wordpress.com/2012/08/31/frustum-planes-from-the-projection-matrix/
  • http://www8.cs.umu.se/kurser/5DV051/HT12/lab/plane_extraction.pdf

  • 注意:如果矩阵分量未归一化,并且您需要使用Hessian法线形式平面,则需要归一化所得平面。

    关于math - 提取视锥面(Gribb和Hartmann方法),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12836967/

    10-10 09:04