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

时间:2019-03-31 21:28:13

标签: javascript 3d webgl gl-matrix

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

我有一个用于3d引擎中相机的viewprojection矩阵。 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个摄影机视锥顶点,以在阴影贴图的边框中使用。

1 个答案:

答案 0 :(得分:1)

在透视投影中,投影矩阵描述了从针孔相机看到的世界3D点到视口的2D点的映射。
摄像机视锥中的眼睛空间坐标(截断的金字塔)映射到立方体(规范化的设备坐标)。
在规范化的设备空间中,视图体积的拐角点是一个立方体的拐角,其左,下,近(-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);
相关问题