WebGL,gl 矩阵。如何从相机视图和投影矩阵中获取平截头体顶点?
WebGL, gl-matrix. How to get frustrum vertices from camera view and projection matrices?
我正在使用 gl-matrix 库。对于线性代数计算
我有一个 view
和 projection
矩阵,用于 3d 引擎中的相机。 view
是一个观察矩阵。
const view = mat4.lookAt(
[],
camera.eye,
camera.target,
camera.up
);
const projection = mat4.perspective(
[],
Math.PI / 4,
viewport.width / viewport.height,
0.1,
1000.0
);
我想从此相机设置中获取 8 个相机平截头体顶点,以在阴影贴图的边界框中使用。
在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。
相机平截头体(截棱锥)中的眼睛 space 坐标映射到立方体(归一化设备坐标)。
在规范化设备 space 中,视体积的角点是立方体的角点,左、下、近处为 (-1, -1, -1) ,右、上、远为 (1, 1, 1).
为了得到视图space中的点,归一化设备space中的点必须通过逆投影矩阵进行变换,然后是Perspective divide。
一个视角 space 可以通过逆视角矩阵转换为世界 space 中的一个点。
可以通过mat4.invert计算出逆矩阵。将一个点从标准化设备 space 转换为世界 space 的代码可能如下:
inv_view = mat4.invert([], view);
inv_proj = mat4.invert([], projection);
ndc_corner = vec4.set([], -1, -1, -1, 1); // (-1, -1, -1) left, bottom, near
view_corner_h = vec4.transformMat4([], ndc_corner, inv_proj);
view_corner = vec4.scale([], view_corner_h, 1/view_corner_h[3]);
world_corner = vec4.transformMat4([], view_corner, inv_view);
我正在使用 gl-matrix 库。对于线性代数计算
我有一个 view
和 projection
矩阵,用于 3d 引擎中的相机。 view
是一个观察矩阵。
const view = mat4.lookAt(
[],
camera.eye,
camera.target,
camera.up
);
const projection = mat4.perspective(
[],
Math.PI / 4,
viewport.width / viewport.height,
0.1,
1000.0
);
我想从此相机设置中获取 8 个相机平截头体顶点,以在阴影贴图的边界框中使用。
在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。
相机平截头体(截棱锥)中的眼睛 space 坐标映射到立方体(归一化设备坐标)。
在规范化设备 space 中,视体积的角点是立方体的角点,左、下、近处为 (-1, -1, -1) ,右、上、远为 (1, 1, 1).
为了得到视图space中的点,归一化设备space中的点必须通过逆投影矩阵进行变换,然后是Perspective divide。
一个视角 space 可以通过逆视角矩阵转换为世界 space 中的一个点。
可以通过mat4.invert计算出逆矩阵。将一个点从标准化设备 space 转换为世界 space 的代码可能如下:
inv_view = mat4.invert([], view);
inv_proj = mat4.invert([], projection);
ndc_corner = vec4.set([], -1, -1, -1, 1); // (-1, -1, -1) left, bottom, near
view_corner_h = vec4.transformMat4([], ndc_corner, inv_proj);
view_corner = vec4.scale([], view_corner_h, 1/view_corner_h[3]);
world_corner = vec4.transformMat4([], view_corner, inv_view);