我一直在努力使用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 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
是投影矩阵和模型 View 矩阵的乘积。看:
注意:如果矩阵分量未归一化,并且您需要使用Hessian法线形式平面,则需要归一化所得平面。
关于math - 提取视锥面(Gribb和Hartmann方法),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12836967/