OpenGL透视投影:如何定义左右

OpenGL Perspective Projection: How to define left and right

如何设置透视矩阵的坐标,如左、右、上、下的正交投影,并添加 fov 和纵横比。我只看到透视矩阵在没有左、右、下、上的方法中使用其他参数。这是我的邻位矩阵:

public static Matrix4f Orthographic(float left, float right, float bottom, float top, float near, float far) {
        Matrix4f result = Identity();

        result.elements[0 + 0 * 4] = 2.0f / (right - left);

        result.elements[1 + 1 * 4] = 2.0f / (top - bottom);

        result.elements[2 + 2 * 4] = 2.0f / (near - far);

        result.elements[0 + 3 * 4] = (left + right) / (left - right);
        result.elements[1 + 3 * 4] = (bottom + top) / (bottom - top);
        result.elements[2 + 3 * 4] = (far + near) / (far - near);

        return result;
    }

现在我想创建一个具有相同参数但添加 fov 的透视图。

在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。
相机视锥体(截棱锥)中的眼睛 space 坐标映射到立方体(归一化设备坐标)。

透视投影的 Viewing frustum 可以定义为 6 个距离。

在下面的距离leftrightbottomtop中,是从视图中心到截锥体侧面的距离,在近平面上。 nearfar 指定到平截头体近平面和远平面的距离。

r = right, l = left, b = bottom, t = top, n = near, f = far

x:    2*n/(r-l)      0              0                0
y:    0              2*n/(t-b)      0                0
z:    (r+l)/(r-l)    (t+b)/(t-b)    -(f+n)/(f-n)    -1
t:    0              0              -2*f*n/(f-n)     0

如果投影是对称的,其中视线是视锥体的对称轴,那么矩阵可以简化,可以用视场角(fov_y)指定,一个纵横比 (w / h) 和到近平面和远平面的 2 个距离

a  = w / h
ta = tan( fov_y / 2 );

2 * n / (r-l) = 1 / (ta * a)
2 * n / (t-b) = 1 / ta
(r+l)/(r-l)   = 0
(t+b)/(t-b)   = 0

所以对称透视投影为:

x:    1/(ta*a)  0      0              0
y:    0         1/ta   0              0
z:    0         0     -(f+n)/(f-n)   -1
t:    0         0     -2*f*n/(f-n)    0