math - 提取视锥体平面(Gribb 和 Hartmann 方法)

标签 math 3d frustum culling occlusion-culling

我一直在努力解决the Gribb/Hartmann method of extracting the Frustum planes已经有一段时间了,但收效甚微。我想构建一个相机视锥体来剔除我的场景。

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

我想在世界空间中获得我的飞机,所以我从 View 投影矩阵(即projectionMatrix * viewMatrix)构建我的平截头体。 View 矩阵是相机世界变换的逆矩阵。

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

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

最佳答案

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

void extract_planes_from_projmat(
        const float mat[4][4],
        float left[4], float right[4],
        float bottom[4], float top[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 是投影矩阵和模型 View 矩阵的乘积。

参见:

注意:如果矩阵分量未标准化,并且您需要一个 Hessian 范式 平面,那么您需要对生成的平面进行标准化。

关于math - 提取视锥体平面(Gribb 和 Hartmann 方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12836967/

相关文章:

c++ - 截锥体和球体相交

math - 距近平面给定距离处的截锥体的宽度

Java 百分比计算未处理,我不明白为什么

math - 围绕一个点旋转 Vector2

python - 在 3D 绘图中显示真彩色 2D RGB 纹理?

c# - 切片 3D 模型?

python - 用python画地形?

java - 如何使用 sin/cos 创建修改后的椭圆路径

python-2.7 - 使用python查找数据框中序列重复的次数

javascript - 如何计算在给定坐标处相机可见的矩形的大小?