繁体   English   中英

关于视图矩阵和截锥体剔除

[英]About view matrix and frustum culling

我试图确定 object(球体)是否在视锥体内。 我的策略是首先获取视图矩阵:

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

其中cameraPosition是相机的 position, lookAtPosition是通过cameraPosition + cameraDirection计算得出的,而cameraUp几乎是不言自明的。

得到视图矩阵后,我计算了相机视图中截锥体的 8 个顶点,然后将视图矩阵的倒数乘以每个点,得到它们在世界空间中的坐标。

使用世界空间中的这 8 个点,我可以使用叉积构造 6 个平面(因此它们的法线将指向内)。 然后我取 object 向量的点积(我通过减去 object position 与该平面上的任意点得到向量)与每个平面的法线向量都知道它在里面的所有平截头体6, .

所以我的问题是:

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

我的截锥体与我的cameraDirection相反,这导致屏幕上什么都看不到(但它仍然在我的相机背面绘制东西)。

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

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

它的倒数将相机视图转换为世界视图

是的。

视图矩阵从世界空间转换到视图空间。 投影矩阵将视图空间的笛卡尔坐标转换为剪辑空间的齐次坐标 通过将xyz分量除以w分量(透视除法),将剪辑空间坐标转换为标准化设备空间。

标准化设备空间是一个立方体,最小值为 (-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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM