提取视截面的方法
在Frustum Culling的计算中,我们需要提取出视截面。那如果计算视截面呢? 首先,我们需要了解平面的表示方法: 平面的数学表达式是:Ax+By+Cz+D=0; 若A,B,C组成的向量(A,B,C)等于平面的单位法向量,则|D|表示原点到此平面的距离。若D>0,则原点位于平面的正面(法向量所指的一面);若D<0,则原点位于平面的背面;若D=0,则平面经过原点。 这样,用一个四维向量可以很方便的表示一个平面:缩写记号<N,D>来表示满足方程NQ+D=0中点Q组成的平面。 接着,下面就是如何计算视截面,分以下两种情况: 1. 在已知视截体的焦距e,屏幕高宽比a,近视截面的距离n,远视截面的距离f的情况下,可以通过以下公式计算在摄象机空间所看到的平面向量: 平面 <N,D> 近 <0,0,-1,-n> 远 <0,0,1,f> 左 <e/sqrt(e*e+1),0, -1/sqrt(e*e+1), 0> 右 <-e/sqrt(e*e+1),0, -1/sqrt(e*e+1),0> 上 <0,-e/sqrt(e*e+a*a), -a/sqrt(e*e+a*a), 0> 下<0,e/sqrt(e*e+a*a), -a/sqrt(e*e+a*a),0> 这种情况适合于用glFrustum()来指定投影矩阵的情况。 2. 在其他的情况下,需要首先获得PROJECTION_MATRIX和MODELVIEW_MATRIX: float proj[16],modv[16]; glGetfloatv( GL_PROJECTION_MATRIX, proj ); glGetfloatv( GL_MODELVIEW_MATRIX, modv ); 在这种情况下又可以分为两种情况,第一种情况,MODELVIEW_MATRIX为单位矩阵: 设透视投影矩阵为M,则摄象机空间内的视截面为: 平面<N,D> 近M4+M3 远 M4-M3 左 M4+M1 右 M4-M1 上 M4+M2 下M4-M2 其中的Mi(1<=i<=4)表示矩阵M的第i行。 第二种情况,MODELVIEW_MATRIX不是单位矩阵: 若透视投影矩阵为P,MODELVIEW为M,组合矩阵MP代替上面六式中的M,得到的结果是在模型空间内的视截面。 参考文件: 1.《3D数学与计算机图形学中的数学方法》,Eric Lengyel著,清华大学出版社出版。 -----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------ 此文章为我原创作品,若要转载,请和本人联系,或注明出处。 欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。 我的联系方式: QQ: 7578420 Email: jerrydong@tom.com ----------------------------------------------------------------------------------------