javascript - WebGL,gl 矩阵。如何从相机 View 和投影矩阵中获取平截头体顶点?

标签 javascript 3d webgl perspectivecamera 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 点到视口(viewport)的 2D 点的映射。
视锥体(截棱锥)中的眼空间坐标映射到立方体(归一化设备坐标)。
在规范化设备空间中,视体积的 Angular 点是立方体的 Angular 点,左、下、近为 (-1, -1, -1) ,右、上、远为 (1, 1, 1) .

要获得 View 空间中的点,归一化设备空间中的点必须通过逆投影矩阵进行变换,然后是 Perspective divide。 .
通过逆 View 矩阵,可以将视点空间中的一个点转换为世界空间中的一个点。

逆矩阵可以通过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);

关于javascript - WebGL,gl 矩阵。如何从相机 View 和投影矩阵中获取平截头体顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55445612/

相关文章:

glsl - 在顶点着色器中应用 Y 旋转时纹理坐标发生偏移

java - 使用 XML-RPC、javascript、php 进行实时页面更新

javascript - 在父网页的 iframe 中运行 JavaScript

matlab - 如何在 matlab 中为曲面赋值?

java - 如何走楼梯和斜坡?

javascript - Webgl 向量数组

javascript - Ext.Button 处理程序配置选项

javascript - 在 Wordpress 站点中进行 AJAX 调用时出现问题

c++ - 如何使用扩展的球形扇形(圆锥)来迭代坐标球?

compression - DXT 压缩产生与原始 PNG 相同的文件大小