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 个距离。
在下面的距离left
、right
、bottom
和top
中,是从视图中心到截锥体侧面的距离,在近平面上。 near
和 far
指定到平截头体近平面和远平面的距离。
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
如何设置透视矩阵的坐标,如左、右、上、下的正交投影,并添加 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 个距离。
在下面的距离left
、right
、bottom
和top
中,是从视图中心到截锥体侧面的距离,在近平面上。 near
和 far
指定到平截头体近平面和远平面的距离。
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