我正在制作一个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
答案 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]
并没有任何意义,只会将你的近处和远处的飞机移动到其他地方。