提取视锥体平面(Gribb & Hartmann 方法) [英] Extracting View Frustum Planes (Gribb & Hartmann method)
问题描述
我一直在努力解决 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.
见:
- https://fgiesen.wordpress.com/2012/08/31/frustum-planes-from-the-projection-matrix/
- http://www8.cs.umu.se/kurser/5DV051/HT12/lab/plane_extraction.pdf
注意:如果矩阵分量没有标准化并且您需要一个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屋!