WebGL,gl-matrix。如何从摄像机视图和投影矩阵中获取截头顶点?

问题描述 投票:1回答:1

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

我有一个viewprojection矩阵,我在3D引擎中用于我的相机。 view是一个lookat矩阵。

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个相机平截头体顶点,以便在阴影贴图的边界框中使用。

javascript 3d webgl gl-matrix
1个回答
1
投票

在透视投影中,投影矩阵描述了从针孔相机到视口的2D点看世界中3D点的映射。 相机平截头体(截头金字塔)中的眼睛空间坐标被映射到立方体(标准化设备坐标)。 在规范化的设备空间中,视图体积的角点是立方体的角,左边,底部,靠近(-1,-1,-1),右边,顶部,远(1,1,1) 。

为了获得视图空间中的点,标准化设备空间中的点必须通过逆投影矩阵进行变换,然后是Perspective divide。 通过逆视图矩阵,可以将视图空间中的点变换为世界空间中的点。

逆矩阵可以由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);
© www.soinside.com 2019 - 2024. All rights reserved.