提取视锥体平面(Gribb & Hartmann 方法) [英] Extracting View Frustum Planes (Gribb & Hartmann method)

查看:20
本文介绍了提取视锥体平面(Gribb & Hartmann 方法)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在努力解决 Gribb/Hartmann 提取平截头体平面已经有一段时间了,但收效甚微.我想构建一个相机视锥体来剔除我的场景.

I have been grappling with the Gribb/Hartmann method of extracting the Frustum planes for some time now, with little success. I want to build a camera view-frustum to cull my scene.

我正在使用右手坐标系中的列主矩阵.(OpenGL 风格 - 我使用 C# 和 Playstation Mobile,但数学应该是一样的)

I am working with column-major matrices in a right-handed coordinate system. (OpenGL style - I'm using C# and Playstation Mobile, but the math should be the same)

我想在世界空间中获得我的平面,所以我从视图投影矩阵(即投影矩阵 * 视图矩阵)构建了我的平截头体.视图矩阵是相机世界变换的逆矩阵.

I want to get my planes in World-Space, so I build my frustum from the View-Projection Matrix (that's projectionMatrix * viewMatrix). The view Matrix is the inverse of the camera's World-Transform.

问题是;无论我如何调整,我似乎都无法获得正确的截锥体.我想我可能遗漏了一些明显的东西.

The problem is; regardless of what I tweak, I can't seem to get a correct frustum. I think that I may be missing something obvious.

如果我扫射"我的相机向左或向右,同时仍然向下看 z 轴,我的平面的法线发生变化,因此它们始终指向场景的原点 - 这让我认为它们不在世界空间中......

If I "strafe" my camera left or right while still looking down the z-axis, the normals of my planes change so that they are always pointing at the origin of the scene - which makes me think that they are not in world-space...

推荐答案

可以使用 Gribb/Hartmann 方法从投影矩阵中提取平面,如下所示,(主要列):

The planes from a projection matrix can be extracted using the Gribb/Hartmann method as follows, (column major):

void extract_planes_from_projmat(
        const float mat[4][4],
        float left[4], float right[4], float top[4], float bottom[4],
        float near[4], float far[4])
{   
    for (int i = 4; i--; ) left[i]      = mat[i][3] + mat[i][0];
    for (int i = 4; i--; ) right[i]     = mat[i][3] - mat[i][0]; 
    for (int i = 4; i--; ) bottom[i]    = mat[i][3] + mat[i][1];
    for (int i = 4; i--; ) top[i]       = mat[i][3] - mat[i][1];
    for (int i = 4; i--; ) near[i]      = mat[i][3] + mat[i][2];
    for (int i = 4; i--; ) far[i]       = mat[i][3] - mat[i][2];
}

其中 mat4 是投影矩阵和模型视图矩阵的乘积.

Where mat4 is the product of the projection matrix and the model-view matrix.

见:

注意:如果矩阵分量没有标准化并且您需要一个Hessian Normal Form平面,那么您将需要对结果平面进行标准化.

Note: if the matrix components aren't normalized and you require a Hessian Normal Form plane, then you will need to normalize the resulting planes.

这篇关于提取视锥体平面(Gribb & Hartmann 方法)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆