关于视图矩阵和视锥剔除

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

我试图确定对象(球体)是否位于视锥中。我的策略是首先获取视图矩阵:

glm::lookAt(cameraPosition, lookAtPosition, cameraUp);

cameraPosition是摄像机的位置,lookAtPositioncameraPosition + cameraDirection计算,cameraUp几乎是不言自明的。

[获得视图矩阵后,我在相机视图中计算了视锥的8个顶点,然后将视图矩阵的逆值乘以每个点以获得它们在世界空间中的坐标。

使用世界空间中的这8个点,我可以使用叉积构造6个平面(这样它们的法线将指向内部)。然后,我将对象向量的点积(通过减去该平面上任意点的对象位置得到向量)与每个平面的法向向量相乘,如果所有6均为正,我知道它在视锥内部。

所以我的问题是:

  • 相机视图是否始终设置为(0,0,0)并正向z方向看?
  • 视图矩阵将世界视图转换为相机视图,如果我使用逆矩阵将相机视图转换为相机视图,是否正确?

我的平截头体与我的cameraDirection相反,它使屏幕上看不到任何东西(但它仍然在相机的背面绘制东西)。

c++ opengl glm-math frustum
1个回答
1
投票

相机视图是否始终设置为(0,0,0)并正向z方向看?

视图空间是定义场景外观的空间。“看到”(投影到视口上)是哪一部分取决于投影矩阵。通常(在OpenGL中)原点为(0,0,0),并且视图空间z轴指向视口之外。但是投影矩阵会使* z反转轴。它从视图空间的Right-handed系统转向规范化设备空间的左手系统。

将相机视图转换为世界视图的逆过程

视图矩阵从世界空间转换为视图空间。投影矩阵将视图空间的Cartesian coordinates转换为剪辑的Homogeneous coordinates。通过将xyz分量除以w分量(Perspective divide),将剪贴空间坐标转换为规范化的设备空间。

归一化设备空间是一个最小(-1,-1,-1)和最大(1、1、1)的立方体。因此,多维数据集的8个角点是标准化设备空间中视图体积的角。

(-1, -1, -1) ( 1,  -1, -1) ( 1,  1, -1) (-1,  1, -1) // near plane
(-1, -1,  1) ( 1,  -1,  1) ( 1,  1,  1) (-1,  1,  1) // far plane

如果要将点从规范化的设备空间转换为视图空间,则必须:

  • 通过逆投影矩阵变换
  • 通过逆视图矩阵变换
  • 将结果的[[xyz
  • 分量除以其w分量]glm::mat4 view; // view matrix glm::mat4 projetion; // projection matrix glm::vec3 p_ndc; // a point in normalized device space
glm::mat4 inv_projetion = glm::inverse( projetion );
glm::mat4 inv_view      = glm::inverse( view );

glm::vec4 pth = inv_view * inv_projetion * glm::vec4( p_ndc, 1.0f );

glm::vec3 pt_world = glm::vec3( pth ) / pth.w;
© www.soinside.com 2019 - 2024. All rights reserved.