WebGL, gl-matrix.如何从相机视图和投影矩阵中获取视锥顶点



我正在使用gl-matrix库。用于线性代数计算

我有一个viewprojection矩阵,用于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 点的映射。
相机视锥体(截断的金字塔(中的眼空间坐标映射到立方体(归一化设备坐标(。
在规范化设备空间中,视体积的角点是立方体的角,其左侧、底部、靠近 (-1, -1, -1( 和右侧、顶部、远 (1, 1, 1(。

要获取视图空间中的点,必须通过逆投影矩阵转换归一化设备空间中的点,然后进行透视划分。
视中点空间可以通过逆视图矩阵转换为世界空间中的点。

逆矩阵可以通过mat4.invert计算。将点从规范化设备空间转换为世界空间的代码可能如下所示:

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);

最新更新