在Matrix4 :: Perspective中反转Z轴

时间:2017-01-20 22:20:07

标签: c++ opengl matrix

我正在制作一个OpenGL应用程序,其中我有以下代码来设置透视矩阵。

Matrix4 Matrix4::Perspective(float pL, float pR, float pB, float pT, float pN, float pF) {
    Matrix4 matrix;
    matrix[0] = 2 * pN / (pR - pL);
    matrix[5] = 2 * pN / (pT - pB);
    matrix[8] = (pR + pL) / (pR - pL);
    matrix[9] = (pT + pB) / (pT - pB);
    matrix[10] = -(pF + pN) / (pF - pN);
    matrix[11] = -1;
    matrix[14] = -(2 * pF * pN) / (pF - pN);
    matrix[15] = 0;
    return matrix;
}

当我操纵物体的平移时,-Z向前移动,+ Z向后移动。

我接近通过将矩阵[11]和矩阵[14]切换到:

来获得此行为
matrix[11] = 1;
matrix[14] = (2 * pF * pN) / (pN - pF);

但是网状物变得轻微变形。 (在更复杂的网格上可能会发生巨大的变形。)

我如何操纵此方法以获得所需的结果(反转z轴)?

pF = zFar pN = zNear

1 个答案:

答案 0 :(得分:3)

从概念上讲,在应用投影之前,您想要反转 z ,这将具有将投影从-z镜像到z的效果。所以你在概念上要做的就是计算P * Scale(1,1,-1) = P * diag(1,1,-1,1)。如果你进行数学计算,你会发现这只会导致否定投影矩阵的第三个,所以正确的矩阵将是:

matrix[0] = 2 * pN / (pR - pL);
matrix[5] = 2 * pN / (pT - pB);
matrix[8] = -(pR + pL) / (pR - pL);
matrix[9] = -(pT + pB) / (pT - pB);
matrix[10] = (pF + pN) / (pF - pN);
matrix[11] = 1;
matrix[14] = -(2 * pF * pN) / (pF - pN);
matrix[15] = 0;

像你所做的那样否定matrix[14]并没有任何意义,只会将你的近处和远处的飞机移动到其他地方。